Bouw een obstakelvermijdende robot: meten, scannen en sturen
Een robot die zelfstandig rondzwermt — obstakels waarneemt, naar openingen scant en naar vrije ruimte stuurt — gebouwd uit onderdelen die je begreep en eerst in simulatie afstelde.
Een obstakelvermijdende robot is de logische volgende build na een lijnvolger. Een lijnvolger volgt — hij volgt een lijn die iemand voor hem tekende. Deze robot beslist: zonder lijn en zonder kaart waarneemt hij de ruimte om zich heen en kiest waar hij heen gaat. Dat ene verschil — op de wereld reageren in plaats van hem te volgen — is de eerste echte smaak van autonomie, en het is nog steeds simpel genoeg om volledig te begrijpen.
De kern is een korte, herhalende cyclus: meten–scannen–beslissen–draaien. De HC-SR04 ultrasone sensor pingt vooruit en meet de looptijd van het echo-signaal om de afstand te schatten; is er iets dichterbij dan een veiligheidsdrempel, dan stopt de robot, zwaait de sensor met een SG90-servomotor links en rechts en draait naar de meest open richting. Die drempel is niet willekeurig — het is een veiligheidsafstand opgebouwd uit de huidige snelheid, de latentie van meten–beslissen–aansturen, de remweg (die met het kwadraat van de snelheid groeit), de straal van de robot en een marge, en dat is allemaal te zien als de stopafstandcurve in de simulator.
Je voegt de onderdelen toe die een mobiele robot nodig heeft en leert wat elk ervan doet: een Arduino Uno voor vergevingsgezinde 5 V-logica, de ultrasone sensor met zijn blinde zone (de minimale afstand waarbeneden hij niets kan melden), de servomotor die de bundel een tweede kijkpunt geeft, de L298N H-brug die de motorstroom schakelt die de logica-pinnen niet kunnen leveren, twee TT-gearmotoren waarin de tandwielkast snelheid inruilt voor bruikbaar koppel, een 2WD-chassis met zwenkwiel voor differentiële sturing, en een accupakket dat motor en logica op gescheiden rails moet voeden. De technologieboom voert je daarnaast door twee leerroutes — motorbesturing en reactieve navigatie — zodat dezelfde ideeën over PWM, odometrie en filtering die je bij de lijnvolger tegenkwam hier in een navigatiecontext terugkomen.
Daarna — vóór je iets uitgeeft of een verkeerde bedrading riskeert — stel je het vermijdingsgedrag in de browsersimulator af tot hij netjes door een rommelige ruimte navigeert. De werkruimte daar is in bovenaanzicht en tweedimensionaal, met directe stralen zonder ruis; een echte ultrasone bundel spreidt ongeveer 15° uit, wordt geblokkeerd door de eigen behuizing van de robot en wordt verstoord door zachte of schuine oppervlakken. Je zult metingen dus moeten filteren en een mediaanfilter en een korte stabilisatietijd toevoegen nadat de servomotor heeft gedraaid, voordat je een afstand op echte hardware vertrouwt. Een veilige stopafstand en een heldere regel voor de vrije richting bepaal je het beste in simulatie; zo haal je het meeste giswerk weg voordat de robot ook maar beweegt.
Pas dan bedraad je de echte robot — trig en echo op de juiste spanning, servosignaal op een PWM-compatibele pin, motor-PWM en richting naar de driver, motoraccu uitsluitend op de VM-pin van de driver, alle massa’s aan elkaar — en laat je hem over een vloer met dozen of stoelen zwerven. Dezelfde lessen over meten en filtering leiden rechtstreeks naar de Micromouse-doolhof met muren als je later wilt karteren, of naar ROS 2-navigatie als je een Raspberry Pi toevoegt.
Volg de technologieboom hieronder van boven naar beneden. Elke knoop gaat open zodra de vereisten zijn afgerond, en je voortgang wordt op dit apparaat bewaard, zodat je de robot in een weekend kunt bouwen zonder je plaats kwijt te raken.
Onderdelenlijst
| Onderdeel | Aantal | Richtprijs | Opmerkingen |
|---|---|---|---|
| Arduino Uno | 1 | $5–8 | 5 V-logica helpt hier echt — de echo van de HC-SR04 is 5 V |
| HC-SR04 | 1 | $2 | Een VL53L0X is een goede tweede sensor, geen vervanger |
| SG90-servomotor | 1 | $2 | Voor de scankop. MG90S als hij urenlang moet draaien |
| L298N | 1 | $2–4 | Of een TB6612FNG, die veel minder van de accu verspilt |
| TT-gearmotor | 2 | $4 | |
| 2WD-chassis | 1 | $6–10 | |
| Accupakket | 1 | $6 | 6×AA NiMH of 2×18650 |
| Botsschakelaars | 2 | $1 | Neem deze mee. Zie hieronder |
Totaal: ongeveer $30–40.
De twee botsschakelaars zijn de beste veertig cent aan de robot, en het zijn precies de onderdelen die de meeste builds overslaan. Elke afstandssensor heeft oppervlakken die hij niet kan zien — sonar ziet niets van gordijnen en niets van wanden die hij steil tegenkomt — en een robot zonder aanraakdetectie duwt een gordijn weg tot er iets meegeeft. Twee schakelaars achter een omwikkelde bumper maken van “vermijdt meestal dingen” een “loopt nooit vast tegen iets dat het niet kon zien”.
Hoe alles samenhangt
| Van | Naar | Opmerking |
|---|---|---|
HC-SR04 VCC, GND |
5 V, GND | ~15 mA, met pieken tijdens een ping |
HC-SR04 Trig |
D9 | Elke digitale pin |
HC-SR04 Echo |
D10 | 5 V uitgang — prima op een Uno, vereist een spanningsdeler op een 3,3 V-bord |
| Servosignaal | D6 | De bibliotheek Servo gebruikt Timer 1, die ook de PWM op D9/D10 aanstuurt |
| Servovoeding | Aparte 5 V, gemeenschappelijke massa | 650 mA bij blokkering — niet de 5 V-pin van de Arduino |
Driver ENA, ENB |
D5, D3 | Pinnen met PWM-ondersteuning. Verwijder de enable-jumpers van de L298N |
Driver IN1–IN4 |
D8, D7, D4, D2 | |
| Botsschakelaars | D11, D12, INPUT_PULLUP |
COM naar massa, NO naar de pin |
Accu + |
Driver VM / +12V |
Nooit de Arduino |
| Alle massa’s | Eén punt | Arduino, driver, servovoeding, de minpool van de accu |
Let op het timerconflict: de bibliotheek Servo neemt Timer 1 over, die op een Uno de PWM op pinnen 9 en 10 aanstuurt. Zet de motor-PWM op 3, 5, 6 of 11 en de servomotor op een willekeurige pin, dan doet het probleem zich nooit voor. Zet je een motor-enable op pin 9, dan werkt de snelheidsregeling stilzwijgend niet meer zodra je een servomotor aansluit.
De stopafstand berekend in plaats van geschat
De stopdrempel is het belangrijkste getal in dit project, en hij is niet willekeurig. Hij is de som van vier afstanden:
stop_distance = (v x t_latency) + (v^2 / (2 x a_brake)) + robot_radius + margin
| Term | Waar hij vandaan komt | Typisch |
|---|---|---|
| Latentie van meten en beslissen | Ping (tot 25 ms), stabilisatietijd van de servomotor, lusperiode | 60–100 ms |
| Remweg | Het kwadraat van de snelheid gedeeld door tweemaal de remvertraging | Groeit snel |
| Straal van de robot | Van de voorkant van het chassis tot het draaipunt | 80–100 mm |
| Marge | Omdat de sensorkegel 15° breed is en mist zachte dingen | 50 mm |
Uitgerekend voor een robot op 0,3 m/s met 80 ms latentie en 1,0 m/s² remming:
= (0.3 x 0.08) + (0.09 / 2.0) + 0.09 + 0.05
= 0.024 + 0.045 + 0.09 + 0.05 = 0.21 m
Dus ongeveer 21 cm. Verdubbel nu de snelheid tot 0,6 m/s:
= 0.048 + 0.18 + 0.09 + 0.05 = 0.37 m
De drempel is niet verdubbeld — hij is met 76% gegroeid, omdat de remterm met het kwadraat van de snelheid meegroeit. Daarom raakt een robot die bij wandelsnelheid betrouwbaar vermijdt ineens dingen zodra je hem versnelt, en daarom is de oplossing een snelheidsafhankelijke drempel in plaats van één groot vast getal dat de robot overal schuchter maakt.
Bouw de robot in mijlpalen
| # | Mijlpaal | De test | Zo slaag je |
|---|---|---|---|
| 1 | Motoren draaien | Vooruit, achteruit, op blokjes beide kanten op draaien | Alle zes toestanden werken; je kent de dode zone van elk wiel |
| 2 | Afstand klopt | Richt op een muur op 30 cm en druk een minuut lang af | Steeds binnen een centimeter of twee, geen nullen |
| 3 | Timeout werkt | Richt op open lucht en op het plafond | De lus houdt zijn tempo vast — geen echo mag niet betekenen dat de robot vastloopt |
| 4 | Mediaanfilter | Zwaai herhaaldelijk een hand door de bundel | Losse uitschieters verdwijnen; de echte nadering blijft zichtbaar |
| 5 | Servomotor zwaait | Geef −60°, 0°, +60° op en druk bij elke stand de afstand af | Van zwaai naar zwaai hetzelfde, met een stabilisatietijd vóór elke ping |
| 6 | Stabilisatietijd bewezen | Haal de vertraging bewust weg | Metingen lopen over de hoeken door elkaar — nu ken je die storing |
| 7 | Stopdrempel | Rijd op een muur af en laat hem stoppen | Hij stopt met je berekende marge, niet op geluk |
| 8 | Draaibesluit | Zet hem tegenover een hoek, met één kant vrij | Hij draait naar de open kant, niet willekeurig |
| 9 | Hysterese | Laat hem net boven de drempel staan | Hij kiest een besluit in plaats van te schokken |
| 10 | Terugzetten na een aanrijding | Rijd hem op een kussen af | Sonar mist het kussen, de schakelaar vangt hem, en de robot trekt terug en draait |
| 11 | Vrij rondrijden | Vijf minuten in een rommelige kamer | Hij houdt het vol; als hij toch vastloopt kun je de toestand benoemen |
Mijlpaal 10 is de stap die een demo van een robot scheidt. Een kussen absorbeert de ultrasone puls volledig, dus de sensor meldt vrije ruimte en de robot rijdt er op volle snelheid tegenaan. Zonder botsschakelaar duwt hij daarna door tot de motoren blokkeren.
Problemen oplossen
| Symptoom | Waarschijnlijke oorzaak | Oplossing |
|---|---|---|
| Robot bevriest op willekeurige momenten | pulseIn zonder timeout |
Geef een timeout van 25000 µs mee; handel “geen echo” expliciet af |
| Noodremt in een lege kamer | Een timeout als 0 cm behandelen | Een timeout betekent ver, niet dichtbij. Geef een bijzondere waarde terug |
| Rijdt tegen gordijnen en kussens | Geluid wordt geabsorbeerd — natuurkunde, geen fout | Voeg botsschakelaars toe |
| Rijdt schuin tegen muren | De ping kaatst weg van de ontvanger | Zelfde oplossing; scan ook meer hoeken |
| Draait zelfverzekerd tegen een muur in | Meten voordat de servomotor stabiel is | Voeg 100–200 ms toe nadat de hoek is ingesteld en vóór de ping |
| Schokt bij obstakels | Eén drempel, geen hysterese | Stop bij 20 cm en ga pas verder bij 30 cm |
| Servomotor trilt, bord reset | Servostroom door de Arduino | Aparte 5 V-voeding voor de servomotor, met gemeenschappelijke massa |
| Snelheidsregeling van de motor werkt niet meer | Bibliotheek Servo pakte Timer 1 (pinnen 9, 10) |
Zet de motor-PWM op 3, 5, 6 of 11 |
| Zit voorgoed in een hoek | Geen geheugen — inherent aan reactieve navigatie | Voeg een willekeurig element toe en een uitweg voor vastzitten |
| Vermijdt langzaam goed en raakt snel dingen | Vaste drempel, kwadratische remterm | Maak de drempel snelheidsafhankelijk |
| Wilde metingen als twee robots samen rijden | Ze horen elkaars pieptonen | Verspreid wanneer je pingt |
Waar je hierna mee verder kunt
Voeg muurvolgen toe. Een robot die aan één kant een vaste afstand tot een muur houdt, doorloopt een kamer systematisch in plaats van te dwalen, en het is het eerste gedrag dat op een plan begint te lijken. Het is een kleine codewijziging en een grote denkstap.
Voeg een tweede sensortype toe. Een VL53L0X faalt op vrijwel precies de tegengestelde oppervlakken van sonar — donkere matte vlakken en spiegels, tegenover zachte en schuine. Samen dekken ze veel meer van de kamer dan een van beide alleen.
Erken het plafond en ga verder. Een reactieve robot kun je nergens naartoe sturen, hij kan niet beloven dat hij de hele vloer heeft gehad, en hij kan in een hoefijzervormige kamer eindeloos rond blijven lopen. Dat zijn eigenschappen van het ontbreken van een kaart, geen fouten. Zodra dat belangrijk wordt, voegt de micromouse kartering en planning toe, en pakt de dekkingrobot de vraag “ben ik wel overal geweest?” rechtstreeks aan.
Projectroadmap
De bouwroute
Volg de techboom van onderdelen tot een werkende robot. Elk knooppunt wordt ontgrendeld zodra de voorwaarden klaar zijn, en je voortgang wordt op dit apparaat opgeslagen.
0 / 18 klaar
Componenten
- ControllerArduino UnoHet vergevingsgezinde 8-bits bord waarmee de meeste mensen robotica leren.
- SensorHC-SR04 ultrasone sensorEen sonarping in een verpakking van twee dollar; zo voelt een robot obstakels.
- ActuatorSG90-servomotorDe servomotor van negen gram achter de meeste robotarmen, grijpers en stuurmechanismen.
- DriverL298N-motordriverDe dubbele H-brug die zwakke logica-pins omzet in motorvermogen.
- ActuatorDC-gelijkstroommotor (TT Motor)De gele tandwielmotor die een kale basis in een rijdende robotauto verandert.
- Chassis2WD-robotchassisDe basis waarop twee motoren, een vrij zwenkwiel en je elektronica worden gemonteerd.
- VoedingAccu- en voedingspakket voor robotsHet verschil tussen een robot die blijft draaien en een robot die steeds opnieuw opstart.
Tutorials in deze route
- Beginner · 22 minObstakelvermijding: waarnemen, scannen, beslissen, draaienDe cyclus waarnemen–scannen–beslissen–draaien waarmee een robot zelf obstakels vermijdt.
- Beginner · 20 minHC-SR04 ultrasone sensor: betrouwbare afstand in codeMaak van ping-en-echo een stabiele afstand in cm—met een time-out en een mediaanfilter.
- Beginner · 18 minScan een ultrasone sensor met een servo om vrije ruimte te vindenZwaai een HC-SR04 op een servo om de helderste richting te vinden voordat je draait.
- Beginner · 18 min lezenBestuur gelijkstroommotoren met PWM en een H-brugBedraad en bestuur een gelijkstroommotor met borstels veilig met PWM, een H-brug en realistische stroomgrenzen.
- Gevorderd · 20 min lezenOdometrie met differentiële aandrijving uit wielencodersIntegreer de beweging van linker- en rechterwiel in de pose van een mobiele robot en identificeer en kalibreer dan de drift.
Oefen voordat je bedraadt
Stem het af in de live simulator
De bouwroute loopt via een lab in de browser. Krijg het gedrag hier goed en zet je instellingen daarna over naar de echte robot.
Veelgestelde vragen
Hoe werkt een obstakelvermijdende robot?
Hij rijdt vooruit terwijl een ultrasone sensor de afstand ervoor bewaakt. Komt er iets dichterbij dan een ingestelde drempel, dan stopt de robot, zwaait de sensor met een servomotor links en rechts om in elke richting de afstand te meten, en draait naar de meest open kant — om daarna weer verder te rijden. Het geheel is een korte cyclus van meten–scannen–beslissen–draaien die vele malen per seconde draait.
Welke sensor is het beste voor een obstakelvermijdende robot?
De HC-SR04 ultrasone sensor is de standaard: goedkoop, eenvoudig te bedraden en betrouwbaar tot een paar meter. Een time-of-flight sensor levert een smallere, snellere en nauwkeurigere meting als je die nodig hebt, maar voor een eerste obstakelvermijder is ultrasoon de juiste balans tussen kosten en eenvoud.
Moet ik onderdelen kopen voordat ik aan dit project begin?
Nee. Het meten en de vermijdingslogica draaien in de browsersimulator, dus je kunt het gedrag begrijpen en afstellen voordat je iets koopt. Alleen de laatste bouwstappen — bedrading en montage — hebben de fysieke Arduino, HC-SR04, servomotor, driver, motoren, chassis en accu nodig.
Waarom werkt mijn obstakelvermijdende robot niet?
De drie gebruikelijke boosdoeners zijn een ruisende of geblokkeerde ultrasone meting (voeg een mediaanfilter toe en houd de sensor vrij), de sensor uitlezen terwijl de servomotor nog beweegt (voeg een korte stabilisatietijd toe) en de motoren rechtstreeks uit de Arduino voeden in plaats van via de driver (wat de spanning doet inzakken en het bord reset).
Hoe verschilt dit van een lijnvolger?
Een lijnvolger volgt een lijn die voor hem is uitgelegd; een obstakelvermijdende robot heeft geen lijn en moet zelf beslissen waar hij heen gaat. Je voegt een scansensor en een echte besliscyclus toe, wat hem tot de logische tweede robot na een lijnvolger maakt.