Raspberry Pi Pico с анемометром: измерение скорости ветра (Arduino IDE)

Узнайте, как подключить анемометр для измерения скорости ветра к Raspberry Pi Pico. Мы рассмотрим, как запитать и подключить датчик к Pico, а также напишем простой код для получения значений скорости ветра в различных единицах измерения. Плата Raspberry Pi Pico будет программироваться с помощью Arduino IDE.

Raspberry Pi Pico с датчиком ветра - Arduino IDE

В этом руководстве мы рассмотрим следующие темы:

Raspberry Pi Pico с Arduino IDE

Вам необходимо установить платы Raspberry Pi Pico в Arduino IDE, а также знать, как загружать код на плату. Если вы ещё этого не сделали, ознакомьтесь с нашим руководством:

Знакомство с анемометром

Анемометр – это устройство, позволяющее измерять скорость ветра. Он обычно используется в метеостанциях.

Использовать этот датчик довольно просто. Он выдаёт аналоговый сигнал, напряжение которого пропорционально скорости ветра. Мы используем анемометр с тремя чашками, как на фотографии ниже.

Датчик ветра - Анемометр

Технические характеристики анемометра

В зависимости от производителя, анемометр может иметь различные характеристики. Например, вот характеристики анемометра, используемого в данном руководстве:

  • Входное напряжение: 12-24В постоянного тока

  • Выходное напряжение: 0-5В

  • Диапазон измерения: 0-32,4 м/с

  • Разрешение: +/- 0,3 м/с

Это означает, что когда аналоговый сигнал равен 0, скорость ветра равна 0. Однако в моём случае, после подачи питания на датчик и применения делителя напряжения, я заметил, что когда анемометр не двигался, выходное напряжение составляло 0,033В, а не 0В.

Raspberry Pi Pico измерение напряжения датчика ветра при отсутствии ветра

Поэтому я считаю это минимальным значением, измеренным когда датчик не двигается. Рекомендую вам сделать то же самое и определить минимальное значение, считываемое с датчика, с помощью мультиметра.

Эти параметры могут отличаться в зависимости от производителя. Поэтому при преобразовании аналогового сигнала в скорость ветра необходимо это учитывать.

Распиновка анемометра

Анемометр поставляется с тремя проводами:

Синий провод

Сигнал

Чёрный провод

GND

Коричневый провод

Питание

Анемометр, распиновка датчика ветра

Подключение анемометра к Raspberry Pi Pico

Анемометр требует входное напряжение не менее 12В. Поэтому вы не можете запитать его напрямую от Raspberry Pi Pico – необходим внешний источник питания.

Блок питания 12В постоянного тока

Мы запитываем датчик с помощью блока питания 12В и подключаем его к анемометру через разъём питания. Вы можете использовать любой другой подходящий источник питания.

Адаптер разъёма питания постоянного тока

Преобразование сигнала данных с 5В в 3,3В

В случае моего датчика он работает в диапазоне от 0 до 5В. Однако :doc:`аналоговые выводы Raspberry Pi Pico </raspberry/pico/raspberry-pi-pico-analog-inputs-micropython/index>`_ могут считывать максимум 3,3В. Поэтому нам нужно преобразовать сигнал 5В в сигнал 3,3В. Для этого мы можем использовать делитель напряжения.

Примечание

Если вы используете анемометр, подобный тому, что предлагает Adafruit, вам не нужно об этом беспокоиться, поскольку максимальное выходное напряжение составляет 2В.

Делитель напряжения – это простая схема, которая уменьшает большое напряжение до меньшего. Используя 2 резистора и входное напряжение, мы можем создать выходное напряжение, которое является частью входного. Ниже вы можете увидеть формулу, которую необходимо использовать для расчёта резисторов, необходимых в вашей схеме:

Формула делителя напряжения

Если мы используем резистор 1 кОм (R1) и резистор 2 кОм (R2), мы получим максимальное выходное напряжение 3,3В, что является максимумом, который может считать Raspberry Pi Pico.

Итак, вот как выглядит схема делителя напряжения (где 5В – это максимальное значение вывода данных датчика):

Делитель напряжения с 5В до 3,3В

Вы можете использовать любую другую комбинацию резисторов, но необходимо учитывать максимальное выходное напряжение, допустимое используемой комбинацией резисторов.

Подключение схемы: Raspberry Pi Pico с анемометром

Схема подключения Raspberry Pi Pico с анемометром - датчиком ветра

Вот список компонентов, необходимых для этого руководства:

  • Raspberry Pi Pico

  • Анемометр – датчик скорости ветра

  • Блок питания 12В постоянного тока

  • Адаптер разъёма питания постоянного тока

  • Резистор 1 кОм и резистор 2 кОм

  • Макетная плата

  • Соединительные провода

  • Мультиметр

Вы можете использовать следующую схему в качестве справки для подключения датчика к плате. Не забудьте соединить выводы GND вместе.

Схема подключения Raspberry Pi Pico с анемометром - датчиком ветра

Мы подключаем вывод данных к GPIO 26 Raspberry Pi Pico. Также можно использовать GPIO 27 и GPIO 28.

Если вы используете анемометр, подобный тому, что предлагает Adafruit, который выдаёт максимум 2В, вы можете подключить выходной вывод непосредственно к аналоговому выводу Raspberry Pi Pico (делитель напряжения не нужен).

Чёрный провод

Положительный контакт (+) источника питания 12В

Синий провод

Подключить к аналоговому выводу Pico (через делитель напряжения, если необходимо), мы используем GPIO 26.

Коричневый провод

GND платы Pico и GND источника питания

Raspberry Pi Pico с анемометром – код Arduino для измерения скорости ветра

Следующий код считывает аналоговый сигнал с анемометра и преобразует его в скорость ветра.

Вы можете загрузить следующий код на ваш Raspberry Pi Pico. Возможно, вам потребуется изменить некоторые переменные в зависимости от параметров вашего анемометра.

/*********
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-anemometer-arduino/

  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/

// Константы (при необходимости измените следующие переменные)
const int anemometerPin = 26;  // GPIO пин, подключённый к анемометру (аналоговый пин)
const float minVoltage = 0.033;  // Напряжение, соответствующее 0 м/с
const float maxVoltage = 3.3;  // Напряжение, соответствующее 32,4 м/с (макс. скорость) (при использовании делителя напряжения)
const float maxWindSpeed = 32.4; // Максимальная скорость ветра в м/с

// Коэффициенты преобразования
const float mps_to_kmh = 3.6;   // 1 м/с = 3,6 км/ч
const float mps_to_mph = 2.23694; // 1 м/с = 2,23694 миль/ч

void setup() {
  Serial.begin(115200);
}

void loop() {
  // Считываем аналоговое значение с анемометра (значение АЦП от 0 до 4095 на RPi Pico для 0-3,3В)
  int adcValue = analogRead(anemometerPin);
  Serial.print(adcValue);

  // Преобразуем значение АЦП в напряжение (по умолчанию код устанавливает 10-битное разрешение: диапазон АЦП 0-1023 соответствует 0-3,3В)
  float voltage = (adcValue / 1023.00) * 3.3;

  // Убедимся, что напряжение находится в рабочем диапазоне анемометра
  if (voltage < minVoltage) {
    voltage = minVoltage;
  } else if (voltage > maxVoltage) {
    voltage = maxVoltage;
  }

  // Преобразуем напряжение в скорость ветра
  float windSpeed_mps = ((voltage - minVoltage) / (maxVoltage - minVoltage)) * maxWindSpeed;

  // Преобразуем скорость ветра в км/ч и мили/ч
  float windSpeed_kmh = windSpeed_mps * mps_to_kmh;
  float windSpeed_mph = windSpeed_mps * mps_to_mph;

  // Выводим скорость ветра
  Serial.print("Wind Speed: ");
  Serial.print(windSpeed_mps);
  Serial.print(" m/s, ");
  Serial.print(windSpeed_kmh);
  Serial.print(" km/h, ");
  Serial.print(windSpeed_mph);
  Serial.println(" mph");

  delay(1000);
}

Как работает код?

Сначала определяем пин, с которого считываем данные датчика, минимальное и максимальное выходное напряжение датчика, а также максимальную скорость ветра.

// Константы (при необходимости измените следующие переменные)
const int anemometerPin = 26;  // GPIO пин, подключённый к анемометру (аналоговый пин)
const float minVoltage = 0.033;  // Напряжение, соответствующее 0 м/с
const float maxVoltage = 3.3;  // Напряжение, соответствующее 32,4 м/с (макс. скорость) (при использовании делителя напряжения)
const float maxWindSpeed = 32.4; // Максимальная скорость ветра в м/с

Это параметры нашего датчика. Ваши могут отличаться. При использовании делителя напряжения максимальное напряжение, которое считает Raspberry Pi Pico, составляет 3,3В, что будет соответствовать максимальной скорости ветра. Когда датчик не двигается, он выдаёт напряжение 0,033В (считанное на выходе делителя напряжения), поэтому мы считаем это минимальным значением.

Далее у нас есть коэффициенты преобразования для перевода скорости ветра из м/с в км/ч и мили/ч.

// Коэффициенты преобразования
const float mps_to_kmh = 3.6;   // 1 м/с = 3,6 км/ч
const float mps_to_mph = 2.23694; // 1 м/с = 2,23694 миль/ч

В setup() инициализируем Serial Monitor.

void setup() {
  Serial.begin(115200);
}

В loop() мы получаем новые показания с датчика каждую секунду.

Сначала мы считываем значение на выводе АЦП и преобразуем его в значение напряжения. По умолчанию код устанавливает 10-битное разрешение для аналоговых сигналов, поэтому максимальное значение, которое Pico может считать на аналоговом выводе, равно 1023, что соответствует 3,3В. Таким образом, мы можем преобразовать значение в напряжение с помощью следующей строки:

float voltage = (adcValue / 1023) * 3.3;

Затем у нас есть следующее условие для проверки, находятся ли считанные значения в определённом диапазоне.

if (voltage < minVoltage) {
  voltage = minVoltage;
} else if (voltage > maxVoltage) {
  voltage = maxVoltage;
}

Далее мы можем легко преобразовать полученное напряжение в значение скорости ветра (в качестве альтернативы можно использовать функцию Arduino map()).

float windSpeed_mps = ((voltage - minVoltage) / (maxVoltage - minVoltage)) * maxWindSpeed;

Затем преобразуем полученные значения в км/ч и мили/ч.

// Преобразуем скорость ветра в км/ч и мили/ч
float windSpeed_kmh = windSpeed_mps * mps_to_kmh;
float windSpeed_mph = windSpeed_mps * mps_to_mph;

Наконец, выводим полученные результаты.

// Выводим скорость ветра
Serial.print("Wind Speed: ");
Serial.print(windSpeed_mps);
Serial.print(" m/s, ");
Serial.print(windSpeed_kmh);
Serial.print(" km/h, ");
Serial.print(windSpeed_mph);
Serial.println(" mph");

delay(1000);

Загрузка кода на Raspberry Pi Pico

Для загрузки кода на Raspberry Pi Pico плата должна находиться в режиме загрузчика (bootloader mode).

Если Raspberry Pi Pico в данный момент работает с прошивкой MicroPython, вам необходимо вручную перевести его в режим загрузчика. Для этого подключите Raspberry Pi Pico к компьютеру, одновременно удерживая кнопку BOOTSEL.

Raspberry Pi Pico в режиме загрузчика

Для последующих загрузок через Arduino IDE плата должна автоматически переходить в режим загрузчика без необходимости нажатия кнопки BOOTSEL.

Теперь выберите ваш COM-порт в меню Tools > Port. Возможно, COM-порт будет неактивен (серый). Если это так, не беспокойтесь – он автоматически найдёт порт, как только вы нажмёте кнопку загрузки.

Загрузите код.

Кнопка загрузки в Arduino IDE 2.0

Если вы не знаете, как загружать код на Raspberry Pi Pico с помощью Arduino IDE, ознакомьтесь с руководством: Программирование Raspberry Pi Pico с помощью Arduino IDE.

Демонстрация

После загрузки кода на плату вы можете выбрать последовательный порт в верхней части Arduino IDE и открыть Serial Monitor на скорости 115200 бод.

Вы должны получать данные датчика ветра в Serial Monitor каждую секунду.

Тестирование датчика ветра с Raspberry Pi Pico - демонстрация Serial Monitor

Заключение

В этом руководстве вы узнали, как подключить анемометр к Raspberry Pi Pico, запрограммированному с помощью Arduino IDE, для получения данных о скорости ветра.

Надеемся, что это руководство было для вас полезным. У нас есть руководства и для других популярных датчиков: