Hinderniserkennung mit Ultraschallsensor

So einfach die im letzten Post beschriebenen Fühler mit Tastern auch sind, haben sie doch den großen Nachteil, dass sie das Hindernis erst dann erkennen, wenn es schon gerammt wurde. Außerdem kann man nur erkennen, dass das Hindernis da ist, aber nicht, wie weit entfernt es noch ist.

Flexibler ist daher die Hinderniserkennung mit Ultraschall-Sensoren, bei denen das Echo von nicht hörbaren Ultraschall-Impulsen ausgewertet wird, so wie es auch Fledermäuse zur Hinderniserkennung machen. Nach Aussenden eines kurzen Tones von ungefähr 44000 Hz wird gemessen, wie lange es dauert, bis das Echo zurückkommt. Je kürzer dieser Zeitraum ist, desto näher ist das Hindernis. Auch wenn der Schall schon recht schnell ist, kann man seine Laufzeit mit elektronischen Mitteln relativ einfach messen, so dass diese Sensoren heutzutage nur ein paar Euro kosten. Auf Ebay findet man recht günstige Angebote.

Der Sensor wird am besten mit Heißkleber an seinen Anschlüssen auf einen Legostein geklebt, so dass er frei platzierbar ist. Wenn man die Anschlüsse ein paar Millimeter länger lässt, kann man den Sensor beliebig ausrichten, also nicht unbedingt nach vorne, sondern vielleicht leicht schräg auf eine Seite, so dass man den Roboter einer Wand folgen lassen kann.

Die Anschlüsse haben folgende Bedeutung:

rot: Spannungsversorgung; irgendwo in X stecken
blau: Triggersignal zum Starten der Messung; einstecken in H11
gelb: Mess-Signal, dessen Dauer die Laufzeit des Schalls angibt; H12
schwarz: Batterie Minus; irgendwo in Y einstecken

Im Programm kann eine Messung mit der Funktion AbstandCm() durchgeführt werden. Wie der Name schon sagt, liefert sie den gemessenen Abstand als ganze Zahl in Zentimetern. Allerdings kann es manchmal vorkommen, dass auch nach langer Zeit gar kein Echo empfangen wird, zum Beispiel weil das Hindernis zu weit weg oder eine Störung passiert ist. In diesem Fall wird 0 zurückgegeben.

Da die Messung je nach Abstand zum Hindernis durchaus einige Millisekunden dauern kann (über 200 wenn kein Echo zurückkommt!), lohnt es sich auf jeden Fall, den Messwert zunächst in eine Variable zu speichern, bevor er in if-Bedingungen ausgewertet wird. Dabei darf man nie vergessen, den Sonderfall 0 auszuschließen, um nur gültige Messungen zu betrachten:

. . .

uint distanz;

. . .


distanz = AbstandCm();
if ( ( distanz != 0 ) && ( distanz < 10 ) )
{
    // Hindernis in weniger als 10 Zentimetern Entfernung erkannt
    . . .
}

. . .

Na, wie wäre es denn mal mit einem Programm, das den Roboter einer Wand in 10 cm Entfernung folgen lässt?
Oder eines, das den Roboter geradeaus fahren lässt bis er ein Hindernis erkennt, dann dreht bis keines mehr vorhanden ist und danach seinen Weg fortsetzt?
Umgekehrt könnte der Roboter natürlich auch nach einem Hindernis suchen und hinfahren, um es wegzuschieben. Also so, wie es beim Robotersumo benötigt wird.

Ihr seht, mit einem Ultraschallsensor hat man viele Möglichkeiten!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert