Ein Ultraschallsensor strahlt hochfrequente Schallimpulse aus. Treffen diese auf ein Objekt, werden sie reflektiert und gelangen als Echo zurück zum Sensor.
Aus der Zeitspanne zwischen dem Aussenden des Schallimpulses und dem Empfang des Echosignals kann die Entfernung zum Objekt bestimmt werden.
Wir verwenden das Ultraschallmodul HC-SR04. Es verfügt neben der Schaltelektronik über zwei identische piezo-elektrische Wandler, wobei der eine als Schallgeber (Sender) und der andere als Empfänger fungiert.
Das Modul kann über den Arduino mit Strom versorgt werden. Dazu verbindet man Vcc mit 5V, Gnd mit GND. Für die Zeitmessung müssen der Ausgang (Trig) und der Eingang (Echo) mit je einem digitalen Pin verbunden sein. Hier der Verdrahtungsplan:
Mit einer entsprechenden Programmierung kann der Arduino den zeitlichen Abstand zwischen dem gesendeten Ultraschallimpuls und dem empfangenen Echo messen und mit Hilfe der Schallgeschwindigkeit (343 m/s) die Entfernung zum Objekt berechnen.
Hier ein einfaches Programmierbeispiel, das die Laufzeiten des Ultraschallsignals misst und die Werte im seriellen Monitor (Aufrufen mit: Shift + Strg + M) ausgibt.
Das Programm ist auch geeignet als Funktionstest für den HC-SR04 (Näheres weiter unten).
#define trigPin 12
#define echoPin 11
#define led 13
void setup(){
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop(){
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration/2*34300/1000000; //Maßeinheiten: cm, µs
Serial.print("Distanz: ");
Serial.print(distance);
Serial.print("cm");
Serial.println();
Serial.print("Zeit: ");
Serial.print(duration);
Serial.print("us");
Serial.println();
delay(1000);
if(distance<12){
digitalWrite(led, LOW);
delay(200);
}
else{
digitalWrite(led, HIGH);
}
}
Erklärungen
Bei Raumtemperatur beträgt die Schallgeschwindigkeit in der Luft rund 343 m/s oder 0,0343 cm/µs.
Die Entfernung (s) entspricht der halben Zeitspanne (das Signal läuft hin und zurück) zwischen dem Aussenden des Schallimpulses und dem Empfang des Echos (t/2) multipliziert mit der Geschwindigkeit des Schalls in der Luft (c).
s = t/2 * c
Diese Beziehung findet sich auch in der Programmierung:
distance = duration/2*34300/1000000;
Die Schallgeschwindigkeit ist in Zentimeter pro Mikrosekunde (34300/1000000) angegeben. Die „12“ in der folgenden Programmzeile meint also12 cm.
if(distance<12){
Dementsprechend führt man für einen Funktionstest die Hand bis auf 12 cm oder dichter an den Ultraschallsensor heran und achtet darauf, ob die eingebaute LED neben Pin 13 (siehe Abbildung oben) erlischt. Zieht man die Hand zurück, muss die LED wieder aufleuchten.
Eine alltagstaugliche Anwendung wäre ein Entfernungsmessgerät, das etwa so aussehen könnte:
Was sich im Innern befindet, zeigt die folgende Abbildung:
Und hier das Programm mit Erklärungen:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2Clcd(0x27,16,2);
#define printByte(args) write(args);
uint8_t mu[8]={0,18,18,18,28,16,16,16};
#define trigPin 7
#define echoPin 8
void setup() {
pinMode(trigPin,OUTPUT);
pinMode(echoPin,INPUT);
lcd.begin();
lcd.backlight();
lcd.createChar(6, mu);
}
void loop(){
digitalWrite(trigPin, HIGH);
delayMicroseconds(2);
digitalWrite(trigPin, LOW);
long dauer, strecke;
dauer=pulseIn(echoPin,HIGH);
strecke=dauer/2*34300/1000000;
if (strecke>0)
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distanz:");
lcd.setCursor(9,0);
lcd.print(strecke);
lcd.setCursor(14,0);
lcd.print("cm");
lcd.setCursor(0,1);
lcd.print("Dauer:");
lcd.setCursor(9,1);
lcd.print(dauer);
lcd.setCursor(14,1);
lcd.printByte(6);
lcd.setCursor(15,1);
lcd.print("s");
delay(1000);
}
Zum Schluss die Bemaßung des Pappgehäuses. Die grau hinterlegten Kreise und das Rechteck stehen für die nötigen Aussparungen: Ultraschallsensoren, LCD-Display und Taster. Sie sind in der Größe den konkreten Teilen anzupassen.
Das Ultraschallmodul kann preisgünstig bei Funduino erworben werden.