В предыдущих статьях на нашем сайте, посвященных основам работы с платой Raspberry Pi Pico, мы рассмотрели ее настройку для работы с языком MicroPython и подключение к ней OLED дисплея. В этой же статье мы рассмотрим подключение к плате Raspberry Pi Pico ультразвукового датчика, измеряемое с помощью данного датчика расстояние будет отображаться на экране OLED дисплея. Программа для платы Raspberry Pi Pico будет написана на языке MicroPython.
Также на нашем сайте вы можете посмотреть статьи про подключение ультразвукового датчика к микроконтроллеру AVR, платам Arduino и Raspberry Pi.
Необходимые компоненты
- Плата Raspberry Pi Pico (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 с диагональю 1.3 дюйма и интерфейсом I2C (купить на AliExpress).
- Ультразвуковой датчик HC-SR04 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Принципы работы ультразвукового датчика HC-SR04
Внешний вид ультразвукового датчика HC-SR04 показан на следующем рисунке. На левом рисунке показана фронтальная сторона датчика, на которой размещены два датчика, а на рисунке справа показана тыльная сторона ультразвукового датчика.
Один датчик используется для излучения в окружающее пространство ультразвуковой волны с частотой 40 кГц, а другой принимает отраженную от препятствия ультразвуковую волну. У ультразвукового датчика есть контакты Vcc и GND, которые используются для подачи на него питания, и контакты Trigger и Echo, используемые непосредственно для измерения расстояния.
Временные диаграммы работы ультразвукового датчика показаны на рисунке ниже. Для запуска датчика в работу необходимо подать на его контакт Trigger напряжение высокого уровня HIGH(5V) на время не менее 10 микросекунд. Это приведет к излучению датчиком в окружающее пространство 8 ультразвуковых импульсов, следующих с частотой 40 кГц.
Когда датчик примет эту отраженную от препятствия ультразвуковую волну, он установит на своем контакте Echo напряжение высокого уровня (5V) на время, пропорциональное расстоянию до препятствия. Далее мы просто измеряем длительность этого импульса на контакте Echo в микросекундах и производим пересчет данного времени в расстояние по известной формуле. Учитывая, что скорость звука в воздухе равна примерно 340 м/с получаем время 29.412 микросекунд на каждый сантиметр расстояния. Поэтому для определения расстояния мы используем следующую простую формулу:
Distance = (Time/2) / 29.412
Деление на 2 в этой формуле необходимо из-за того, что ультразвуковая волна дважды проходит измеряемое нами расстояние – до препятствия и обратно.
Схема проекта
Схема подключения ультразвукового датчика и OLED дисплея к Raspberry Pi Pico представлена на следующем рисунке.
Как видно из схемы, мы использовали контакт VBUS платы Raspberry Pi Pico для подачи питания на модуль ультразвукового датчика, а для подачи питания на модуль OLED дисплея мы использовали контакт 3.3V платы. Контакты trigger и echo подключены к контактам GPIO3 и GPIO2 платы соответственно. Контакты SDA и SCL модуля OLED подключены к контактам GPIO16 и GPIO17 платы. Контакты земли (Ground) ультразвукового датчика и OLED дисплея подключены к контакту Ground платы Raspberry Pi.
Полная схема соединений проекта представлена в следующей таблице.
Контакт ультразвукового датчика | Контакт платы Raspberry Pi Pico | Контакт OLED дисплея |
VCC | VBUS (PIN: 40) | — |
Echo | GPIO2 (PIN: 4) | — |
Trigger | GPIO3 (PIN: 5) | — |
GND | GND (PIN: 38) | GND |
— | 3.3v (PIN: 36) | VCC |
— | GPIO16 (PIN: 21) | SDA |
— | GPIO17 (PIN: 22) | SCL |
Далее рассмотрим программу для проекта.
Объяснение программы для Raspberry Pi Pico
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Для начала вам необходимо скачать коды программ по следующей ссылке с репозитория GitHub. В скачанной папке откройте каталог “T4_Interfacing_HC-SR04_Ultrasonic_sensor”. Этот каталог содержит 2 подкаталога – “codes” и “images”. В подкаталоге “codes” содержатся 2 файла программ на python – main.py и ssd1306.py.
Внутри файла main.py содержатся библиотеки machine.py и ssd1306.py. Библиотека machine.py – это встроенная в MicroPython библиотека для выполнения базовых операций при работе с интерфейсами I2C, ADC, SPI и т.д. Библиотека ssd1306.py используется для работы с OLED дисплеем. Более поробно работу про работу с данной библиотекой вы можете прочитать в статье про подключение OLED дисплея к плате Raspberry Pi Pico. Библиотека utime.py используется для организации временных задержек в программе.
1 2 3 |
from machine import Pin, I2C from ssd1306 import SSD1306_I2C import utime |
Переменные “trigger” и “echo” используются как объекты для работы с соответствующими функциями контактов. Контакт GPIO 3 платы, подключенный к trigger, конфигурируется для работы в качестве цифрового выхода (pin.OUT), а контакт GPIO 2 платы, подключенный к echo, конфигурируется для работы в качестве цифрового входа (Pin.IN).
1 2 |
trigger = Pin(3, Pin.OUT) echo = Pin(2, Pin.IN) |
Функция ultrasonic() используется для измерения расстояния до препятствия с помощью ультразвукового датчика. Внутри этой функции мы сначала подаем на контакт trigger уровень LOW на 2 мкс (чтобы «очистить» его), и затем подаем на контакт trigger уровень HIGH на 10 мкс. Затем мы снова подаем на него LOW. Затем мы вычисляем разницу между значениями, хранящимися в переменных signalon и signaloff, в результате чего мы вычисляем длительность импульса HIGH на контакте echo.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def ultrasonic(): timepassed=0 trigger.low() utime.sleep_us(2) trigger.high() utime.sleep_us(5) trigger.low() while echo.value() == 0: signaloff = utime.ticks_us() while echo.value() == 1: signalon = utime.ticks_us() timepassed = signalon - signaloff return timepassed |
Далее мы инициализируем связь по интерфейсу I2C и OLED дисплей.
1 2 3 4 5 6 |
WIDTH = 128 # oled display width HEIGHT = 64 # oled display height i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=200000) # Init I2C using pins GP8 & GP9 (default I2C0 pins) print("I2C Address : "+hex(i2c.scan()[0]).upper()) # Display device address print("I2C Configuration: "+str(i2c)) # Display I2C config oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # Init oled display |
Метод oled.fill(0) используется для очистки экрана OLED дисплея. Далее с помощью функции oled.text() мы выводим текст в нужном нам месте на дисплее. Окончательное отображение строк текста на экране дисплея происходит после вызова функции oled.show(). Далее с помощью функции utime.sleep(4) обеспечивается задержка на 4 секунды.
1 2 3 4 5 6 7 8 9 |
oled.fill(0) # Add some text oled.text("CIRCUIT DIGEST",5,8) oled.text("INTERFACING THE",5,30) oled.text("ULTRASONNIC",28,40) oled.text("SENSOR",50,50) # Finally update the oled display so the image & text is displayed oled.show() utime.sleep(4) |
Далее в цикле while происходит вызов запрограммированной нами функции ultrasonic() для определения расстояния до препятствия. Рассчитанное расстояние до препятствия сохраняется в переменной distance_cm. Функция round() используется для округления рассчитанного расстояния до двух знаков после запятой. Далее рассчитанное расстояние отображается на экране OLED дисплея с помощью функции oled.text().
1 2 3 4 5 6 7 8 9 |
while True: oled.fill(0) measured_time = ultrasonic() distance_cm = (measured_time * 0.0343) / 2 distance_cm = round(distance_cm,2) oled.text("ObjectDistance:",0,8) oled.text(">> "+str(distance_cm)+" cm",2,25) oled.show() utime.sleep(1) |
Для тестирования работы проекта откройте файлы “main.py” и “ssd1306.py” в Thonny IDE. Чтобы сохранить файл “ssd1306.py” на плату Raspberry Pi Pico нажмите комбинацию клавиш “ctrl+shift+s” на клавиатуре. Убедитесь в том, что ваша плата подключена в это время к компьютеру. При сохранении кода программы откроется всплывающее окно, показанное на рисунке ниже. В этом окне вам необходимо выбрать Raspberry Pi Pico, после этого сохранить код программы под именем «ssd1306.py». Аналогичную процедуру необходимо повторить и для файла “main.py”. После этого вы сможете запускать эти программы на плате всегда, когда на нее подано питание.
Исходный код программы на MicroPython
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
from machine import Pin, I2C from ssd1306 import SSD1306_I2C import utime trigger = Pin(3, Pin.OUT) echo = Pin(2, Pin.IN) def ultrasonnic(): timepassed=0 trigger.low() utime.sleep_us(2) trigger.high() utime.sleep_us(5) trigger.low() while echo.value() == 0: signaloff = utime.ticks_us() while echo.value() == 1: signalon = utime.ticks_us() timepassed = signalon - signaloff return timepassed WIDTH = 128 # oled display width HEIGHT = 64 # oled display height i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=200000) # Init I2C using pins GP8 & GP9 (default I2C0 pins) print("I2C Address : "+hex(i2c.scan()[0]).upper()) # отображение адреса устройства print("I2C Configuration: "+str(i2c)) # отображение конфигурации I2C oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # инициализация oled дисплея # Clear the oled display in case it has junk on it. (очищаем экран дисплея) oled.fill(0) # Add some text (выводим строки текста на экран дисплея) oled.text("CIRCUIT DIGEST",5,8) oled.text("INTERFACING THE",5,30) oled.text("ULTRASONNIC",28,40) oled.text("SENSOR",50,50) # Finally update the oled display so the image & text is displayed oled.show() utime.sleep(4) while True: oled.fill(0) measured_time = ultrasonnic() distance_cm = (measured_time * 0.0343) / 2 distance_cm = round(distance_cm,2) oled.text("<ObjectDistance>",0,8) oled.text(">> "+str(distance_cm)+" cm",2,25) oled.show() utime.sleep(1) |