Ein Jahr ist vergangen, seitdem ich auf meinem Blog über das aufregende Thema “Raspberry Pi Pico & Ultraschall-Abstandswarner” geschrieben habe. Doch heute möchte ich einen Blick zurückwerfen und eine kleine Ergänzung zu diesem faszinierenden Projekt präsentieren, das durch einen inspirierenden Kommentar auf YouTube angeregt wurde.
In meinem früheren Beitrag haben wir bereits die Grundlagen erkundet, hier möchte ich nun speziell auf diesen Kommentar eingehen.
Es geht also um eine Schaltung am Raspberry Pi Pico / Pico W mit fünf Ultraschallsensoren, wo die Sensorwerte < 50 cm zu einem Ereignis führen sollen.
Ich habe derzeit nur vier Sensoren vom Typ HC-SR04 im Sortiment. Aber was mit vier Sensoren funktioniert, wird auch mit fünf oder mehr funktionieren!
Benötigte Ressourcen für dieses Projekt
Wenn du die Schaltung am Raspberry Pi Pico / Pico W nachbauen möchtest, dann benötigst du:
- einen Raspberry Pi Pico / Pico W,
- ein Micro-USB Datenkabel,
- vier Ultraschallsensoren vom Typ HC-SR04,
- vier Leuchtdioden, 5 mm,
- vier 220 Ohm Vorwiderstände,
- diverse Breadboardkabel,
- zwei 830 Pin Breadboard
Alternativer Mikrocontroller zum Raspberry Pi Pico
Du musst nicht zwingend einen originalen Raspberry Pi Pico für dieses Projekt verwenden. In meinem Fall nutze ich zum Beispiel den Sumolink Erhu RP2040, welcher dem Pi Pico in nichts nachsteht, aber etwas günstiger in der Anschaffung ist.
Aufbau der Schaltung – Raspberry Pi Pico mit Ultraschall-Sensoren
Der Aufbau der Schaltung auf Steckbretter erfolgt auf zwei 830 Pin Breadboards.
Hier nun die Tabelle mit den Anschlüssen der einzelnen Komponenten:
Komponente | Raspberry Pi Pico |
---|---|
HC-SR04 – #1 | |
VCC | 5V |
GND | GND |
Echo | GP3 |
Trigger | GP2 |
HC-SR04 – #2 | |
VCC | 5V |
GND | GND |
Echo | GP5 |
Trigger | GP4 |
HC-SR04 – #3 | |
VCC | 5V |
GND | GND |
Echo | GP7 |
Trigger | GP6 |
HC-SR04 – #4 | |
VCC | 5V |
GND | GND |
Echo | GP9 |
Trigger | GP8 |
LED #1 | |
Kathode | 220 Ohm Widerstand > GND |
Anode | GP16 |
LED #2 | |
Kathode | 220 Ohm Widerstand > GND |
Anode | GP17 |
LED #3 | |
Kathode | 220 Ohm Widerstand > GND |
Anode | GP18 |
LED #4 | |
Kathode | 220 Ohm Widerstand > GND |
Anode | GP19 |
0,92″ OLED Display | |
GND | GND |
VCC | 5V |
SCL | GP1 |
SDA | GP0 |
Du kannst natürlich auch mehrere kleine 170 Pin Breadboards verwenden und diese dann im Halbkreis aufbauen, um so 180° zu überwachen.
Programmieren in der Thonny IDE
Den Raspberry Pi Pico kannst du in der Thonny IDE einfach in Micropython programmieren. Dieses Tool kannst du dir unter https://thonny.org/ kostenfrei herunterladen.
Ich musste jedoch zuvor meinen Mikrocontroller für Micropython flashen. Wie du das machst, habe ich dir bereits im Beitrag Raspberry PI Pico #1 – Vorstellung erläutert.
Das Programm kannst du dir unter nachfolgenden Link herunterladen. Die Datei kannst du dann mit der Thonny IDE öffnen und als code.py auf dem Pi Pico speichern.
Hier nun der Code:
from machine import Pin, I2C from ssd1306 import SSD1306_I2C import time as time import utime i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000) oled = SSD1306_I2C(128, 64, i2c) ledPin1 = Pin(16, Pin.OUT) ledPin2 = Pin(17, Pin.OUT) ledPin3 = Pin(18, Pin.OUT) ledPin4 = Pin(20, Pin.OUT) sensor1Trigger = Pin(2, Pin.OUT) sensor1Echo = Pin(3, Pin.IN) sensor2Trigger = Pin(4, Pin.OUT) sensor2Echo = Pin(5, Pin.IN) sensor3Trigger = Pin(6, Pin.OUT) sensor3Echo = Pin(7, Pin.IN) sensor4Trigger = Pin(8, Pin.OUT) sensor4Echo = Pin(9, Pin.IN) sensor1Value = 12 sensor2Value = 12 sensor3Value = 12 sensor4Value = 12 sensorActiveDistance = 10 def setup(): ledPin1.off() ledPin2.off() ledPin3.off() ledPin4.off() def toggleLED(pin): pin.toggle() def formatValue(value): return str("{:4.2f}".format(value)+" cm") def updateDisplay(): global sensor1Value, sensor2Value, sensor3Value, sensor4Value oled.fill(0) oled.text("#1 "+formatValue(sensor1Value), 0, 0) oled.text("#2 "+formatValue(sensor2Value), 0, 15) oled.text("#3 "+formatValue(sensor3Value), 0, 30) oled.text("#4 "+formatValue(sensor4Value), 0, 45) oled.show() def readUltrasonicSensor(trigger, echo): trigger.low() utime.sleep_us(2) trigger.high() utime.sleep_us(5) trigger.low() signaloff = 0 while echo.value() == 0: signaloff = utime.ticks_us() signalon = 0 while echo.value() == 1: signalon = utime.ticks_us() timepassed = signalon - signaloff return (timepassed * 0.0343) / 2 def checkValueSetState(value, pin): if (value < sensorActiveDistance): pin.on() else: pin.off() def main(): global sensor1Value, sensor2Value, sensor3Value, sensor4Value while True: sensor1Value = readUltrasonicSensor(sensor1Trigger, sensor1Echo) sensor2Value = readUltrasonicSensor(sensor2Trigger, sensor2Echo) sensor3Value = readUltrasonicSensor(sensor3Trigger, sensor3Echo) sensor4Value = readUltrasonicSensor(sensor4Trigger, sensor4Echo) checkValueSetState(sensor1Value, ledPin1) checkValueSetState(sensor2Value, ledPin2) checkValueSetState(sensor3Value, ledPin3) checkValueSetState(sensor4Value, ledPin4) updateDisplay() time.sleep(0.5) setup() main()
Danke werde ich ausprobieren und eventuell erweitern. Mit Temperatur Sensor Luftdruck und Luftfeuchte.