Fundamental · Oplossingen · 24. De microcontroller StemExpert · Brecht Corbeel · schoolium.me
SE
StemExpert
F24. De microcontroller — oplossingen
FFundamental · deel F6 · Programmeren en automatiseren
Oplossingen · hoofdstuk 24De microcontroller
Een computer van een paar euro die leds, knoppen en later de hele meetkas bestuurt
Uitgewerkte oplossingen bij de 15 opdrachten van het werkboek. Voor de leerkracht, en voor wie zichzelf wil verbeteren nadat hij het eerst zelf probeerde.
Een Arduino, een breadboard, twee leds en een knop: het begin van de automatische meetkas.
Voor de leerkrachtDeze pagina bevat de antwoorden. Druk het werkboek af zonder deze pagina.
Oefenen
Oefenen
één stap, direct toepassen
24.1
Waar zit een microcontroller?
Oefenen1Begrijpen8 min
Niet elk toestel met een stekker heeft een microcontroller.
a
Duid aan welke toestellen (bijna zeker) een microcontroller bevatten: gloeilamp, wasmachine, zaklamp met schakelaar, digitale thermostaat, broodrooster met draaiknop, afstandsbediening, elektrische fietsbel met één knop, smartwatch.
Wasmachine, digitale thermostaat, afstandsbediening, smartwatch. De gloeilamp, de zaklamp en een broodrooster met een mechanische draaiknop werken met een gewone kring; een fietsbel met één knop meestal ook.
b
Kies één toestel met een microcontroller en noem een input en een output.
Bijvoorbeeld de thermostaat: input = temperatuursensor en knoppen; output = display en het signaal naar de verwarmingsketel.
24.2
Input of output?
Oefenen1Begrijpen6 min
Voor de meetkas gebruik je deze onderdelen: drukknop, rode led, bodemvochtsensor, zoemer, vlotterschakelaar, relais voor de pomp, lichtsensor.
a
Sorteer ze in twee kolommen.
Input: drukknop, bodemvochtsensor, vlotterschakelaar, lichtsensor. Output: rode led, zoemer, relais voor de pomp.
b
Waarom staat de pomp zelf niet in je lijst, maar het relais wel?
De pomp trekt 0,65 A op 12 V: veel te veel voor een pin (20 mA, 5 V). De microcontroller stuurt het relais; het relaiscontact schakelt de pomp.
24.3
De pinnen van de Uno
Oefenen2Begrijpen8 min
Gebruik de figuur en het ontleedblad.
De Arduino Uno R3.
a
Op welke pinnen sluit je een led aan: bovenaan of onderaan? En een analoge sensor?
Een led op een digitale pin (bovenaan, 2 tot 13); een analoge sensor op A0 tot A5 (onderaan).
b
Waarom gebruik je pin 0 en 1 beter niet?
Die gebruikt de USB-verbinding om te uploaden en te communiceren: wat je erop aansluit, kan het uploaden verstoren.
c
Een leerling sluit de korte poot van de led aan op 5V in plaats van op GND. Wat gebeurt er als pin 10 HIGH is? En als ze LOW is?
Pin HIGH: beide kanten op 5 V, geen spanningsverschil: de led is uit. Pin LOW: de led staat nu in sperrichting (anode op 0 V, kathode op 5 V): ook uit. Ze brandt dus nooit.
24.4
Weerstanden voor leds
Oefenen2Rekenen12 min
Bereken de voorschakelweerstand en kies een waarde uit de E12-reeks (10, 12, 15, 18, 22, 27, 33, 39, 47, 56, 68, 82, maal 10, 100, ...). Reken daarna de stroom na.
a
Bereken en kies.
(a) 2,8/0,015=187Ω → 220 Ω → 2,8/220=12,7mA. (b) 2,0/0,010=200Ω → 220 Ω → 9,1 mA. (c) 1,3/0,005=260Ω → 270 Ω → 4,8 mA. (d) 10/0,020=500Ω → 560 Ω → 17,9 mA (en de weerstand krijgt 10×0,0179=0,18W: net onder 0,25 W).
b
Waarom kies je bij twijfel de volgende grotere E12-waarde en niet de kleinere?
Een grotere weerstand geeft een iets kleinere stroom: veilig voor de led en de pin. Een kleinere weerstand geeft meer stroom dan gewenst, en kan de led of de pin overbelasten.
24.5
Het breadboard
Oefenen2Begrijpen8 min
Kijk naar de breadboardschets.
De breadboardschets uit het handboek.
a
Welke gaatjes zijn verbonden met gaatje c6? Welke met gaatje f6?
c6 is verbonden met a6, b6, d6 en e6 (dezelfde kolom, bovenste helft). f6 is verbonden met g6 tot j6 (onderste helft), niet met c6: de gleuf scheidt ze.
b
Een leerling steekt de led met beide pootjes in kolom 10. Brandt ze? Waarom?
Nee: beide pootjes zitten in dezelfde kolom en zijn dus kortgesloten. Er staat geen spanning over de led.
c
Waarom loopt er een draad van GND van de Arduino naar de blauwe rail, en niet rechtstreeks naar kolom 11?
Beide kan. Via de rail is handiger: alle onderdelen die GND nodig hebben, halen het uit dezelfde lange rail.
Vertaal het blokprogramma naar Arduino-code. De knop op pin 2 werkt met de interne pull-up.
Een blokprogramma.
a
Schrijf de volledige code, met setup() en loop().
Zie het programma 'statuslampje' in het handboek: pinMode(2, INPUT_PULLUP); pinMode(10, OUTPUT); pinMode(11, OUTPUT); in setup(); in loop() if (digitalRead(2) == LOW) { digitalWrite(10, HIGH); digitalWrite(11, LOW); } else { digitalWrite(10, LOW); digitalWrite(11, HIGH); }
b
In blokken stond er geen pinMode. Welke regels moet je in C++ zelf toevoegen, en waarom?
De drie pinMode-regels. Zonder INPUT_PULLUP zweeft de ingang; zonder OUTPUT kan een pin geen stroom leveren (de led brandt dan hooguit heel zwak).
24.8
Pull-down: wat leest de pin?
Toepassen3Rekenen12 min
Bekijk de twee schakelingen.
Links een knop met pull-down, rechts met de interne pull-up.
a
Vul in wat pin 2 leest.
Pull-down: los LOW, ingedrukt HIGH. INPUT_PULLUP: los HIGH, ingedrukt LOW.
b
Hoeveel stroom loopt er door de 10 kΩ als de knop ingedrukt is? Welk vermogen?
Een leerling gebruikt 100 Ω in plaats van 10 kΩ. Werkt het nog? Is het een goed idee?
Het leest nog juist, maar ingedrukt loopt er 5/100=50mA en P=0,25W: de weerstand wordt warm en de 5 V-voeding wordt nodeloos belast. Een pull-down moet groot zijn (typisch 10 kΩ): ze moet de ingang alleen 'vasthouden', niet veel stroom voeren.
24.9
Foutzoeken: de led brandt niet
Toepassen3Analyseren15 min
Een leerling bouwt het knipperlicht. De ON-led van de Arduino brandt, het uploaden lukt, maar de led op het breadboard brandt nooit.
a
Geef vijf mogelijke oorzaken.
Bijvoorbeeld: led omgekeerd; weerstand met beide pootjes in dezelfde kolom; kabeltje op een andere pin dan in het programma; GND niet verbonden met de rail; pinMode vergeten (of een tikfout in de pin); een kabeltje of pootje dat niet goed vastzit; led stuk.
b
In welke volgorde test je? Maak een stappenplan dat bij het programma begint en bij de draadjes eindigt.
(1) Laat de ingebouwde led L knipperen: werkt het programma? (2) Controleer in de code het pinnummer en pinMode. (3) Meet tussen de pin en GND: wisselt de spanning tussen 0 en 5 V? Zet de wachttijd op 5 s. (4) Volg de draad: pin → kolom 6 → weerstand → kolom 10 → led → kolom 11 → rail → GND. Meet telkens. (5) Draai de led om of vervang ze.
c
De multimeter geeft 0 V tussen kolom 6 en GND, ook als het programma 'HIGH' zou moeten geven. Wat weet je nu?
Het signaal komt niet tot op het breadboard: het kabeltje zit op een andere pin of zit los, of het programma zet de pin niet hoog (verkeerd pinnummer, pinMode vergeten). De led zelf is dan niet het probleem.
24.10
Labo: een knipperlicht met drie snelheden
Toepassen3Labo45 min
Bouw het knipperlicht met een led en 220 Ω op pin 10 en een drukknop op pin 2. Het programma knippert langzaam (1 keer per seconde). Zolang je de knop ingedrukt houdt, knippert de led snel (5 keer per seconde).
a
Teken het schema.
Led + 220 Ω tussen D10 en GND; knop tussen D2 en GND.
Meet de spanning over de weerstand en bereken de stroom. Vergelijk met 13,6 mA.
Typisch: pin 4,8-4,9 V, led 1,9-2,0 V, weerstand ±2,9 V, R 215-225 Ω, I ≈ 13 mA.
d
Waarom reageert de led soms pas een halve seconde nadat je de knop indrukt?
De knop wordt alleen gelezen aan het begin van loop(). Tijdens delay(500) doet de microcontroller niets anders: druk je net na het lezen, dan duurt het tot 1 s voor het effect (gemiddeld een halve seconde).
Zo wordt dit beoordeeld
Schema
Led met weerstand op D10 naar GND; knop tussen D2 en GND (INPUT_PULLUP), of met pull-down.
Programma
Keuze met digitalRead; twee wachttijden (500 en 100 ms); correcte pinMode.
Meting
Spanningen tellen op tot de pinspanning; stroom via Ohm binnen enkele procent van 13,6 mA.
Verklaring
De knop wordt alleen gelezen tussen de wachttijden: delay blokkeert.
24.11
Hoeveel mag er aan één pin?
Toepassen3Rekenen12 min
Een leerling wil op één pin van een Uno R3 drie rode leds parallel aansluiten, elk met een eigen weerstand van 220 Ω.
a
Hoeveel stroom levert de pin dan? Mag dat?
3×13,6=40,9mA: boven de aanbevolen 20 mA en zelfs boven het absolute maximum van 40 mA. Niet doen.
b
Welke weerstand geef je elke led, zodat de pin samen hoogstens 20 mA levert?
Per led hoogstens 20/3=6,7mA: R=3,0/0,0067=450Ω → 470 Ω (6,4 mA per led, 19 mA samen).
c
Op een Uno R4 mag een pin maar 8 mA leveren. Hoeveel leds van 5 mA kan één pin dan aan? Welke weerstand hoort bij 5 mA?
Eén led van 5 mA (twee zou 10 mA zijn: te veel). R=3,0/0,005=600Ω → 680 Ω (4,4 mA). Voor meer leds gebruik je een transistor (Intermediate, hoofdstuk 23).
Uitdagen
Uitdagen
transfer, open problemen, leerlijnen combineren
24.12
Habitat: het statuslampje met reservoiralarm
Uitdagen4Habitat45 min
Breid het statuslampje uit. Een tweede vlotterschakelaar in het reservoir (naast die in serie met de pomp, hoofdstuk 18) meldt aan de microcontroller of er nog water is: hij is dicht zolang er water is en open als het reservoir bijna leeg is. Is het reservoir leeg, dan moet de rode led knipperen (1 keer per seconde), wat het vocht ook is. Anders werkt het lampje zoals eerst.
a
Op welke pin sluit je de vlotter aan, hoe (schema), en wat leest de pin als het reservoir leeg is?
Vlotter tussen D3 en GND, met pinMode(3, INPUT_PULLUP). Water: vlotter dicht → D3 LOW. Leeg: vlotter open → de pull-up trekt D3 naar HIGH.
b
Waarom kies je een vlotter die open gaat als het reservoir leeg is, en niet omgekeerd? Denk aan een losgeschoten draad.
Een losgeschoten draad of een kapotte vlotter geeft ook 'open' → HIGH → alarm. De fout wordt dus opgemerkt. Omgekeerd zou een losse draad 'alles goed' betekenen terwijl het reservoir leeg kan zijn. Een ontwerp dat bij een defect in de veilige toestand valt, heet fail-safe.
c
Teken het stroomdiagram van het nieuwe programma.
Start → lees D3 → 'D3 HIGH (leeg)?' ja → groen uit, rood 0,5 s aan, 0,5 s uit → terug. Nee → 'D2 LOW (droog)?' ja → rood aan, groen uit; nee → rood uit, groen aan → terug.
d
Schrijf het programma.
Zie het programma hieronder.
// Statuslampje met reservoiralarm (oplossing opdracht 24.12)constintDROOG=2;// drukknop 'droog' naar GNDconstintVLOTTER=3;// vlotterschakelaar naar GND: dicht (LOW) = er is waterconstintROOD=10;constintGROEN=11;voidsetup(){pinMode(DROOG,INPUT_PULLUP);pinMode(VLOTTER,INPUT_PULLUP);pinMode(ROOD,OUTPUT);pinMode(GROEN,OUTPUT);}voidloop(){if(digitalRead(VLOTTER)==HIGH){// vlotter open: reservoir (bijna) leegdigitalWrite(GROEN,LOW);digitalWrite(ROOD,HIGH);// rood knippert: 1 keer per secondedelay(500);digitalWrite(ROOD,LOW);delay(500);}elseif(digitalRead(DROOG)==LOW){// grond droogdigitalWrite(ROOD,HIGH);digitalWrite(GROEN,LOW);}else{// alles goeddigitalWrite(ROOD,LOW);digitalWrite(GROEN,HIGH);}}
e
Portfolio: noteer de pinnen van de meetkas tot nu toe (D2, D3, D10, D11) met hun functie.
D2: drukknop 'droog' (later vervangen door de sensor op A0); D3: vlotter reservoir (INPUT_PULLUP, leeg = HIGH); D10: rode led 220 Ω; D11: groene led 220 Ω.
Zo wordt dit beoordeeld
Aansluiting
Vlotter tussen D3 en GND met INPUT_PULLUP; leeg = open = HIGH.
Veiligheid
Uitgelegd dat een losse draad ook 'open' geeft en dus een alarm: fail-safe.
Programma
Eerst de vlotter, dan de knop; knipperen met twee wachttijden van 500 ms.
Aan een zebrapad staat een verkeerslicht voor de auto's (rood, oranje, groen) en een voor de voetgangers (rood, groen). Normaal hebben de auto's groen. Drukt een voetganger op de knop, dan springt het autolicht via oranje naar rood, en krijgen de voetgangers even groen.
a
Programma van eisen: schrijf minstens vier eisen, waaronder twee over veiligheid.
Bijvoorbeeld: (1) in rust groen voor de auto's, rood voor de voetgangers; (2) na een druk binnen 3 s oranje; (3) auto's en voetgangers hebben nooit tegelijk groen; (4) minstens 1 s alles rood tussen de twee groenen; (5) voetgangers 7 s groen.
b
Maak een pinplan en teken het schema (vijf leds, één knop).
Bijvoorbeeld: autolicht rood D11, oranje D12, groen D13; voetgangers rood D8, groen D9; knop D2 naar GND. Elke led met 220 Ω naar GND.
c
Teken het tijdsdiagram na een druk op de knop.
t = 0: druk; 0-3 s auto groen; 3-6 s oranje; vanaf 6 s auto rood; 6-7 s alles rood; 7-14 s voetgangers groen; 14-16 s alles rood; daarna auto groen.
d
Schrijf het programma.
Zie de code.
// Verkeerslicht met voetgangersknop (oplossing opdracht 24.13)constintROOD=11,ORANJE=12,GROEN=13;// autolichtconstintVROOD=8,VGROEN=9;// voetgangerslichtconstintKNOP=2;// knop naar GNDvoidsetup(){pinMode(ROOD,OUTPUT);pinMode(ORANJE,OUTPUT);pinMode(GROEN,OUTPUT);pinMode(VROOD,OUTPUT);pinMode(VGROEN,OUTPUT);pinMode(KNOP,INPUT_PULLUP);digitalWrite(GROEN,HIGH);// auto's hebben groendigitalWrite(VROOD,HIGH);// voetgangers rood}voidloop(){if(digitalRead(KNOP)==LOW){// iemand wil overstekendelay(3000);// auto's nog even groendigitalWrite(GROEN,LOW);digitalWrite(ORANJE,HIGH);delay(3000);digitalWrite(ORANJE,LOW);digitalWrite(ROOD,HIGH);delay(1000);// veiligheidstijd: alles rooddigitalWrite(VROOD,LOW);digitalWrite(VGROEN,HIGH);// voetgangers groendelay(7000);digitalWrite(VGROEN,LOW);digitalWrite(VROOD,HIGH);delay(2000);// alles rood tot het oversteekpad leeg isdigitalWrite(ROOD,LOW);digitalWrite(GROEN,HIGH);}}
Zo wordt dit beoordeeld
Eisen
Minstens vier, meetbaar; veiligheid: nooit tegelijk groen voor auto's en voetgangers, alles-rood-tijd.
Schema
Vijf leds met elk een weerstand, knop met pull-up of pull-down, pinplan klopt met de code.
Leest de knop, doorloopt de reeks, keert terug naar de rusttoestand.
24.14
Onderzoek: hoe helder brandt een led?
Uitdagen4Onderzoeken45 min
Je wil weten hoe de helderheid van een led afhangt van de stroom. Je hebt weerstanden van 220 Ω, 470 Ω, 1 kΩ, 2,2 kΩ en 4,7 kΩ, een Arduino die de led aanzet, en een lichtmeter (een app op een smartphone of een luxmeter).
a
Onderzoeksvraag, hypothese en variabelen (onafhankelijk, afhankelijk, gecontroleerd).
Vraag: hoe hangt de helderheid van een rode led af van de stroom? Hypothese: meer stroom, meer licht, ongeveer evenredig. Onafhankelijk: de stroom (via de weerstand). Afhankelijk: de verlichtingssterkte. Gecontroleerd: dezelfde led, afstand en hoek van de lichtmeter, donkere ruimte, dezelfde spanning.
b
Bereken vooraf de stroom bij elke weerstand (neem 2,0 V over de led en 5,0 V op de pin).
Zet de resultaten in een grafiek (helderheid tegenover stroom). Is het verband recht evenredig?
Bij kleine stromen ligt het ongeveer op een rechte door de oorsprong: de lichtopbrengst is bij benadering evenredig met de stroom. Bij grotere stromen buigt de lijn wat af (de led wordt warm). Let op: ons oog ziet helderheid niet evenredig: 3 mA lijkt al vrij fel.
d
Welke weerstand zou je kiezen voor een statuslampje dat 's nachts niet stoort? Waarom?
Bijvoorbeeld 1 kΩ (3 mA): duidelijk zichtbaar, maar niet verblindend, en zuiniger.
24.15
Een led rechtstreeks op een pin?
Uitdagen4Analyseren15 min
Op internet zie je soms een led zonder weerstand in pin 13 en GND van een Arduino gestoken. 'Het werkt, want pin 13 heeft al een weerstand', schrijft iemand.
a
Klopt die uitleg? Kijk naar het ontleedblad: waar zit de weerstand van pin 13 echt?
Nee. De weerstand op het bord hoort bij de ingebouwde led L, niet bij de pin zelf. Een led die je in de header steekt, staat rechtstreeks tussen pin 13 en GND.
b
Wat beperkt de stroom dan wel? Waarom is dat geen goed idee?
Alleen de interne weerstand van de uitgang van de chip en van de led. De stroom kan dan boven 20 mA of zelfs 40 mA uitkomen: de led wordt overbelast en de pin kan (langzaam) stukgaan. 'Het werkt' is geen bewijs dat het veilig is: gebruik altijd een voorschakelweerstand.