In diesem Beitrag zeigen wir dir, wie du einen Hinderniserkenner programmieren kannst. Wenn du einen Roboter mit einem Ultraschallsensor und einen Miniservo hast, mit dem er in Bewegung versetzt werden kann, kannst du ihn folgendermaßen programmieren. Der PrintBot Evolution eignet sich hierfür hervorragend.
Spiel nicht mit dem Feuer! Auch wenn wir eine wunderbare Drachenhaut haben, wird unser Roboter versuchen, nicht mit den Objekten, die sich in seinem Weg befinden, zusammenzustoßen sondern sie zu umgehen.
Wie funktioniert der Hinderniserkenner?
Es gibt eine Vielzahl von Möglichkeiten, wie du deinen Roboter programmieren kannst, damit er Objekten ausweicht. Wir zeigen dir eine von ihnen. Dies sind die Aufgaben, die dein Roboter erledigen muss:
- Messungen vornehmen
- Objekte erkennen
- Die korrekte Bewegung ausführen
Sehen wir uns die Aufgaben der Reihe nach an:
1) Mit dem Ultraschallsensor Messungen vornehmen
Zunächst einmal messen wir 3 Positionen mit dem Ultraschallsensor aus: links, in der Mitte und rechts.
![]() |
![]() |
![]() |
Wir messen so die Entfernung des Objekts, das sich vor dem Sensor befindet. Daher ist es ausreichend, wenn wir die Position des Sensors verändern; ganz so, als würden wir den Kopf drehen, um in eine andere Richtung zu sehen. Diese Neuausrichtung können wir mit einem Mini-Servo durchführen.
2) Objekte erkennen, um zu entscheiden wie gehandelt werden soll
![]() |
Wenn sich in weniger als 25 cm Entfernung kein Hindernis vor dem Roboter befindet, lassen wir ein “Beep” ertönen und können uns vorwärts bewegen. |
![]() |
Wenn sich hingegen in weniger als 25 cm Entfernung ein Hindernis befindet ertönt ein Signalton “Meec”. In diesem Fall müssen wir überprüfen, ob wir es seitlich umfahren können. |
![]() |
Zuerst überprüfen wir, ob wir nach links ausweichen können. Befindet sich in weniger als 25 cm Entfernung kein Hindernis können wir links weiterfahren. |
![]() |
Wenn es links nicht geht überprüfen wir, ob es möglich ist, das Hindernis rechts zu umfahren. |
Nur … Was machen wir, wenn alle drei Richtungen blockiert sind? Dann geben wir einen Signalton ab wie “Meeec meec, hier sind alle Wege blockiert und es gibt keine Durchfahrt mehr!“. Da der Roboter feststeckt müssen wir ihn zurückkommen lassen und anschließend einen Richtungswechsel durchführen, so dass er beispielsweise nach links fährt. |
![]() |
3) Die korrekte Bewegung ausführen
In diesem letzten Schritt müssen wir nur noch die Räder des Roboters so bewegen, dass er die Rute beschreibt, die wir im vorigen Schritt ausgewählt haben. Lass die Motoren warmlaufen!
Wir programmieren für den PrintBot Evolution in bitbloq
Um dieses Programm zu erstellen verwenden wir bitbloq. Wir gehen dabei von den Verbindungen aus, die in der Anleitung für den Zusammenbau des PrintBot Evolution angegeben werden. Wenn du diese Art elektronischer Komponenten zum ersten Mal verwendest, kannst du dir hier die ersten Schritte ansehen bevor du mit dem Programmieren beginnst.
Zunächst einmal bestimmen wir die Variablen:
Wir verwenden die Variablen “obs_Left, obs_Right und obs_Center“, um eine 1 oder eine 0 zu speichern wenn links, geradeaus oder rechts ein Hindernis erkannt wurde. 1 bedeutet, dass sich in dieser Richtung ein Hindernis befindet.
Die Variablen “angle_Left, angle_Right y angle_Center” speichern die Positionen des Mini-Servos, damit die “Augen” des Roboters nach links, geradeaus oder nach rechts sehen können. Denkt daran, das wir im Grunde den Ultraschallsensor drehen und ausrichten, wenn wir den Mini-Servo anweisen sich in einen bestimmten Winkel zu bewegen.
Wenn wir die Variablen bestimmt haben beginnen wir damit, die Programmschleife zu programmieren, die sich ein ums andere Mal wiederholt. Als erstes erreichen wir, dass der Roboter mit der Funktion Stop anhält:
Die 3 Werte, von denen wir gesprochen haben, können auf diese Weise programmiert werden:
Die Funktion “search_Obstacle” ist die Hindernissucherin. Als Eingangsparameter besitzt sie einen Winkel und die Ausgabe ist entweder 0 oder 1. Diese komplette Funktion wird folgendermaßen in bitbloq programmiert:
Wie ihr sehen könnt, bewegt sie zunächst den Mini-Servo in diesen Winkel, verwendet anschließend den Block des Ultraschallsensors, der die Entfernung in Zentimetern misst und als letztes den grünen Vergleichsblock:
– Wenn die vom Sensor gemessene Entfernung kleiner ist als 25 cm, wird mit dem Summer ein Signalton und eine 1 ausgegeben. Es gibt ein Hindernis! – Im gegenteiligen Fall ertönt ein schrilles “beep” das freie Fahrt bedeutet. In diesem Fall wird eine 0 ausgegeben. Freie Fahrt!
Jetzt kommen wir zu der Entscheidung, wie der Roboter handeln soll wenn Hindernisse entdeckt werden. Wie sollen wir reagieren? Wir haben die vier Möglichkeiten schon vorher erklärt. Hier zeigen wir euch, wie sie mit den Blöcken von bitbloq programmiert werden:
Jetzt müssen wir nur noch festlegen, wie diese Funktionen der Bewegung aussehen, die wir ausgeführt haben. Um den Roboter VORWÄRTS ZU BEWEGEN verwenden wir die Funktion mit der Bezeichnung “go_Fordward“:
Diese Funktion lässt mit dem Summer ein paar Töne erklingen, um anzuzeigen, dass der Weg frei ist. Anschließend werden die zwei Räder mit den Servos mit kontinuierlicher Rotation bewegt: Der linke Servo (Pin 8) dreht im Uhrzeigersinn und der rechte Servo (Pin 9) dreht entgegen des Uhrzeigersinns. [Hinweis: Die Drehrichtung der Räder wird vom Inneren des Roboters aus gesehen]
Um den Roboter ZU DREHEN verwenden wir für eine Drehung nach links die Funktion “turn_Left” und “turn_Right” für eine Drehung nach rechts. Um den Roboter ANZUHALTEN verwenden wir die Funktion mit der Bezeichnung “Stop“, die wir schon am Anfang eingesetzt haben:
Als Letztes HOLEN wir den Roboter mit der Funktion “go_Backward” ZURÜCK:
Diese Funktion ist so lang weil sie drei Dinge ausführt:
– Sie lässt lustige Singaltöne erklingen (“¡Oh, oh, der Roboter ist gefangen!”) – den Mini-Servo den Kopf schütteln (” Oh nein, der Roboter ist verwirrt!”) – und bewegt den Roboter rückwärts durch die Bewegung der Servos mit kontinuierlicher Rotation.
Dies wäre das vollständige Programm:
Jetzt hast du das vollständige Programm! Aber … dabei fällt mir auf, dass dies nur eine Art und Weise ist, wie ein Hinderniserkenner programmiert werden kann. Es können noch viele Dinge verbessert werden: man könnte die Geschwindigkeit erhöhen, mehr als drei Werte entnehmen (damit auch wirklich kein Hindernis übersehen wird) oder die Priorität der Handlungen verändern (es ist nicht immer die beste Lösung geradeaus zu fahren und nach links abzubiegen). Traust du dir zu, den Code zu verbessern?