BouwrouteExpertEen paar weekends

Bouw een micromouse: robot die doolhoven oplost met flood fill

Een robot die een doolhof met muren zelfstandig verkent, er een kaart van maakt en daarna zonder één verkeerde draai de kortste route van start naar het midden rijdt.

Technisch schema: Bouw een micromouse: robot die doolhoven oplost met flood fillWALL SENSING → FLOOD FILL

Wat je bouwt

Een robot die in een doolhof wordt gezet dat hij nog nooit heeft gezien, het midden vindt en daarna terugrijdt over de kortste route die hij kan aantonen te bestaan.

Die tweede helft maakt een micromouse anders dan elke andere robot op deze site. Een lijnvolger reageert. Een obstakelvermijder reageert. Een micromouse onthoudt — hij bouwt een kaart tijdens het rijden en plant daarna over cellen die hij nog niet heeft bezocht. Het is het kleinste volledige robotprobleem: meten, bewegen, karteren en plannen, allemaal tegelijk aan de slag.

De strategie met twee ritten

Wedstrijdrobots krijgen meerdere ritten en worden op de snelste gescoord. Dat levert een strategie op die de moeite waard is om over te nemen, ook als niemand de tijd meet:

Rit één — verkennen. Rijd zorgvuldig, leg per cel vast welke muren er staan en bereik het midden. Snelheid is onbelangrijk; de kaart is het product.

Rit twee — benutten. Vul de afstanden in op de voltooide kaart, bereken de kortste route en rijd die af zonder te stoppen om iets te meten wat je al weet.

De splitsing telt, omdat de twee ritten tegengestelde dingen willen. Verkennen vraagt om langzame, voorzichtige beweging en steeds meten. Een snelheidsrit vraagt om moed. Probeer je dat tegelijk, dan krijg je een robot die in geen van beide goed is.

Waarom het algoritme niet het moeilijke deel is

Flood fill is echt eenvoudig: geef de doelcel afstand 0, geef elke buurcel één meer dan de laagste buurcel die hij kan bereiken en stap daarna altijd naar een lager getal. Het zijn een paar tientallen regels en op een raster is het aantoonbaar de kortste route.

Het moeilijke deel is dat het algoritme aanneemt dat de robot weet in welke cel hij zit.

Tel je één cel verkeerd, of draai je een paar keer 88° in plaats van 90°, dan lost de planner de doolhof op voor een robot die ergens anders staat. Het symptoom is frustrerend: het algoritme is volmaakt, de bedrading klopt, en de robot rijdt zelfverzekerd tegen een muer aan.

Daarom besteedt de onderstaande bouwvolgorde de meeste tijd aan bewegen en voegt de planner er als laatste aan. Je kunt de planner los bewijzen in de doolhofsimulator, waar de positie per definitie klopt — en juist daarom is het de moeite waard hem eerst te simuleren.

Onderdelenlijst

Onderdeel Aantal Richtprijs Opmerkingen
Arduino Uno of Nano 1 $5 Weinig RAM — een 16×16-doolhof vraagt om zorg. Een Mega of ESP32 neemt de zorgen weg
VL53L0X 3 $15 Links, voor, rechts. Drie, niet één — zie hieronder
MPU-6050 1 $2 Richtingsbepaling tijdens het draaien; de wielen slippen juist wanneer dat het belangrijkst is
N20-motoren met encoder 2 $16 1:50 of 1:100. Een metalen tandwielkast is noodzakelijk — speling telt op per draai
TB6612FNG 1 $3
2WD-chassis 1 $10 Moet met ruimte in een doolhofcel passen — minder dan ongeveer 90 mm breed
Accupakket 1 $8 2×18650
Doolhofmuren — $10–30 Foamboard of multiplex. Standaardcellen zijn 180 mm met muren van 50 mm

Totaal: ongeveer $70–95, plus de doolhof.

Drie afstandssensoren, niet één. Eén sensor voorin dwingt de robot om te draaien om te kijken, en dat kost tijd en — veel erger — bij elke waarneming een richtingsafwijking. Drie vaste sensoren laten de robot alle drie de muren van een cel in één keer aflezen, zonder te bewegen. Dat is het verschil tussen een micromouse die betrouwbaar in kaart brengt en een die bij elke muurcontrole fout ophoopt.

Onthoud dat alle drie de VL53L0X-sensoren opstarten op adres 0x29, dus heb je drie GPIO-pinnen aan XSHUT nodig om ze één voor één op te starten en adressen opnieuw toe te wijzen — en dat bij elke boot te herhalen, want die wijziging verdwijnt zodra de spanning uitvalt.

Let op het RAM. Een 16×16-veld met flood-fill-afstanden opgeslagen als uint8_t is 256 bytes, plus een muurkaart, plus een wachtrij. Op de 2 KB van een Uno past dat, maar alleen als je er bewust mee bezig bent — wat op zich al een goede oefening is, en de reden dat velen hier naar een ESP32 gaan.

Bouwvolgorde

1 — Zorg voor drie zuivere afstandsmetingen. Voor, links en rechts met VL53L0X-time-of-flight-sensoren. Ze delen één I²C-bus en starten op hetzelfde adres, dus start ze één voor één op door de andere in reset te houden en bij het opstarten adressen opnieuw toe te wijzen. Controleer of elke sensor een muur op een bekende afstand ziet voordat je iets monteert.

2 — Laat hem recht rijden en zuiver draaien. Dit is het echte project. Volg muurvolgen en precieze draaien: een PID-regelaar op de zijsensoren om gecentreerd te blijven, draaien met de gyro geïntegreerd in plaats van tellen via encoders, en tegen een voorwand opnieuw rechtzetten zodra die er is. Ga pas verder als de robot tien draaibewegingen aankan en nog steeds de juiste kant op kijkt.

3 — Tel cellen betrouwbaar. Encoders voorspellen waar een grens hoort te liggen; de dalende flank van een zijmuur bevestigt waar die werkelijk ligt. Bij twijfel: geloven de muur — het is een tastbaar oriëntatiepunt, geen opgebouwde schatting.

4 — Leg de muren vast in een kaart. Twee bits per cel voor vier muren, en een 16 × 16-doolhof past in een paar honderd bytes. Leg vast wat je ziet op het moment dat je het ziet.

5 — Voeg flood fill toe. De planner heeft nu eerlijke gegevens. Herbereken de afstanden zodra een nieuw gevonden muur het huidige plan ongeldig maakt — dat herplannen is de hele reden dat flood fill wordt gebruikt in plaats van een eenmalige zoektocht.

Hardwaretips die ertoe doen

Klein wint van snel. De robot moet binnen een cel kunnen draaien. Een compact chassis met de wielen dicht bij het draaipunt wentelt netjes; een lang chassis raakt bij elke draai muren, en geen hoeveelheid afstemming repareert de geometrie.

Speling is een richtingsafwijking. Elke draai op de plek keert de motoren om, en een losse tandwielkast verliest de eerste graden — ongeveer 0,9° richtingsafwijking bij een wiel van 42 mm en 4° speling. N20-motoren met metalen tandwielkast bestaan om precies die reden.

Monteer de zijsensoren iets naar voren en schuin. Recht naar buiten wijzen betekent dat ze een muur pas zien als die precies naast ze ligt, dus de robot ontdekt die muur pas laat. Een kleine voorwaartse hoek geeft de regellus vooruitinformatie.

Geef de sensoren een stabiele voeding. Bij een instabiele voeding kan een VL53L0X plausibele maar onjuiste waarden teruggeven in plaats van duidelijk te falen — het slechtste soort storing, want de kaart vult zich dan met muren die er niet zijn.

Hoe goed het eruit moet zien

Meting Eerste werkende micromouse Goed afgesteld
Verkeningsnelheid 0,2–0,3 m/s 0,3–0,5 m/s
Snelheidsrit 0,4–0,6 m/s 1,0–2,0 m/s
Afwijking van het celmidden na 10 cellen 10–20 mm Onder 5 mm
Richtingsafwijking na 10 draaiingen 8–15° Onder 3°
Detectienauwkeurigheid van muren Moet 100% zijn 100%
Volledige 16×16-verkenning 3–6 minuten 1–2 minuten

Twee van die rijen verdienen nadruk.

Muurdetectie kent geen gedeeltelijke score. Eén verkeerd vastgelegde muur bederft de kaart, flood fill rekent daarna zelfverzekerd een route dwars door die muur, en de snelheidsrit rijdt er pal tegenaan. Er is geen nette terugval, en daarom rijdt de verkenningsrit langzaam.

De drift-rijen zijn het echte project. Het algoritme is niet het moeilijke deel — flood fill is zo’n veertig regels en je kunt het volledig testen in de simulator helemaal zonder hardware. Het moeilijke deel is dat de robot na tien cellen niet meer staat waar hij denkt te staan, en een micromouse die 20 mm per tien cellen afdrijft, raakt aan de overkant van de doolhof een muur. Al het andere dat een echte wedstrijdrobot laat werken — correctie tijdens het muurvolgen, draaien met gyrofusie, encoderkalibratie — bestaat om dat ene getal te bestrijden.

Wat er misgaat

Symptoom Meest waarschijnlijke oorzaak
Rijdt zelfverzekerd tegen een muur Het aantal cellen klopt niet — positie, niet planning
Staat na enkele draaiingen schuin De gyro-offset is niet afgetrokken, of de draaiingen zijn niet rechtgezet
Duikt steeds in zijopeningen De muurcontrole ontbreekt in de volglus
Legt muren vast die er niet zijn De sensorvoeding zakt weg, of er is overspraak tussen de modules
Lost het langzaam op en raakt snel een muur De snelheidsrit is te snel voor de bewegingslaag — vertraag hem en versnel daarna

Vrijwel elke regel in die tabel is een fout in beweging of waarneming, niet in het algoritme. Die verdeling is het belangrijkste dat je vóór het begin weet, want ze vertelt je waar je je weekends aan moet besteden.

Wil je de ideeën over karteren en plannen zonder de hardware, dan voert de doolhofsimulator dezelfde strategie in twee fasen in de browser uit, en de leerroute voor padplanning en kartering voert die door naar A* en SLAM. Een veel goedkopere eerste doolhofrobot is de lijndoolhofrobot: die gebruikt tape in plaats van muren en heeft helemaal geen afstandssensoren nodig.

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 / 16 klaar

100%
Bouw

Laat hem de doolhof in kaart brengen

Bouw

Doel

Laat hem de route rijden

Doel

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

Wat is een micromouse?

Een kleine autonome robot die een doolhof met muren oplost, en de oudste doorlopende robotcompetitie ter wereld. De standaarddoolhof is 16 bij 16 cellen van 18 cm met het doel in het midden, en de robot krijgt geen kaart — hij moet verkennen, er zelf een maken en daarna de snelste route rijden die hij kan vinden. Het is een volledig robotprobleem in één doos: meten, nauwkeurig bewegen, karteren en plannen moeten allemaal samenwerken, en zodra er één misgaat is dat meteen zichtbaar.

Waarom time-of-flight sensoren in plaats van ultrasone sensoren?

Er zijn drie redenen waarom een doolhof deze sensoren minder geschikt maakt. Een ultrasone bundel spreidt ongeveer 15 graden uit en raakt in een smalle gang dus ook de muren naast het punt waar je op mikte. Meerdere ultrasone sensoren storen elkaar doordat ze elkaars pings horen. En elke meting kost milliseconden vluchtijd, waardoor je regellus niet sneller kan draaien. Een VL53L0X heeft een smalle bundel, wordt niet door zijn buren beïnvloed en leest in ongeveer 20 ms.

Heb ik een gyro nodig als ik encoders heb?

Voor een doolhof: ja. Encoders meten de draai van de wielen, niet die van de robot, en die lopen bij elke slip uit elkaar — en dat is precies wat er bij een draai op de plek gebeurt. Een fout van 2 graden per draai valt aanvankelijk nauwelijks op, maar is na tien draaien fataal. De gyro meet de werkelijke draai van de robot rechtstreeks, dus de draaibewegingen blijven zuiver wat de wielen ook deden.

Hoe verschilt dit van de lijndoolhofrobot?

Het zijn verschillende robots die toevallig een woord delen. Een lijndoolhof is zwarte tape op een bord dat wordt afgelezen door een naar beneden gerichte array van reflectiesensoren, en LSRB onthoudt de reeks bochten om de doodlopende wegen eruit te filteren. Een micromouse heeft echte muren, leest die met afstandssensoren en moet een werkelijke kaart van de doolhof maken om over cellen te kunnen plannen die hij nooit heeft gereden. De lijndoolhof is veel goedkoper om te bouwen; de micromouse is degene die karteren leert.

Waarom lost mijn robot de doolhof op maar raakt hij tijdens de snelheidsrit in een muur?

Omdat snelheid de natuurkunde verandert, niet het algoritme. Sneller rijden betekent meer slip, langere remwegen en minder tijd om te corrigeren voordat de volgende cel eraan komt. De gebruikelijke oplossing is niet méér afstemmen maar een tragere snelheidsrit om mee te beginnen, en die pas verhogen als de bewegingslaag bewezen werkt. Daarom zetten wedstrijdrobots zich tegen muren weer recht zodra dat kan — dat is de enige manier om de opgebouwde fout te corrigeren in plaats van die te beperken.

Kan ik een micromouse bouwen met een Arduino Uno?

Voor een eerste micromouse: ja. De Uno kan drie VL53L0X-sensoren en een IMU aan I²C hangen en een muurkaart van 16 bij 16 in een paar honderd bytes bewaren. Wat hij niet kan, is meedoen aan wedstrijden — serieuze wedstrijdrobots gebruiken snellere 32-bits besturingseenheden zodat de bewegingsregellus in de kilohertz kan draaien en de planner voortdurend opnieuw kan rekenen. Bouw eerst de langzame; vrijwel alles wat je leert kun je later hergebruiken.