Radar Ultradźwiękowy z ESP32

Typ_projektu
microPython
Zdjecie główne
Krótki opis projektu

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

Niezbędne elementy

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

Sprzęt:

Komputer z programem Thonny

Drukarka 3D (w przypadku użycia uchwytu na sensor własnego projektu)

Opis 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.

Zdjęcia
kod programu
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
Pliki_projektu
Schemat
Tagi
microPython SG90 HC-SR04 ESP32 OLEDI2C