Nr.11 Entfernung messen

Sketch Nr.10: Entfernung messen

Aufgabe: Mit den Ultraschallsensor HC-SR04 und einem Arduino Mikrocontroller soll eine Entfernung gemessen und mit dem „serial-monitor“ angezeigt werden.

Wie funktioniert der Ultraschallsensor? Der Sensor hat vier Anschlüsse.

a) 5V( ) b) GND (–) c) echo d) trigger

Die Anschlüsse 5V und GND verstehen sich von selbst, sie versorgen den Sensor mit Energie.

Der Pin „trigger“ bekommt vom Mikrocontroller-Board ein kurzes Signal (5V), wodurch eine Schallwelle vom Ultraschallsensor ausgelöst wird. Sobald die Schallwelle gegen eine Wand oder sonstigen Gegenstand stößt, wird sie reflektiert und kommt irgendwann auch wieder zum Ultraschallsensor zurück. Sobald der Sensor diese zurückgekehrte Schallwelle erkennt, sendet der Sensor auf dem „echo“ Pin ein 5V Signal an das Mikrocontroller-Board. Dieser misst dann lediglich die Zeit zwischen dem Aussenden und der Rückkehr der Schallwelle und rechnet diese Zeit dann in eine Entfernung um. Auf gehts!

Material: Mikrocontroller-Board / Kabel / Breadboard / Hc-SR04 Ultraschallsensor

int trigger=7;

int echo=6;

long dauer=0;

long entfernung=0;














void setup()

{
Serial.begin (9600);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}





void loop()
{

digitalWrite(trigger, LOW);

delay(5);

digitalWrite(trigger, HIGH);

delay(10);

digitalWrite(trigger, LOW);

dauer = pulseIn(echo, HIGH);

entfernung = (dauer/2) / 29.1;

if (entfernung >= 500 || entfernung <= 0)

{

Serial.println("Kein Messwert");

}

else

{

Serial.print(entfernung);

Serial.println(" cm");

}

delay(1000);

}

Das Wort trigger ist jetzt die Zahl 7.

Das Wort echo ist jetzt die Zahl 6.

Das Wort dauer ist jetzt eine Variable, unter der die Zeit gespeichert wird, die eine Schallwelle bis zur Reflektion und zurück benötigt. Startwert ist hier 0.

Das Wort „entfernung“ ist jetzt die variable, unter der die berechnete Entfernung gespeichert wird.

Info: Anstelle von „int“ steht hier vor den beiden Variablen „long“. Das hat den Vorteil, dass eine größere Zahl gespeichert werden kann. Nachteil: Die Variable benötigt mehr Platz im Speicher.

Setup

Serielle kommunikation starten, damit man sich später die Werte am serial monitor ansehen kann.

„trigger“ (Pin7) ist ein Ausgang.

„echo“ (Pin6) ist ein Eingang.

Der Loop Teil:

Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.

Dauer: 5 Millisekunden

Jetzt sendet man eine Ultraschallwelle los.

Dieser „Ton“ erklingt für 10 Millisekunden.

Dann wird der „Ton“ abgeschaltet.

Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Millisekunden, bis der Schall zum Ultraschallsensor zurückkehrt.

Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert teilt man noch durch 29.1 und erhält dann den Wert in Zentimetern, da der Schall in der Luft eine Geschwindigkeit von einem Zentimeter pro 29,1 Mikrosekunden hat.

Beispiel: Der Sensor misst eine Zeit von 2000 Mikrosekunden. Das sind dann 1000 Mikrosekunden pro Strecke. Nun teilt man 1000 durch 29.1 (Weil der Schall ja 1cm pro 29,1 Mikrosekunden zurücklegt) und erhält den Wert 34,3cm

Wenn die gemessene Entfernung über 500cm oder unter 0cm liegt,…

dann soll der serial monitor ausgeben „Kein Messwert“, weil Messwerte in diesen Bereichen falsch oder ungenau sind.

 Ansonsten…

…soll der Wert der Entfernung an den serial monitor hier ausgegeben werden.

Das delay von einer Sekunde sorgt in ca. jeder neuen Sekunde für einen neuen Messwert.

Erweiterung des Programms:

Wenn ein Abstand unter 80cm gemessen wird, soll ein Piezo-Lautsprecher piepsen.

int trigger=12;
int echo=13;
long dauer=0;
long entfernung=0;
int piezo=5;
void setup()

{

Serial.begin (9600);

pinMode(trigger, OUTPUT);

pinMode(echo, INPUT);

pinMode(piezo, OUTPUT);

}

void loop()

{

digitalWrite(trigger, LOW);

delay(5);

digitalWrite(trigger, HIGH);

delay(10);

digitalWrite(trigger, LOW);

dauer = pulseIn(echo, HIGH);

entfernung = (dauer/2) / 29.1;

if (entfernung >= 500 || entfernung <= 0)

{

Serial.println("Kein Messwert");

}

else

{

Serial.print(entfernung);

Serial.println(" cm");

}

if (entfernung <= 80)
{
digitalWrite(piezo,HIGH);
}

else
{
digitalWrite(piezo,LOW);
}

delay(1000);

}

Das Wort piezo ist jetzt die Zahl 5

Der Piezo-Lautsprecher an Pin5 soll ein Ausgang sein (Logisch, weil der ja vom Mikrokontroller-Board ja eine Spannung benötigt um zu piepsen.

Es wird eine weitere IF-Bedingung erstellt:

Wenn der Wert für die Entfernung unter oder gleich 80 ist, dann…

…fange an zu piepsen.

Und wenn das nicht so ist…

…dann sein leise.

 

Erweiterung: Rückfahrwarner

Mit diesem Code lässt sich ein Rückfahrwarner konstruieren. Am Pin12 wird zusätzlich zu dem bereits angeschlossenen Ultraschallsensor aus dem Sketch 10 („Entfernung messen“ eine LED angeschlossen.

Ein Bild folgt… kannst du den Rückfahrwarner trotzdem schon konstruieren?

int trigger=7;
int echo=6;
long dauer=0;
int LED=12;
long entfernung=0;

void setup()
{
Serial.begin (9600);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
pinMode(12, OUTPUT);
}

void loop()
{
digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH);
entfernung = (dauer/2) / 29.1;


if (entfernung >= 500 || entfernung <= 0)
{
Serial.println("Kein Messwert");
}

else
{
Serial.print(entfernung);
Serial.println(" cm");
}

if (entfernung <= 40)
{
digitalWrite(LED, HIGH);
delay(entfernung*3);
digitalWrite(LED, LOW);
delay(entfernung*3);
}
}

 

Schreibe einen Kommentar