Twee wielen, drie lichtsensoren en een oor: een inspectierobotje voor de gang van de klimaatmodule
Uitgewerkte oplossingen bij de 16 opdrachten van het werkboek. Voor de leerkracht, en voor wie zichzelf wil verbeteren nadat hij het eerst zelf probeerde.
Ons robotje (motor 9000 omw/min, wiel 65 mm) moet hoogstens 0,25 m/s rijden. Welke overbrengingsverhouding past daarbij?
nwiel=0,25⋅60/(π⋅0,065)=73,5omw/min; i=9000/73,5=122 (bv. een kast 1:120).
c
Wat verandert er aan het koppel op het wiel als je die kast kiest in plaats van 1:48?
Het koppel wordt ongeveer 120/48 = 2,5 keer groter (min wat meer wrijving in de extra trap): het robotje trekt krachtiger op, maar rijdt trager.
33.3
Van echo naar afstand
Oefenen3Rekenen10 min
De HC-SR04 meet bij 20 °C (343,4 m/s).
a
Bereken de afstand bij een echo van 5,83 ms en van 1,17 ms.
343,4⋅0,00583/2=1,00m; 343,4⋅0,00117/2=0,201m.
b
Hoe lang duurt de echo van een wand op 2,50 m?
t=2⋅2,50/343,4=0,0146s=14,6ms.
c
pulseIn() geeft 0 terug na de time-out van 25 ms. Wat betekent dat voor het robotje?
Er kwam binnen 25 ms geen echo terug: niets binnen ongeveer 4 m (of een voorwerp dat het geluid wegkaatst of opslorpt). De code maakt er 999 cm van: vrije baan.
33.4
Welke kant op?
Oefenen3Begrijpen8 min
Het robotje rijdt vooruit. Wat doet het bij deze wielsnelheden?
a
vL=0,20 en vR=0,10m/s
Abocht naar links
Bbocht naar rechts
Cop de plaats draaien
Drechtdoor achteruit
Bocht naar rechts: het linkerwiel legt meer weg af.
b
vL=−0,10 en vR=0,10m/s
Abocht naar links
Bbocht naar rechts
Cop de plaats tegen de klok in
Dop de plaats met de klok mee
Op de plaats tegen de klok in (naar links): ω > 0 en v = 0.
c
vL=vR=−0,10m/s
Abocht naar links
Bstilstaan
Crechtdoor achteruit
Dop de plaats draaien
Rechtdoor achteruit.
d
vL=0 en vR=0,15m/s: rond welk punt draait het robotje?
Rond het stilstaande linkerwiel: R = b/2 = 0,07 m voor het midden van de as.
33.5
Wat zien de sensoren?
Oefenen4Begrijpen15 min
IJking: wit 100, zwart 850. De drie sensoren lezen links 850, midden 475, rechts 100.
a
Bereken w voor elke sensor. Waar ligt de lijn ongeveer?
wL=1, wM=(475−100)/750=0,5, wR=0. De lijn ligt links van het midden, tussen de linker- en de middelste sensor.
b
Bereken p met het gewogen gemiddelde, en ω met K = 0,25 rad/s per mm.
Welke wielsnelheden stuurt de regelaar bij v0 = 0,20 m/s? Wat zou aan/uit doen?
vL=0,20−2,5⋅0,07=0,025m/s, vR=0,20+0,175=0,375m/s: een krappe bocht naar links. Aan/uit ziet links zwart (en het midden net zwart): het stuurt met een vaste correctie naar links, even hard als bij 3 mm afwijking.
Toepassen
Toepassen
meerdere stappen, in een context
33.6
Omkeren in de gang
Toepassen5Rekenen20 min
Het robotje is 200 × 160 mm; de as zit 110 mm achter de neus en 90 mm voor de achterkant. Op strook A (y = 0,55 m) is er 0,25 m tot de rand van het kweekbed en 0,55 m tot de buitenwand.
a
Hoe groot is de cirkel die de verste hoek beschrijft bij een draai op de plaats? Kan het robotje op strook A omkeren?
Verste hoek: 0,112+0,082=0,136m van de as: een cirkel met diameter 0,27 m. Aan de kant van het kweekbed is er 0,25 m, meer dan 0,136 m: omkeren kan.
b
Een klein wagentje met een stuur heeft een kleinste draaistraal van 0,50 m (aan de buitenkant). Kan het in de gang van 0,80 m omkeren zonder te manoeuvreren?
Nee: een halve cirkel met een straal van 0,50 m vraagt minstens 1,0 m breedte. Het moet vooruit en achteruit steken, of een andere route kiezen. Daarom zijn robotjes met twee wielen zo handig in smalle ruimtes.
c
In een bocht met R = 0,05 m aan 0,20 m/s: wat doet het binnenste wiel? Waarom is dat een probleem met de dode zone?
ω=0,20/0,05=4rad/s; binnenwiel 0,20−4⋅0,07=−0,08m/s: het draait achteruit. Een kleine snelheid in de dode zone (PWM rond 46) geeft haperend draaien: de code moet het wiel voldoende PWM geven of op 0 zetten.
33.7
Hoe erg is de temperatuur?
Toepassen5Rekenen15 min
De module is 's winters soms 5 °C, 's zomers 35 °C. De code rekent altijd met 343,4 m/s. De HC-SR04 meet een echo van 1,75 ms.
a
Bereken de echte afstand bij 5 °C en bij 35 °C, en wat de code telkens denkt.
Code: 343,4⋅0,00175/2=0,300m. Bij 5 °C: v=334,3: 0,293m. Bij 35 °C: v=352,5: 0,308m.
b
Het robotje stopt als de code 25 cm berekent. Op welke echte afstand stopt het bij 5 °C en bij 35 °C?
De echte afstand is 25⋅vecht/343,4: bij 5 °C 24,3cm, bij 35 °C 25,7cm.
c
Is de temperatuurcorrectie hier nodig? Wanneer wel?
Voor het stoppen niet: het verschil is minder dan 1 cm en er is marge. Wel als het robotje afstanden moet meten (bv. de stand van het vat of de breedte van de gang), of buiten in de vrieskou.
33.8
Een pad tekenen
Toepassen5Tekenen20 min
Het robotje (b=0,14m) staat in de oorsprong en kijkt naar de positieve x-as. Het krijgt na elkaar: (1) vL=vR=0,20m/s gedurende 2,0 s; (2) vL=−0,10, vR=0,10m/s gedurende 1,1 s; (3) vL=vR=0,20m/s gedurende 1,0 s; (4) vL=0,20, vR=0,10m/s gedurende 2,2 s.
a
Bereken na elke stap de plaats en de richting.
(1) 0,40 m rechtdoor: (0,40; 0), richting 0°. (2) ω=1,43rad/s, 1,1 s: 90° naar links op de plaats: (0,40; 0), richting +y. (3) 0,20 m: (0,40; 0,20). (4) v=0,15, ω=−0,714rad/s, R=0,21m, 2,2 s: 90° naar rechts rond (0,61; 0,20): eindpunt (0,61; 0,41), richting weer +x.
b
Teken het pad op schaal (1 hokje = 5 cm).
Een recht stuk van 40 cm, een draai op de plaats, 20 cm omhoog, en een kwartcirkel van 21 cm straal naar rechts.
33.9
Code: de afstand meten
Toepassen5Programmeren20 min
Schrijf een functie die met de HC-SR04 de afstand in cm teruggeeft, gecorrigeerd voor de temperatuur luchtT.
a
Schrijf de functie meetAfstand(). Gebruik pulseIn met een time-out.
float meetAfstand() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
unsigned long us = pulseIn(ECHO, HIGH, 25000UL);
if (us == 0) return 999.0; // geen echo
float v = 331.3 + 0.606 * luchtT; // m/s
return us * 1e-6 * v / 2.0 * 100.0; // cm
}
b
Waarom zet je TRIG eerst 2 µs laag voor de puls van 10 µs?
Zo begint de puls zeker van een schone lage toestand: de sensor ziet een duidelijke stijgende flank.
c
Waarom meet het robotje niet in elke ronde van loop(), maar om de 60 ms?
Een late echo van de vorige meting kan anders als nieuwe echo tellen; de datasheet raadt minstens 60 ms tussen twee metingen aan. En pulseIn() wacht tot 25 ms: in elke ronde meten zou de regelaar vertragen.
33.10
Hoe snel mag het robotje?
Toepassen6Programmeren30 min
Gebruik lijnvolger.py uit het handboek.
a
Laat rij() lopen met v0 = 0,30 en 0,40 m/s (T = 2,0/v0) voor K = 0,1 en K = 0,25. Wat stel je vast?
Met K = 0,25 volgt het robotje de bocht ook aan 0,30 en 0,40 m/s (4,3 en 2,6 mm in de bocht). Met K = 0,1 verliest het de lijn vanaf 0,30 m/s (106 mm).
b
Voeg een kengetal toe: de grootste afwijking in de bocht (x ≥ 1,40 m). Schrijf de regel code.
bocht = max(p[3] * 1000 for p in pad if p[1] >= 1.40)
c
Waarom heeft de regelaar bij een hogere snelheid meer versterking nodig?
In een bocht met straal R moet het robotje draaien met ω=v/R. Die draaisnelheid komt uit ω=K⋅p: bij een grotere v moet p groter worden (de lijn verder opzij), tot ze buiten de sensoren valt. Met een grotere K volstaat een kleinere p.
33.11
Labo: snelheid en dode zone
Toepassen5Labo50 min
Voer de proef uit het handboek uit met je eigen robotje of een motor met wiel.
a
Meettabel: PWM-waarde, drie tijden over 1,0 m, gemiddelde snelheid.
Bv. zoals de voorbeeldmeting in het handboek.
b
Zet v uit tegen de PWM-waarde. Bepaal de dode zone en de helling van de rechte.
Voorbeeld: dode zone rond PWM 46; helling ongeveer 0,60 m/s per 209 PWM-stappen = 0,0029 m/s per stap.
c
Schrijf het model van je motor als v = a · (PWM − PWM0). Welke PWM-waarde geeft 0,20 m/s?
v ≈ 0,0029 · (PWM − 46); voor 0,20 m/s: PWM ≈ 46 + 0,20/0,0029 ≈ 115.
d
Rijdt je robotje rechtdoor als beide motoren dezelfde PWM-waarde krijgen? Hoe los je een verschil op?
Meestal niet: twee motoren zijn nooit helemaal gelijk. Oplossing: per motor een eigen factor (ijken), of de rijrichting regelen (lijnvolger, of odometrie met encoders).
Zo wordt dit beoordeeld
Metingen
Na een aanloop gemeten, drie keer per waarde, ook rond de dode zone fijner gemeten.
Grafiek
Assen met eenheden, rechte door de punten boven de dode zone, snijpunt afgelezen.
Model
a en PWM0 met eenheden; de PWM-waarde voor 0,20 m/s berekend.
Kritiek
Verschil tussen de motoren benoemd; oplossing met een correctiefactor per motor of met de lijnvolger.
33.12
Vind de fouten in de robotcode
Toepassen6Programmeren20 min
Een eerste versie van drie cases uit robot.ino. Het robotje doet vreemde dingen.
case VOLGEN:
if (afstand < STOP_CM) naar(WACHTEN, nu);
else if (streep) { punten++; naar(METEN, nu); }
else volg(pos, V_RIJ);
break;
case WACHTEN:
if (afstand > STOP_CM) naar(VOLGEN, nu);
break;
case KEREN:
if (wit01(REFL_M) > 0.6) naar(TERUG, nu);
break;
a
Op een meetpunt blijft het robotje eindeloos meten: na METEN gaat het naar VOLGEN en meteen weer naar METEN. Waarom?
Het robotje staat nog op de streep: 'streep' blijft waar. Alleen de flank (net op de streep gekomen) mag tellen: nieuweStreep.
b
Voor een emmer op ongeveer 25 cm schokt het robotje: stoppen, vertrekken, stoppen. Waarom? En wat als de emmer blijft staan?
Eén grens voor stoppen en vertrekken: rond 25 cm schommelt de meting en wisselt de toestand voortdurend. Hysterese (stop onder 25, vertrek boven 30 cm) en even wachten lost het op. Blijft de emmer staan, dan wacht het robotje eeuwig: er is geen time-out.
c
KEREN draait niet: het robotje gaat meteen naar TERUG. Waarom?
Bij het begin van KEREN staat de middelste sensor nog op de lijn: de voorwaarde is meteen waar. Eerst minstens 1,8 s draaien.
d
Schrijf de verbeterde cases.
case VOLGEN:
if (afstand < STOP_CM) naar(WACHTEN, nu);
else if (nieuweStreep) { punten++; naar(METEN, nu); } // fout 1: alleen de flank telt
else volg(pos, V_RIJ);
break;
case WACHTEN:
if (afstand > VRIJ_CM && t >= 1000) naar(VOLGEN, nu); // fout 2: hysterese en even geduld
else if (t >= WACHT_MAX_MS) naar(KEREN, nu); // en een uitweg als het blijft
break;
case KEREN:
if (t >= DRAAI_MIN_MS && wit01(REFL_M) > 0.6) naar(TERUG, nu); // fout 3: eerst wegdraaien
else if (t >= DRAAI_MAX_MS) naar(FOUT, nu);
break;
Uitdagen
Uitdagen
transfer, open problemen, leerlijnen combineren
33.13
Habitat: de inspectieronde
Uitdagen7Habitat75 min
Het team wil dat het robotje overdag (6 tot 22 uur) elk uur een ronde rijdt, en 's nachts twee keer. Bij elke ronde meet het op drie punten temperatuur, luchtvochtigheid en lekken. In de module werken soms mensen, en in de modus ONDERHOUD mag het robotje niet rijden (hoofdstuk 32).
a
Bereken de tijd en de energie per ronde en per dag. Neem 1,0 W voor de elektronica terwijl het robotje wakker is, en 1,9 W extra voor de motoren tijdens het rijden.
Een ronde: de lus is 2,84 m; ±1,6 m heen aan 0,20 m/s (8 s) en ±1,3 m terug aan 0,12 m/s (11 s): ±19 s rijden, 30 s meten: ±50 s. Energie: 1,0⋅50+1,9⋅19=86J=0,024Wh. 18 rondes: ±0,43 Wh per dag. Het wachten tussen de rondes kost meer: de elektronica (±0,3 W voor de Uno alleen) gebruikt ±7 Wh per dag. Zonder laadstation zou de batterij van ±10 Wh dus maar ongeveer een dag meegaan; op het laadstation geen probleem.
b
Hoe weet het robotje dat de module in ONDERHOUD is? Stel een oplossing voor (hardware of draadloos) en pas het toestandsdiagram aan.
Bijvoorbeeld: een draadloze module (Expert, hoofdstuk 37) of eenvoudig een contact in het laadstation dat de Mega bedient: in ONDERHOUD of ALARM geeft de Mega geen startsignaal. In het diagram: LADEN --startsignaal [module NORMAAL]--> VOLGEN; tijdens een ronde: bericht 'onderhoud' → TERUG.
c
Een meting op meetpunt 2 geeft 'NAT'. Wat moet er gebeuren, bij het robotje en in de module?
Het robotje meldt het lek met de plaats (meetpunt 2) en rijdt verder (het is geen gevaar voor de robot). De Mega krijgt de melding: pomp stil (zoals bij A_WATER), alarm, en een mens gaat kijken.
d
Wat kan het robotje meten dat de vaste sensorkast niet kan? Stel twee extra metingen voor en zeg waar op de route.
Bv. de temperatuur op twee hoogtes (0,10 en 0,50 m: koude lucht blijft laag), het licht onder de goten (schaduw voor de onderste planten), de luchtvochtigheid vlak bij de bladeren, later een foto (Expert: zieke planten herkennen).
e
Maak een testplan: welke situaties test je, en hoe weet je dat het robotje goed reageert?
Tests: een emmer die even en een krat die blijvend in de weg staat, een plas op elk meetpunt, een stuk lijn dat weg is (FOUT na 1,5 s), een voet voor de sensor, laadcontact vuil, onderhoud tijdens een ronde. Per test het verwachte verloop van de toestanden, gelogd via de seriële poort.
Zo wordt dit beoordeeld
Energie
Rijtijd uit de lengte van de lus en de snelheden, meettijd, wachttijd; energie per ronde en per dag; vergelijking met de batterij.
Koppeling met de module
ONDERHOUD en ALARM bereiken het robotje (bv. een draadloos bericht of een contact in het laadstation) en houden het op het station.
Lek
Robot meldt en stopt niet voor niets; de module sluit de pomp af (alarm A_WATER of een nieuwe oorzaak) en waarschuwt.
Metingen
Zinvolle extra metingen (bv. licht onder de goten, temperatuur op twee hoogtes, een foto van de planten) met plaats en reden.
Testplan
Obstakel even en blijvend, plas, lijn onderbroken, laadstation bezet, onderhoud tijdens een ronde; verwacht gedrag per test.
33.14
Ontwerp: omrijden of omkeren?
Uitdagen6Ontwerpen35 min
Het robotje keert nu om als de gang 20 s geblokkeerd is. Een collega wil dat het rond een obstakel rijdt: van de lijn af, erlangs, en terug op de lijn. Een emmer heeft een diameter van 0,30 m en staat midden op strook A (y = 0,55 m).
a
Is er naast de emmer genoeg ruimte? Reken met de breedte van het robotje en een veiligheidsmarge van 5 cm.
Emmer van y = 0,40 tot 0,70 m. Naar het kweekbed: 0,80 − 0,70 = 0,10 m: te smal voor 0,16 m. Naar de wand: 0,40 m vrij; het robotje (0,16 m) met 2 × 0,05 m marge heeft 0,26 m nodig: dat kan, via de buurt van strook B.
b
Ontwerp de toestanden en overgangen voor omrijden. Welke sensoren gebruikt het robotje als het geen lijn ziet?
Bv.: VOLGEN --obstakel 5 s--> UITWIJKEN (90° naar rechts op de plaats, 0,25 m rijden met odometrie) → LANGS (rechtdoor 0,50 m, de sonar kijkt of het vrij is) → TERUGDRAAIEN (90° naar links, rijden tot een sensor de lijn vindt) → VOLGEN; elk met een time-out naar FOUT. Zonder lijn: odometrie (wielomwentelingen) en de afstand tot de wand of de emmer.
c
Geef twee argumenten voor en twee tegen omrijden in de gang van de module. Wat kies jij?
Voor: de ronde wordt afgewerkt, geen gemiste meetpunten. Tegen: zonder lijn is de plaats onzeker (odometrie dwaalt af), het robotje rijdt dichter bij mensen, emmers of planten, meer code en meer te testen. In deze smalle gang is omkeren en melden eenvoudiger en veiliger; in een brede hal zou omrijden zinvoller zijn.
Zo wordt dit beoordeeld
Ruimte
Correcte berekening van de vrije ruimte aan beide kanten, met marge.
Toestanden
Van de lijn af, erlangs (met odometrie of afstand tot de wand), terugzoeken van de lijn, time-out en FOUT.
Afweging
Veiligheid, planten, eenvoud en betrouwbaarheid tegen snelheid en volledigheid van de ronde.
33.15
Onderzoek: de beste versterking
Uitdagen7Onderzoeken45 min
Onderzoek met lijnvolger.py hoe de versterking K en de snelheid v0 samen de nauwkeurigheid in de bocht bepalen.
a
Laat de simulatie lopen voor alle combinaties van v0 (0,10 tot 0,40 m/s) en K (0,1 tot 1,0). Noteer de grootste afwijking in de bocht.
De simulatie van het handboek geeft (grootste afwijking van de as in de bocht, mm):
v0 (m/s)
K = 0,10
K = 0,25
K = 0,50
K = 1,00
0,10
5,6
10,3
11,4
11,9
0,20
1,6
7,0
10,2
11,4
0,30
kwijt (106)
4,3
8,8
11,0
0,40
kwijt (237)
2,6
7,4
10,1
b
Welke K werkt bij alle snelheden? Waar verliest het robotje de lijn, en waarom?
K = 0,25 werkt bij alle snelheden. Met K = 0,1 verliest het robotje de lijn vanaf 0,30 m/s: om ω = v/R te halen, moet de lijn verder opzij liggen dan de buitenste sensor. Grote K (1,0) werkt, maar met meer afwijking: de regelaar slingert.
c
Bij 0,20 m/s is K = 0,1 in de bocht het nauwkeurigst, terwijl ze bij 0,30 m/s faalt. Verklaar met de plaats van de sensoren (60 mm voor de as).
De sensoren kijken 60 mm vooruit. In een bocht ligt de lijn onder de sensoren meer naar binnen dan onder de as. Een zwakke regelaar laat de sensoren wat naar buiten van de lijn rijden, en dan volgt de as de bocht toevallig beter. Bij een hogere snelheid is die speling op: dan ligt de lijn buiten de sensoren.
Zo wordt dit beoordeeld
Rooster
Alle combinaties systematisch doorgerekend, met hetzelfde kengetal.
Conclusie
Een K gekozen die bij alle gevraagde snelheden werkt, met een getal onderbouwd.
Verklaring
Rol van de sensorplaats en van het nodige draaien (ω = v/R) juist uitgelegd.
33.16
Plaats bijhouden met de wielen
Uitdagen7Analyseren25 min
Elk wiel krijgt een encoder: een schijfje met 20 gleuven en een lichtsluis, dus 20 pulsen per omwenteling. Na een stuk rijden telt het robotje 180 pulsen links en 200 pulsen rechts.
a
Hoeveel mm is één puls? Hoeveel heeft elk wiel afgelegd?
Omtrek π⋅65=204,2mm, dus 10,21 mm per puls. Links 180⋅10,21=1,838m, rechts 2,042 m.
b
Bereken de afgelegde weg van het midden en de draaihoek.
s=(1,838+2,042)/2=1,940m; Δθ=(2,042−1,838)/0,14=1,46rad=84∘ naar links.
c
Het linkerwiel is 1 % groter dan het rechter, maar de code weet dat niet. Hoe scheef staat het robotje na 10 m rechtdoor? Wat leer je daaruit?
Het linkerwiel legt 1 % meer af: na 10 m 0,10m verschil, dus Δθ=0,10/0,14=0,71rad=41∘ scheef, terwijl de code denkt rechtdoor te rijden. Odometrie stapelt kleine fouten op; een lijn, een wand of een andere sensor moet de plaats telkens bijstellen (Expert: sensorfusie).