Raspberry Pi Pico: ультразвуковой датчик HC-SR04 (Arduino IDE)

Узнайте, как использовать ультразвуковой датчик HC-SR04 с Raspberry Pi Pico для измерения расстояния до объекта, программируя плату в Arduino IDE. В этом руководстве рассматривается подключение датчика к плате RPi Pico, простой пример скетча для вычисления расстояния до объекта, а также быстрый и простой проект по отображению расстояния на OLED-дисплее.

Raspberry Pi Pico: ультразвуковой датчик HC-SR04 (Arduino IDE)

Примечание

Впервые работаете с Raspberry Pi Pico? Начните знакомство с Raspberry Pi Pico здесь.

Raspberry Pi Pico с Arduino IDE

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

Знакомство с ультразвуковым датчиком HC-SR04

Ультразвуковой датчик HC-SR04 использует сонар для определения расстояния до объекта. Этот датчик измеряет расстояние от 2 см до 400 см (от 0,8 дюйма до 157 дюймов) с точностью 0,3 см (0,1 дюйма), что вполне достаточно для большинства любительских проектов. Кроме того, этот модуль поставляется с ультразвуковым передатчиком и приёмником.

На следующем изображении показан ультразвуковой датчик HC-SR04.

Ультразвуковой датчик HC-SR04 — вид спереди

На следующем изображении показана другая сторона датчика.

Ультразвуковой датчик HC-SR04 — вид сзади

Примечание

Хотите альтернативу ультразвуковому датчику HC-SR04? Ознакомьтесь с радарным датчиком приближения RCWL-0516:

Технические характеристики ультразвукового датчика HC-SR04

В следующей таблице приведены основные характеристики и спецификации ультразвукового датчика HC-SR04. Для получения дополнительной информации обратитесь к даташиту датчика.

Напряжение питания

5В DC

Рабочий ток

15 мА

Рабочая частота

40 кГц

Максимальная дальность

4 метра

Минимальная дальность

2 см

Угол измерения

15°

Разрешение

0,3 см

Входной сигнал триггера

TTL-импульс длительностью 10 мкс

Выходной сигнал Echo

TTL-импульс, пропорциональный расстоянию

Габариты

45 мм x 20 мм x 15 мм

Распиновка ультразвукового датчика HC-SR04

Вот распиновка ультразвукового датчика HC-SR04.

VCC

Питание датчика (5В)

Trig

Вход триггера (Trigger Input Pin)

Echo

Выход эхо-сигнала (Echo Output Pin)

GND

Общая земля

Как работает ультразвуковой датчик HC-SR04?

Ультразвуковой датчик использует сонар для определения расстояния до объекта. Вот как это работает:

  1. Ультразвуковой передатчик (вывод trig) излучает высокочастотный звук (40 кГц).

  2. Звук распространяется по воздуху. Если он встречает объект, то отражается обратно к модулю.

  3. Ультразвуковой приёмник (вывод echo) принимает отражённый звук (эхо).

Принцип работы ультразвукового датчика

Учитывая скорость звука в воздухе и время прохождения (время, прошедшее с момента передачи и приёма сигнала), мы можем вычислить расстояние до объекта. Вот формула:

расстояние до объекта = ((скорость звука в воздухе) * время) / 2
  • скорость звука в воздухе при 20°C (68°F) = 343 м/с

Необходимые компоненты

RPi Pico с ультразвуковым датчиком HC-SR04

Для выполнения этого руководства вам понадобятся следующие компоненты:

Схема подключения RPi Pico с ультразвуковым датчиком HC-SR04

Подключите ультразвуковой датчик HC-SR04 к плате RPi Pico, как показано на следующей схеме. Мы подключаем вывод Trig к GPIO 27, а вывод Echo к GPIO 28, но вы можете использовать любые другие подходящие выводы.

Raspberry Pi Pico с ультразвуковым датчиком — схема подключения

Ультразвуковой датчик

RPi Pico

VCC

VBus (5В)

Trig

GPIO 27

Echo

GPIO 28 последовательно с резистором 1 кОм

GND

GND

Примечание

Рекомендуем к прочтению: Raspberry Pi Pico и Pico W — Руководство по распиновке: описание GPIO.

Код — Получение расстояния до объекта с помощью HC-SR04 и RPi Pico

Следующий скетч — это простой пример того, как можно получить расстояние между датчиком и объектом, используя плату RPi Pico, запрограммированную с помощью ядра Arduino.

/*********
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-hc-sr04-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 trigPin = 27;
const int echoPin = 28;

//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701

long duration;
float distanceCm;
float distanceInch;

void setup() {
  Serial.begin(115200); // Starts the serial communication
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
}

void loop() {
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);

  // Calculate the distance
  distanceCm = duration * SOUND_SPEED/2;

  // Convert to inches
  distanceInch = distanceCm * CM_TO_INCH;

  // Prints the distance in the Serial Monitor
  Serial.print("Distance (cm): ");
  Serial.println(distanceCm);
  Serial.print("Distance (inch): ");
  Serial.println(distanceInch);

  delay(1000);
}

Исходный код

Загрузите код на плату, и он сразу заработает. Продолжайте чтение, если хотите узнать, как работает код, или перейдите к разделу демонстрации.

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

Сначала определяем выводы триггера и эхо.

const int trigPin = 27;
const int echoPin = 28;

В этом примере мы используем GPIO 27 и GPIO 28. Но вы можете использовать любые другие подходящие GPIO — читайте Raspberry Pi Pico и Pico W — Руководство по распиновке: описание GPIO.

Переменная SOUND_SPEED хранит скорость звука в воздухе при 20°C. Мы используем значение в см/мкс.

#define SOUND_SPEED 0.034

Переменная CM_TO_INCH позволяет нам преобразовать расстояние из сантиметров в дюймы.

#define CM_TO_INCH 0.393701

Затем инициализируем следующие переменные.

long duration;
float distanceCm;
float distanceInch;

Переменная duration хранит время прохождения ультразвуковых волн (время, прошедшее с момента передачи и приёма импульса). Переменные distanceCm и distanceInch, как следует из названий, хранят расстояние до объекта в сантиметрах и дюймах.

setup()

В функции setup() инициализируем последовательную связь на скорости 115200 бод, чтобы мы могли выводить измерения в монитор последовательного порта.

Serial.begin(115200); // Starts the serial communication

Определяем вывод триггера как OUTPUT — вывод триггера излучает ультразвук. И определяем вывод эхо как INPUT — вывод эхо принимает отражённую волну и отправляет на RPi Pico сигнал, пропорциональный времени прохождения.

pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input

loop()

В функции loop() следующие строки генерируют импульс HIGH длительностью 10 мкс на выводе триггера — это означает, что вывод излучит ультразвук. Обратите внимание, что перед отправкой импульса мы подаём короткий импульс LOW, чтобы гарантировать чистый импульс HIGH.

// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

Мы используем функцию pulseIn() для получения времени прохождения звуковой волны:

duration = pulseIn(echoPin, HIGH);

Функция pulseIn() считывает импульс HIGH или LOW на выводе. Она принимает в качестве аргументов вывод и состояние импульса (HIGH или LOW). Она возвращает длительность импульса в микросекундах. Длительность импульса соответствует времени, за которое звук прошёл до объекта, плюс время обратного пути.

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

distanceCm = duration * SOUND_SPEED/2;

Преобразуем расстояние в дюймы:

distanceInch = distanceCm * CM_TO_INCH;

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

Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);

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

Загрузите код на Raspberry Pi Pico.

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

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

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

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

Теперь откройте верхнее выпадающее меню и нажмите Select other board and port… (Выбрать другую плату и порт…).

Arduino IDE 2 — выбор другой платы и порта

Выберите модель Raspberry Pi Pico, которую вы используете.

COM-порт может не отображаться при первой загрузке, поэтому необходимо отметить опцию Show all ports (Показать все порты). Затем выберите COM-порт.

Arduino IDE 2 — выбор COM-порта для Raspberry Pi Pico

Теперь вы можете загрузить код.

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

Вы должны увидеть сообщение об успешной загрузке.

Успешная загрузка кода на Raspberry Pi Pico 2 в Arduino IDE

После загрузки кода откройте монитор последовательного порта на скорости 115200 бод.

Тестирование RPi Pico с ультразвуковым датчиком HC-SR04

Расстояние до ближайшего объекта будет выводиться в мониторе последовательного порта.

RPi Pico с ультразвуковым датчиком — показания в мониторе последовательного порта

Отображение расстояния (HC-SR04) на OLED-дисплее (RPi Pico с Arduino IDE)

Теперь, когда вы знаете, как получить расстояние до ближайшего объекта с помощью ультразвукового датчика HC-SR04, мы отобразим показания датчика на OLED-дисплее.

Raspberry Pi Pico с ультразвуковым датчиком — отображение расстояния на OLED-дисплее

Примечание

Рекомендуем к прочтению: Raspberry Pi Pico: OLED-дисплей SSD1306 (Arduino IDE).

Необходимые компоненты

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

Схема подключения

Добавьте I2C OLED-дисплей к предыдущей схеме. Мы подключаем SDA к GPIO 4, а SCL к GPIO 5. Вы можете следовать следующей схеме подключения:

Raspberry Pi Pico с ультразвуковым датчиком и OLED-дисплеем — схема подключения

Установка библиотеки SSD1306

В Arduino IDE перейдите в Sketch > Include Library > Manage Libraries (Скетч > Подключить библиотеку > Управление библиотеками).

Затем найдите Adafruit SSD1306 и установите библиотеку.

Установка библиотеки OLED-дисплея в Arduino IDE

Также установите все остальные необходимые зависимости.

Отображение расстояния на OLED-дисплее

Скопируйте следующий код в Arduino IDE. Этот код получает расстояние от датчика HC-SR04 до объекта и отображает результат на OLED-дисплее.

/*********
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-hc-sr04-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.
*********/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

const int trigPin = 27;
const int echoPin = 28;

//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701

long duration;
int distanceCm;
int distanceInch;

void setup() {
  Serial.begin(115200);
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(500);
  display.clearDisplay();

  display.setTextSize(2);
  display.setTextColor(WHITE);
}

void loop() {
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);

  // Calculate the distance
  distanceCm = duration * SOUND_SPEED/2;

  // Convert to inches
  distanceInch = distanceCm * CM_TO_INCH;

  // Prints the distance in the Serial Monitor
  Serial.print("Distance (cm): ");
  Serial.println(distanceCm);
  Serial.print("Distance (inch): ");
  Serial.println(distanceInch);

  display.clearDisplay();
  display.setCursor(0, 25);
  //Display distance in cm
  display.print(distanceCm);
  display.print(" cm");

  // Display distance in inches
  /* display.print(distanceInch);
  display.print(" in");*/
  display.display();

  delay(500);
}

Исходный код

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

Начнём с подключения необходимых библиотек для OLED-дисплея:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Определяем ширину и высоту OLED-дисплея. Мы используем OLED-дисплей 128x64:

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Создаём объект Adafruit_SSD1306 с именем display для управления OLED-дисплеем.

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);

Определяем выводы, к которым подключён датчик HC-SR04.

const int trigPin = 27;
const int echoPin = 28;

Создаём переменные для хранения расстояния и длительности между передачей и приёмом звуковых волн.

long duration;
int distanceCm;
int distanceInch;
setup()

В функции setup() инициализируем последовательную связь на скорости 115200 бод, чтобы мы могли выводить результаты в монитор последовательного порта.

Serial.begin(115200);

Определяем вывод триггера как OUTPUT, а вывод эхо как INPUT.

pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input

Инициализируем OLED-дисплей:

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
  Serial.println(F("SSD1306 allocation failed"));
  for(;;);
}

Устанавливаем размер и цвет шрифта для дисплея.

display.setTextSize(2);
display.setTextColor(WHITE);
loop()

В функции loop() мы получаем расстояние и отображаем его на OLED-дисплее.

Получаем расстояние (мы уже объясняли в предыдущем разделе, как вычисляется расстояние).

// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);

// Calculate the distance
distanceCm = duration * SOUND_SPEED/2;

// Convert to inches
distanceInch = distanceCm * CM_TO_INCH;

Выводим расстояние в монитор последовательного порта.

// Prints the distance on the Serial Monitor
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);

Очищаем дисплей в каждой итерации loop() для записи новых показаний.

display.clearDisplay();

Устанавливаем курсор дисплея в позицию (0, 25).

display.setCursor(0, 25);

Следующие строки выводят расстояние в сантиметрах на OLED-дисплей.

// Display static text
display.print(distanceCm);
display.print(" cm");

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

/* Display distance in inches
display.print(distanceInch);
display.print(" in");*/

Наконец, вызываем display.display(), чтобы фактически отобразить показания на OLED-дисплее.

display.display();

Расстояние обновляется каждые 500 миллисекунд.

delay(500);

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

Загрузите код на Raspberry Pi Pico.

Расстояние до ближайшего объекта будет отображаться на OLED-экране.

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

Заключение

Ультразвуковой датчик HC-SR04 позволяет определять расстояние до объекта. В этом руководстве вы узнали, как использовать HC-SR04 с RPi Pico. У нас есть руководства для других популярных датчиков с RPi Pico, использующих Arduino IDE, которые могут вас заинтересовать: