BouwrouteBeginnerEen weekend

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.

Technisch schema: Bouw een obstakelvermijdende robot: meten, scannen en sturenCLEARANCE FIELD

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

100%
Bouw

Bedraad de robot

45 min

Bouw

Bouw hem op en laat hem rijden

60 min

Doel

Obstakelvermijdende robot af

Je hebt hem gebouwd

Componenten

Tutorials in deze route

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.