Hindernisvermeidung bauen: Tasten, Scannen, Lenken
Ein Roboter, der selbstständig umherfährt – Hindernisse erkennt, nach Lücken scannt und zum freien Raum lenkt, aus verstandenen und simulierten Bauteilen gebaut.
Ein Hindernisvermeidungs-Roboter ist der natürliche nächste Aufbau nach einem Linienfolger. Ein Linienfolger folgt – er fährt einer Linie nach, die jemand für ihn gezeichnet hat. Dieser Roboter entscheidet: ohne Strecke und ohne Karte tastet er den Raum um sich ab und wählt, wohin er fährt. Dieser eine Unterschied – auf die Welt reagieren statt ihr folgen – ist der erste echte Geschmack von Autonomie, und er ist noch einfach genug, um ihn vollständig zu verstehen.
Der Kern ist eine kurze, sich wiederholende Schleife: tasten–scannen–entscheiden–drehen. Der HC-SR04-Ultraschallsensor tastet vorwärts und schätzt per Echolaufzeit die Distanz; ist etwas näher als eine Sicherheitsschwelle, stoppt der Roboter, schwenkt den Sensor auf einem SG90-Servo links und rechts und dreht zur offensten Peilung. Diese Schwelle ist nicht willkürlich – sie ist eine Sicherheitsdistanz aus aktueller Geschwindigkeit, Tast-Entscheidungs-Stell-Latenz, Bremsweg (der mit dem Quadrat der Geschwindigkeit wächst), Roboterradius und Marge, alle sichtbar als Anhaltewegkurve im Simulator.
Du fügst Bauteile hinzu, die ein mobiler Roboter braucht, und lernst, was jedes tut: einen Arduino Uno für gutmütige 5-V-Logik, den Ultraschallsensor und seine Blindzone (der Mindestbereich, unter dem er nichts melden kann), den Servo, der dem Strahl einen zweiten Blickwinkel gibt, die L298N-H-Brücke, die Motorstrom schaltet, den Logikpins nicht liefern können, zwei TT-Getriebemotoren, deren Getriebe Drehzahl gegen nutzbares Drehmoment tauscht, ein 2WD-Chassis mit Stützrad für Differenziallenkung und einen Akkupack, der Motor und Logik auf getrennten Schienen versorgen muss. Der Technikbaum führt dich außerdem durch zwei Lernpfade – Motorregelung und reaktive Navigation –, sodass dieselben PWM-, Odometrie- und Filterideen aus dem Linienfolger hier im Navigationskontext wiederkehren.
Dann – bevor du etwas ausgibst oder eine Fehlverdrahtung riskierst – stimme das Ausweichverhalten im Browser-Simulator ab, bis es sauber durch vollgestellten Raum navigiert. Der Arbeitsraum dort ist zweidimensional von oben mit instantanen, rauschfreien Strahlen; ein echter Ultraschallstrahl spreizt etwa 15°, wird vom eigenen Roboterkörper blockiert und von weichen oder schrägen Flächen gestört – also filterst du Messwerte, fügst einen Medianfilter und eine kurze Beruhigungsverzögerung nach der Servobewegung hinzu, bevor du einer Distanz auf Hardware vertraust. Eine sichere Stoppdistanz und eine Freiraum-Regel in der Simulation zu finden, nimmt dem Roboter den größten Teil des Ratens ab, bevor er sich je bewegt.
Erst dann verdrahtest du den echten Roboter – Trigger und Echo an die richtige Spannung, Servosignal an einen PWM-fähigen Pin, Motor-PWM und -Richtung an den Treiber, Motorakku nur an den VM-Pin des Treibers, jede Masse gemeinsam verbunden – und lässt ihn über einen Boden mit Kisten oder Stühlen fahren. Dieselben Tast- und Filterlektionen führen direkt in das Micromouse-Labyrinth mit Wänden, falls du später Kartierung willst, oder in die ROS-2-Navigation, falls du einen Raspberry Pi hinzufügst.
Folge dem Technikbaum unten von oben nach unten. Jeder Knoten öffnet sich, sobald seine Voraussetzungen erfüllt sind, und dein Fortschritt wird auf diesem Gerät gespeichert, sodass du den Roboter über ein Wochenende bauen kannst, ohne den Faden zu verlieren.
Stückliste
| Bauteil | Menge | Ca. Kosten | Hinweise |
|---|---|---|---|
| Arduino Uno | 1 | $5–8 | 5-V-Logik hilft hier wirklich – das Echo des HC-SR04 hat 5 V |
| HC-SR04 | 1 | $2 | Ein VL53L0X ist ein guter zweiter Sensor, kein Ersatz |
| SG90-Servo | 1 | $2 | Für den Scankopf. MG90S, wenn er stundenlang laufen soll |
| L298N | 1 | $2–4 | Oder ein TB6612FNG, der weit weniger vom Akku verschwendet |
| TT-Getriebemotor | 2 | $4 | |
| 2WD-Chassis | 1 | $6–10 | |
| Akkupack | 1 | $6 | 6×AA NiMH oder 2×18650 |
| Anfahrschalter | 2 | $1 | Dazu nehmen. Siehe unten |
Gesamt: ca. $30–40.
Die zwei Anfahrschalter sind die besten vierzig Cent am Roboter, und sie sind das Bauteil, das die meisten Aufbauten weglassen. Jeder Distanzsensor hat Flächen, die er nicht sieht – ein Sonar ist blind für Vorhänge und für Wände in steilem Winkel –, und ein Roboter ohne Berührungssensorik schiebt einen Vorhang, bis etwas nachgibt. Zwei Schalter hinter einem umlaufenden Stoßfänger machen aus „weicht meist aus“ ein „bleibt nie an etwas Unsichtbarem hängen“.
Wie alles verbunden wird
| Von | Nach | Hinweis |
|---|---|---|
HC-SR04 VCC, GND |
5 V, GND | ~15 mA, mit Spitze während eines Pings |
HC-SR04 Trig |
D9 | Beliebiger digitaler Pin |
HC-SR04 Echo |
D10 | 5-V-Ausgang – ok am Uno, braucht einen Teiler am 3,3-V-Board |
| Servosignal | D6 | Die Servo-Bibliothek nutzt Timer 1, der auch D9/D10-PWM treibt |
| Servostrom | Separate 5 V, gemeinsame Masse | 650 mA blockiert – nicht der 5-V-Pin des Arduino |
Treiber ENA, ENB |
D5, D3 | PWM-fähige Pins. Enable-Jumper des L298N entfernen |
Treiber IN1–IN4 |
D8, D7, D4, D2 | |
| Anfahrschalter | D11, D12, INPUT_PULLUP |
COM an Masse, NO an den Pin |
Akku + |
Treiber VM / +12V |
Niemals der Arduino |
| Alle Massen | Ein Punkt | Arduino, Treiber, Servoversorgung, Akku-Minus |
Beachte den Timer-Konflikt: Die Servo-Bibliothek übernimmt Timer 1, der auf einem Uno PWM
auf Pins 9 und 10 treibt. Lege Motor-PWM auf 3, 5, 6 oder 11 und den Servo auf einen beliebigen Pin, und das
Problem entsteht nie. Lege ein Motor-Enable auf Pin 9, und seine Drehzahlsteuerung hört lautlos auf zu
funktionieren, sobald du einen Servo anhängst.
Die Stoppdistanz, berechnet statt geraten
Die Stoppschwelle ist die wichtigste Zahl in diesem Projekt, und sie ist nicht willkürlich. Sie ist die Summe aus vier Distanzen:
stop_distance = (v x t_latency) + (v^2 / (2 x a_brake)) + robot_radius + margin
| Term | Woher er kommt | Typisch |
|---|---|---|
| Tast- und Entscheidungslatenz | Ping (bis 25 ms), Servo-Beruhigung, Schleifenperiode | 60–100 ms |
| Bremsweg | Geschwindigkeit zum Quadrat durch doppelte Verzögerung | Wächst schnell |
| Roboterradius | Vorderkante des Chassis bis Drehmitte | 80–100 mm |
| Marge | Weil der Sensorkegel 15° breit ist und über Weiches lügt | 50 mm |
Durchgerechnet für einen Roboter mit 0,3 m/s bei 80 ms Latenz und 1,0 m/s² Bremsverzögerung:
= (0.3 x 0.08) + (0.09 / 2.0) + 0.09 + 0.05
= 0.024 + 0.045 + 0.09 + 0.05 = 0.21 m
Also etwa 21 cm. Nun die Geschwindigkeit auf 0,6 m/s verdoppelt:
= 0.048 + 0.18 + 0.09 + 0.05 = 0.37 m
Die Schwelle hat sich nicht verdoppelt – sie ist um 76 % gewachsen, weil der Bremsterm mit dem Quadrat der Geschwindigkeit geht. Deshalb fährt ein Roboter, der im Schritttempo verlässlich ausweicht, bei höherem Tempo gegen Dinge – und warum die Lösung eine geschwindigkeitsabhängige Schwelle ist statt einer großen festen Zahl, die den Roboter überall ängstlich macht.
Baue ihn in Meilensteinen
| Nr. | Meilenstein | Der Test | Bestanden, wenn |
|---|---|---|---|
| 1 | Motoren fahren | Vorwärts, rückwärts, Drehung beide Richtungen, aufgebockt | Alle sechs Zustände gehen; du kennst das Totband jedes Rads |
| 2 | Distanz liest | Auf Wand in 30 cm zielen und eine Minute ausgeben | Stabil auf ein, zwei Zentimeter, keine Nullen |
| 3 | Timeout geht | Auf freie Luft und an die Decke zielen | Die Schleife hält ihre Rate – kein Echo darf den Roboter einfrieren |
| 4 | Medianfilter | Wiederholt Hand durch den Strahl winken | Wilde Einzelmesswerte verschwinden; echte Annäherung zählt weiter |
| 5 | Servo schwenkt | −60°, 0°, +60° befehlen und Distanz pro Winkel ausgeben | Wiederholbar von Schwenk zu Schwenk, mit Beruhigungsverzögerung vor jedem Ping |
| 6 | Beruhigungsverzögerung bewiesen | Verzögerung absichtlich entfernen | Messwerte verschmieren über Winkel – jetzt kennst du diesen Fehler |
| 7 | Stoppschwelle | Auf Wand zufahren und stoppen lassen | Stoppt mit deiner berechneten Marge, nicht per Zufall |
| 8 | Drehentscheidung | Vor Ecke mit einer offenen Seite stellen | Dreht zur offenen Seite, nicht zufällig |
| 9 | Hysterese | An der Schwelle balancieren lassen | Entscheidet sich, statt zu stottern |
| 10 | Anfahr-Recovery | Gegen ein Kissen fahren lassen | Sonar übersieht es, Schalter fängt es, Roboter setzt zurück und dreht |
| 11 | Freie Fahrt | Fünf Minuten im vollgestellten Raum | Überlebt; wo er hängen bleibt, kannst du den Zustand benennen |
Meilenstein 10 trennt eine Demo von einem Roboter. Ein Kissen schluckt den Ultraschallpuls vollständig – der Sensor meldet freien Raum, und der Roboter fährt mit voller Geschwindigkeit hinein. Ohne Anfahrschalter schiebt er dann, bis die Motoren blockieren.
Fehlersuche
| Symptom | Wahrscheinliche Ursache | Lösung |
|---|---|---|
| Roboter friert in zufälligen Abständen ein | pulseIn ohne Timeout |
25000-µs-Timeout übergeben; „kein Echo“ explizit behandeln |
| Notstopps im leeren Raum | Timeout als 0 cm gewertet | Timeout heißt fern, nicht nah. Sentinel zurückgeben |
| Fährt in Vorhänge und Kissen | Schall absorbiert – Physik, kein Bug | Anfahrschalter hinzufügen |
| Fährt schräg in Wände | Ping reflektiert am Empfänger vorbei | Gleiche Lösung; außerdem mehr Winkel scannen |
| Dreht selbstbewusst in eine Wand | Ausgelesen, bevor der Servo stand | 100–200 ms nach Winkelbefehl warten, dann tasten |
| Stottert an Hindernissen | Eine Schwelle, keine Hysterese | Bei 20 cm stoppen, erst ab 30 cm weiterfahren |
| Servo zittert, Board setzt zurück | Servostrom durch den Arduino | Eigene 5-V-Versorgung für den Servo, gemeinsame Masse |
| Motordrehzahlsteuerung tot | Servo-Bibliothek hat Timer 1 (Pins 9, 10) |
Motor-PWM auf 3, 5, 6 oder 11 legen |
| Sitzt für immer in einer Ecke | Kein Gedächtnis – reaktiver Navigation inhärent | Zufallskomponente und Feststeck-Erkennung mit Befreiung |
| Weicht langsam gut aus, fährt schnell dagegen | Feste Schwelle, quadratischer Bremsterm | Schwelle geschwindigkeitsabhängig machen |
| Wilde Messwerte bei zwei Robotern | Sie hören gegenseitig ihre Chirps | Ping-Timing versetzen |
Wie es weitergeht
Wandfolgen hinzufügen. Ein Roboter, der auf einer Seite festen Wandabstand hält, durchquert einen Raum deterministisch statt umherzuwandern – und es ist das erste Verhalten, das wie ein Plan aussieht. Kleine Codeänderung, großes konzeptionelles Plus.
Zweiten Sensortyp hinzufügen. Ein VL53L0X versagt auf fast genau den entgegengesetzten Flächen wie das Sonar – dunkel-matt und spiegelnd gegen weich und schräg. Zusammen decken sie weit mehr vom Raum ab als jeder allein.
Die Grenze akzeptieren und weiterziehen. Ein reaktiver Roboter kann nirgendwohin geschickt werden, kann nicht versprechen, dass er den Boden abgedeckt hat, und kann in einem hufeisenförmigen Raum ewig kreisen. Das sind Eigenschaften ohne Karte, keine Bugs. Wenn sie zu zählen beginnen, fügt die Micromouse Kartierung und Planung hinzu, und der Abdeckungsroboter geht die „War ich überall?“- Frage direkt an.
Projekt-Roadmap
Der Baupfad
Folge dem Technikbaum von den Bauteilen bis zum funktionierenden Roboter. Jeder Knoten wird freigeschaltet, sobald seine Voraussetzungen erledigt sind, und dein Fortschritt wird auf diesem Gerät gespeichert.
0 / 18 erledigt
Bauteile
- ControllerArduino UnoDas gutmütige 8-Bit-Board, über das die meisten die Robotik kennenlernen.
- SensorHC-SR04 Ultrasonic SensorEin Sonar-Ping im Zwei-Dollar-Paket – wie ein Roboter Hindernisse ertastet.
- AktorSG90-ServomotorDas Neun-Gramm-Servo hinter den meisten Roboterarmen, Greifern und Lenkungen.
- TreiberL298N MotortreiberDie Doppel-H-Brücke, die schwache Logikpins in Motorleistung verwandelt.
- AktorDC Gearmotor (TT Motor)Der gelbe Getriebemotor, der aus nacktem Chassis ein fahrendes Roboterauto macht.
- Chassis2WD Robot ChassisDie Plattform, auf die zwei Motoren, eine freie Rolle und die Elektronik geschraubt werden.
- StromversorgungRobot Battery & Power PackDer Unterschied zwischen einem Roboter, der läuft, und einem, der ständig neu startet.
Tutorials in diesem Pfad
- Einsteiger · 22 Min. LesezeitHindernisvermeidung: Fühlen, Scannen, Entscheiden, DrehenDie Schleife Fühlen–Scannen–Entscheiden–Drehen, mit der ein Roboter selbstständig Hindernissen ausweicht.
- Einsteiger · 20 Min. LesezeitHC-SR04-Ultraschallsensor lesen: Distanz in CodeVerwandle Ping-und-Echo in stabile Distanz in cm — mit Timeout und Medianfilter.
- Einsteiger · 18 Min.Einen Ultraschallsensor per Servo scannen, um Freiraum zu findenEinen HC-SR04 auf einem Servo schwenken, um die freieste Richtung zu finden, bevor du drehst.
- Einsteiger · 18 Min. LesezeitGleichstrommotoren steuern mit PWM und H-BrückeVerdrahte und steuere einen bürstenbehafteten Gleichstrommotor sicher mit PWM, H-Brücke und realistischen Stromgrenzen.
- Mittelstufe · 20 Min. LesezeitDifferenzial-Odometrie aus RadencodernLinke und rechte Radbewegung in eine mobile Roboterpose integrieren, dann Drift erkennen und kalibrieren.
Üben, bevor du verdrahtest
Im Live-Simulator abstimmen
Der Baupfad führt durch ein Browser-Labor. Bring das Verhalten hier in Ordnung und übertrage deine Einstellungen dann auf den echten Roboter.
Häufig gestellte Fragen
Wie funktioniert ein Hindernisvermeidungs-Roboter?
Er fährt vorwärts, während ein Ultraschallsensor die Distanz voraus überwacht. Ist etwas näher als eine gesetzte Schwelle, stoppt der Roboter, schwenkt den Sensor auf einem Servo links und rechts, misst die Distanz in jede Richtung und dreht dorthin, wo es am offensten ist – dann fährt er weiter. Das Ganze ist eine kurze Tasten-Scannen-Entscheiden-Drehen-Schleife, die mehrmals pro Sekunde läuft.
Welcher Sensor ist der beste für einen Hindernisvermeidungs-Roboter?
Der HC-SR04-Ultraschallsensor ist der Standard: billig, einfach zu verdrahten und bis wenige Meter verlässlich. Ein Time-of-Flight-Sensor liefert eine engere, schnellere, präzisere Messung, falls nötig – doch für einen ersten Ausweicher ist Ultraschall das richtige Verhältnis aus Kosten und Einfachheit.
Muss ich Bauteile kaufen, bevor ich mit diesem Projekt beginne?
Nein. Sensorik und Ausweichlogik laufen im Browser-Simulator, sodass du das Verhalten verstehen und abstimmen kannst, bevor du etwas kaufst. Nur die letzten Bauschritte – Verdrahtung und Montage – brauchen den echten Arduino, HC-SR04, Servo, Treiber, Motoren, Chassis und Akku.
Warum funktioniert mein Hindernisvermeidungs-Roboter nicht?
Die drei üblichen Verdächtigen sind eine verrauschte oder blockierte Ultraschallmessung (Medianfilter hinzufügen und Sensor freihalten), das Auslesen des Sensors, bevor der Servo fertig verfahren ist (kurze Beruhigungsverzögerung hinzufügen), und Motoren direkt am Arduino statt über den Treiber (was einbricht und das Board zurücksetzt).
Worin unterscheidet er sich von einem Linienfolger?
Ein Linienfolger folgt einer für ihn ausgelegten Strecke; ein Hindernisvermeidungs-Roboter hat keine Strecke und muss selbst entscheiden, wohin er fährt. Er fügt einen Scan-Sensor und eine echte Entscheidungsschleife hinzu – was ihn zum natürlichen zweiten Roboter nach einem Linienfolger macht.