Mit dem Arduino lässt sich die Entfernung zu anderen Objekten recht einfach messen: Neben dem Arduino braucht man dazu nur einen Ultraschallsensor wie zum Beispiel den recht günstigen Sensor “HC-SR04” (im 5er Set ca. 10 EUR bei Amazon). Dieser hat einen Sender und einen Empfänger: Über den Sender wird ein nicht hörbares Ultraschall-Signal abgegeben, das der Empfänger als Echo wieder auffängt, wenn es von anderen Objekten wie Wänden oder Hindernissen reflektiert wird.
Über den zeitlichen Abstand zwischen dem Aussenden und dem Empfangen des Signals lässt sich so die Distanz des Hindernisses berechnen: Mit dem Sensor lässt sich also auf 2-3 Zentimeter genau der Abstand zu anderen Objekten erkennen.
Abstand und Entfernung messen
Der HC-SR04 Sensor wird über den Arduino mit Strom versorgt (5V) und an zwei digitale Pins angeschlossen: Über den einen wird das Signal (“trigger”) gesendet, über den anderen die reflektierte Schallwelle (“echo”) empfangen. Mit einem kleinen Programm lässt sich das dann auswerten und die Entfernung anhand der Zeit berechnen.
Zur Demonstration nutzen wir zwei LEDs: Eine grüne, die leuchtet wenn der Abstand größer als 50cm ist und eine rote LED, die leuchtet wenn der Abstand geringer wird. Zusätzlich kann man sich die berechnete Entfernung auch über den Serial-Monitor in der Arduino-Software ausgeben lassen, was bei der Kontrolle und Fehlerfindung hilft.
Anschluss des HC-SR04 Sensors an den Arduino
Der HC-SR04 Ultraschall-Sensors hat vier Pins: VCC, GND, Echo und Trigger. VCC wird mit dem 5V Pin des Arduino verbunden, GND mit einem GND-Pin. Der Echo-Pin wird mit dem Pin D6 verbunden und der Trigger-Pin mit Pin D5.
Programm zum Messen von Abstand und Entfernung
Dieses Programm definiert zunächst die Pins und die Variablen für Entfernung und Dauer des Signals. Bei den Pins werden Pin Drei und Vier später für die LEDs benutzt, Pin Sechs und Sieben für das Senden und Empfangen des Ultraschall-Signals.
long dauer=0;
long entfernung=0;
int ledgruen=3;
int ledrot=4;
int trigger=5;
int echo=6;
void setup() {
Serial.begin (9600); // Monitor starten
pinMode(ledgruen, OUTPUT);
pinMode(ledrot, OUTPUT);
pinMode(trigger, OUTPUT); // Trigger (gelb)
pinMode(echo, INPUT); // Echo (grün)
}
void loop() {
digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH);
entfernung = (dauer/2) * 0.03432;
if (entfernung >= 1000 || entfernung < = 0) {
Serial.print("Ungenauer Wert: ");
Serial.print(entfernung);
Serial.println(" cm");
digitalWrite(ledgruen, LOW);
digitalWrite(ledrot, LOW);
delay(1000);
} else {
Serial.print(entfernung);
Serial.println(" cm");
if (entfernung > 50) {
digitalWrite(ledgruen, HIGH);
digitalWrite(ledrot, LOW);
delay(1000);
} else if (entfernung < 50) {
digitalWrite(ledgruen, LOW);
digitalWrite(ledrot, HIGH);
delay(500);
}
}
}
Im Hauptprogramm wird dann Zehn Millisekunden lang ein Signal über den trigger-Pin (5) gesendet und dann die verstrichene Zeit zwischen dem Senden und dem Empfangen mit dem Befehl pulseIn() abgefragt: Dieser zählt die Zeit in Millisekunden, bis der Echo-Pin ein "High"-Signal empfängt. Der Wert wird dann durch Zwei geteilt, da das Signal den doppelten Weg zurücklegen musste - vom Sender zum Hindernis und wieder zurück. Dieser Wert wird dann mit der Schallgeschwindigkeit in Zentimetern multipliziert. Am Ende enthält die Variable "entfernung" einen relativ genauen Wert, der den Abstand eines Objektes zum Sensor beschreibt.
Da es trotzdem manchmal zu Fehlinterpretationen kommen kann, wird zunächst geprüft, ob der Wert über 1000cm (10m) liegt: Hier arbeitet der Sensor längst nicht mehr genau genug, um eine Auswertung zu berechnen. Wenn nicht, wird geprüft ob der Wert größer als 50 ist: Bei einem Abstand von mehr als 50cm leuchtet dann die grüne LED. Beträgt der Abstand allerdings weniger als 50cm, soll die rote LED zur Warnung aufleuchten.