Mit dem Ultraschallsensor HC-SR04 wollte ich schon länger experimentieren und im Nachgang des Posts zum Arduino Uno R4 hatte ich dann eine Idee.
Material
- Arduino R4 Wifi
- vier Jumperkabel (rot, gelb, blau, schwarz)
- Ultraschallsensormodul HC-SR04, z.B. von AZDelivery
- Breadboard (half-size)
Ultraschall
Als Ultraschall werden Frequenzen zwischen 20kHz bis 1GHz bezeichnet, die oberhalb des vom Menschen wahrnehmbaren Frequenzspektrums liegen. Dank der hohen Frequenz eignet er sich gut für Abstandsmessungen im Kurzbereich.
Ultraschallsensor HC-SR04
Das Sensormodul besteht im Wesentlichen aus folgenden Komponenten, ein Transmitter, der den Schall aussendet und ein Receiver. der das Echo auffängt, sie sind auf der Platine mit T und R gekennzeichnet. Dazu kommen vier Stifte zum Anschluss an den Arduino.
Arbeitsweise
Etwas physikalische Grundlagen kann ich dir jetzt nicht ersparen. Das Signal, das der Transmitter aussendet wird von einem Objekt reflektiert und nach einer gewissen Zeit vom Receiver aufgefangen. Da die Schallgeschwindigkeit in der Luft mit 343,2 m/s relativ konstant ist, lässt sich auf diese Weise der Signalweg zurückrechnen und damit der Abstand des reflektierenden Objekts bestimmen. Da der ausgesendete Schallimpuls die Strecke zweimal durchläuft (Hin- und Rückweg), müssen wir die gemessene Zeit halbieren. Der Sensor arbeitet in Mikrosekundenintervallen, daher müssen wir die Schallgeschwindigkeit dahin runter-rechnen
343,2 m/s = 0,03432 cm/µs
Der Sensor schickt einen Impuls über den Transmitter los, sobald der Triggerpin von low auf high gezogen wird. Sobald das Echo im Receiver empfangen wird, wird der Echo Pin auf high gesetzt, was wir im Arduino abfragen können.
Hardware
Die Hardware wird vom Sensor zum Arduino folgendermaßen zusammengebaut:
rot: VCC -> +5V
gelb: Trigger/Tx -> GPIO Pin 9
blau: Echo/Rx -> GPIO Pin 8
schwarz: GND -> GND
Programmcode
Für den Ultraschallsensor HC-SR04 musst du keine spezielle Library in der Arduino IDE installieren.
In der loop()
senden wir regelmäßig einen Ultraschallimpuls aus, in dem wir den Trigger von LOW
auf HIGH
ziehen. Mit pulseIn()
warten wir dann, bis der Echo Pin auf HIGH
geht und bekommen dann die Signallaufzeit in Mikrosekunden zurückgeliefert. Mit der oben stehenden Formel können wir damit den Abstand des Objekts berechnen. Die Distanz geben wir dann in der seriellen Console aus.
So weit, so gut, allerdings hat mir das nicht gereicht. Da wir auf dem Uno R4 Wifi die LED Matrix zur Verfügung haben, dachte ich, ich visualisiere den Abstand durch die Höhe einer LED Spalte und gehe nach jeder Sekunde zur nächsten weiter. Da nach 12 Sekunden alle Spalten benutzt sind, sorgt scroll_matrix()
dafür, dass die ganze Matrix um eine Spalte nach links gescrollt wird. Die Anzahl der einzuschaltenden LED pro Spalte wird in calc_LED_Height()
berechnet.
#include "Arduino_LED_Matrix.h"
# define PIN_TRIGGER 9 // Pin 9: PIN_TRIGGER
# define PIN_ECHO 8 // Pin 8 Empfang
// LED-Matrix leer initialisieren
byte led_frame[8][12] = {0};
ArduinoLEDMatrix matrix;
int maxDistance = 20;
// Funktion, um die LED-Höhe basierend auf der gemessenen Entfernung zu berechnen
int calc_LED_Height(int distance) {
// Begrenze die Entfernung auf die maximale Entfernung
if (distance > maxDistance) {
distance = maxDistance;
}
// Berechne die Höhe der LEDs
int ledHeight = (distance * 8) / maxDistance;
return ledHeight;
}
void setup() {
pinMode(PIN_TRIGGER, OUTPUT);
pinMode(PIN_ECHO, INPUT);
Serial.begin(9600);
matrix.begin();
}
int count = 0; // Spaltenzähler in der LED-Matrix
// scroll the frame one column to the left
void scroll_matrix() {
for(int col=1; col < 12;col++) {
for(int row = 0;row <8;row++) {
led_frame[row][col-1] = led_frame[row][col];
}
}
}
// draw the LED frame
void draw_matrix(int leds, int count) {
if(count == 12) {
scroll_matrix();
}
for(int l =7;l >leds; l--) {
led_frame[l][count] = 1;
}
matrix.renderBitmap(led_frame, 8, 12);
}
void loop()
{
long distance = 0;
// Signalstörungen vermeiden, daher einmal kurz Trigger auf LOW
digitalWrite(PIN_TRIGGER, LOW);
delay(5);
// Signal PIN_TRIGGER
digitalWrite(PIN_TRIGGER, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIGGER, LOW);
// pulseIn -> Signallaufzeit messen
long Zeit = pulseIn(PIN_ECHO, HIGH);
// distance in cm berechnen
distance = (Zeit / 2) * 0.03432;
// distance anzeigen
Serial.print("distance in cm: ");
Serial.println(distance);
// Anzahl der LEDs in der Spalte berechnen
int leds = calc_LED_Height(distance);
// Matrix neu zeichnen
draw_matrix(leds,count);
delay(1000);
if( count < 12) { // maximal 12 Spalten, danach wird gescrollt.
count++;
}
}
Auf der LED Matrix erhältst du jetzt unterschiedlich hohe Balken, wenn du den Abstand eines Objekts vor dem Sensor veränderst.
Raspberry Pi
Die Sensorverschaltung benutzt nichts, was nicht auch beim Raspberry Pi vorhanden ist, so dass ein entsprechender Aufbau mit dem Raspi möglich sein sollte.