Opis projektu:
Projekt radaru ultradźwiękowego z ESP32. Radar ten jest zdolny do pomiaru odległości i wyświetlania wyników na czytelnym i kompaktowym wyświetlaczu OLED.
Cel projektu:
Praktyczne zastosowanie zjawisk akustycznych w przyrodzie
Składniki projektu:
Płytka ESP32
Sensor Ultradźwiękowy HC-SR04
Wyświetlacz OLED z Komunikacją I2C
Serwonapęd SG90
Przewody męsko- męskie i męsko-żeńskie
Płytka stykowa
Sprzęt:
Komputer z programem Thonny
Drukarka 3D (w przypadku użycia uchwytu na sensor własnego projektu)
Ultradźwięki znajdują szerokie zastosowanie w technice pomiarowej. Sensory ultradźwiękowe działają na zasadzie pomiaru czasu, jaki upływa od wysłania sygnału ultradźwiękowego do momentu jego odbicia od przeszkody i powrotu z powrotem do sensora. Urządzenie przetwarza czas, jaki upłynął od wysłania sygnału do jego odbicia, na odległość.
W naszym układzie sensor przesyła dane do płytki ESP32, który zarządza pracą sensora oraz serwonapędu, który obraca sensorem tak, by ten mógł badać pole w zakresie 180 stopni. Choć nie jest to konieczne, zalecane jest użycie prostego uchwytu, dzięki któremu sensor zachowa stabilność podczas obrotu. Możliwości HC-SR04 pozwalają na przeprowadzenie jednego cyklu pomiarowego w ok. 15 sekund.
Wyniki pomiarów zostaną wyświetlone na wyświetlaczu OLED za pomocą interfejsu komunikacji I2C. Wyświetlacz przedstawia wolną przestrzeń, jaką ma przed sobą sensor.
Należy połączyć układ według schematu zamieszczonego pod kodem. Podłączamy płytkę, sensor i wyświetlacz i łączymy według schematu przy użyciu przewodów męsko męskich oraz męsko-żeńskich (zalecane przy sensorze, gdyż ten znajduje się w ciągłym ruchu). Po czym wgrywamy program na płytkę ESP32.
import machine
import time
from machine import Pin, I2C, PWM
import ssd1306
import math
# Inicjalizacja ekranu OLED
WIDTH = 128
HEIGHT = 64
i2c = I2C(-1, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(WIDTH,HEIGHT,i2c)
# Inicjalizacja serwomechanizmu SG90
sg90 = PWM(Pin(13, mode=Pin.OUT))
sg90.freq(50)
sg90.duty(20)
# Inicjalizacja czujnika odległości HCSR04
class HCSR04:
def __init__(self, trigger_pin, echo_pin, echo_timeout_us=500*2*30):
self.echo_timeout_us = echo_timeout_us
# Init trigger pin (out)
self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=None)
self.trigger.value(0)
# Init echo pin (in)
self.echo = Pin(echo_pin, mode=Pin.IN, pull=None)
def _send_pulse_and_wait(self):
self.trigger.value(0) # Stabilize the sensor
time.sleep_us(5)
self.trigger.value(1)
# Send a 10us pulse.
time.sleep_us(10)
self.trigger.value(0)
try:
pulse_time = machine.time_pulse_us(self.echo, 1, self.echo_timeout_us)
return pulse_time
except OSError as ex:
if ex.args[0] == 110: # 110 = ETIMEDOUT
raise OSError('Out of range')
raise ex
def distance_mm(self):
pulse_time = self._send_pulse_and_wait()
mm = pulse_time * 100 // 582
return mm
def distance_cm(self):
pulse_time = self._send_pulse_and_wait()
cms = (pulse_time / 2) / 29.1
return cms
sensor = HCSR04(trigger_pin=14, echo_pin=12, echo_timeout_us=10000)
while True:
for angle in range(20, 130, 5):
if angle == 20:
oled.fill(0)
sg90.duty(angle)
suma = 0
for i in range(10):
suma += sensor.distance_cm()
time.sleep(0.1)
suma = suma / 10
# Przekształć odległość na współrzędną na ekranie
angle_rad = math.radians(180-(18/11)*angle+20)
x = WIDTH // 2 + int(suma * math.cos(angle_rad))
y = 0 + int(suma * math.sin(angle_rad))
# Rysuj linię na ekranie w odpowiednim kolorze
if suma > 100:
oled.line(WIDTH // 2, 0, x, y, 1) # Rysuj linię białą
else:
oled.line(WIDTH // 2, 0, x, y, 2) # Rysuj linię czerwoną
oled.show() # Wyświetl obraz na ekranie
time.sleep(0.1) # Odczekaj krótką chwilę przed narysowaniem kolejnej linii