← Back to CoursesStemExpert
StemExpert
Fundamental · Oplossingen · 24. De microcontroller
StemExpert · Brecht Corbeel · schoolium.me
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.

5× oefenen6× toepassen4× uitdagen± 308 min
Een Arduino, een breadboard, twee leds en een knop: het begin van de automatische meetkas.
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.
  1. 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.
  2. 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.
  1. a
    Sorteer ze in twee kolommen.
    Input: drukknop, bodemvochtsensor, vlotterschakelaar, lichtsensor. Output: rode led, zoemer, relais voor de pomp.
  2. 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.
USB7-12 VATmega328PAREFGND131211109876543210DIGITAL (PWM ~)LTXRXONIOREFRESET3.3V5VGNDGNDVinA0A1A2A3A4A5POWERANALOG IN
De Arduino Uno R3.
  1. 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).
  2. 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.
  3. 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.
  1. a
    Bereken en kies.
    (a) → 220 Ω → . (b) → 220 Ω → 9,1 mA. (c) → 270 Ω → 4,8 mA. (d) → 560 Ω → 17,9 mA (en de weerstand krijgt : net onder 0,25 W).
  2. 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.
Arduino Uno: digitale pinnenGND1312111098765432abcdefghij151015202530+−−+220 Ωled: lange poot (+) in kolom 10,korte poot (−) in kolom 11
De breadboardschets uit het handboek.
  1. 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.
  2. 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.
  3. 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.
Toepassen

Toepassen

meerdere stappen, in een context
24.6

Code lezen

Toepassen2Programmeren12 min
Een Arduino voert dit programma uit:
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(200);
  digitalWrite(13, LOW);
  delay(800);
}
  1. a
    Welke led knippert, en hoe? Hoeveel keer per minuut?
    De ingebouwde led L (pin 13): 0,2 s aan, 0,8 s uit. Een cyclus duurt 1 s: 60 keer per minuut.
  2. b
    Teken de spanning op pin 13 van t = 0 tot t = 3 s.
    Een blokgolf: 5 V van 0 tot 0,2 s, 0 V van 0,2 tot 1,0 s, 5 V van 1,0 tot 1,2 s, enzovoort.
  3. c
    Verander het programma zodat de led twee keer kort flitst en dan 1 s uit is (een 'hartslag').
    void loop() {
      digitalWrite(13, HIGH);
      delay(100);
      digitalWrite(13, LOW);
      delay(100);
      digitalWrite(13, HIGH);
      delay(100);
      digitalWrite(13, LOW);
      delay(1000);
    }
24.7

Blokken en code naast elkaar

Toepassen3Programmeren15 min
Vertaal het blokprogramma naar Arduino-code. De knop op pin 2 werkt met de interne pull-up.
wanneer Arduino Uno opstartherhaalalslees digitale pin2=0dananderszet digitale pin10ophoogzet digitale pin11oplaagzet digitale pin10oplaagzet digitale pin11ophoog
Een blokprogramma.
  1. 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); }
  2. 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.
externe pull-downinterne pull-up (INPUT_PULLUP)Arduino5VD2GNDknop10 kΩlosgelaten: D2 leest LOW (0)ingedrukt: D2 leest HIGH (1)Arduinoin de chip5V20-50 kΩD2knopGNDlosgelaten: D2 leest HIGH (1)ingedrukt: D2 leest LOW (0)
Links een knop met pull-down, rechts met de interne pull-up.
  1. a
    Vul in wat pin 2 leest.
    Pull-down: los LOW, ingedrukt HIGH. INPUT_PULLUP: los HIGH, ingedrukt LOW.
  2. b
    Hoeveel stroom loopt er door de 10 kΩ als de knop ingedrukt is? Welk vermogen?
    ; .
  3. c
    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 en : 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.
  1. 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.
  2. 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.
  3. 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).
  1. a
    Teken het schema.
    Led + 220 Ω tussen D10 en GND; knop tussen D2 en GND.
  2. b
    Schrijf het programma (in blokken of in code).
    void setup() {
      pinMode(2, INPUT_PULLUP);
      pinMode(10, OUTPUT);
    }
    
    void loop() {
      int wacht = 500;
      if (digitalRead(2) == LOW) {
        wacht = 100;
      }
      digitalWrite(10, HIGH);
      delay(wacht);
      digitalWrite(10, LOW);
      delay(wacht);
    }
  3. c
    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.
  4. 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
SchemaLed met weerstand op D10 naar GND; knop tussen D2 en GND (INPUT_PULLUP), of met pull-down.
ProgrammaKeuze met digitalRead; twee wachttijden (500 en 100 ms); correcte pinMode.
MetingSpanningen tellen op tot de pinspanning; stroom via Ohm binnen enkele procent van 13,6 mA.
VerklaringDe 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 Ω.
  1. a
    Hoeveel stroom levert de pin dan? Mag dat?
    : boven de aanbevolen 20 mA en zelfs boven het absolute maximum van 40 mA. Niet doen.
  2. b
    Welke weerstand geef je elke led, zodat de pin samen hoogstens 20 mA levert?
    Per led hoogstens : → 470 Ω (6,4 mA per led, 19 mA samen).
  3. 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). → 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.
  1. 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.
  2. 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.
  3. 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.
  4. d
    Schrijf het programma.
    Zie het programma hieronder.
    // Statuslampje met reservoiralarm (oplossing opdracht 24.12)
    const int DROOG = 2;      // drukknop 'droog' naar GND
    const int VLOTTER = 3;    // vlotterschakelaar naar GND: dicht (LOW) = er is water
    const int ROOD = 10;
    const int GROEN = 11;
    
    void setup() {
      pinMode(DROOG, INPUT_PULLUP);
      pinMode(VLOTTER, INPUT_PULLUP);
      pinMode(ROOD, OUTPUT);
      pinMode(GROEN, OUTPUT);
    }
    
    void loop() {
      if (digitalRead(VLOTTER) == HIGH) {     // vlotter open: reservoir (bijna) leeg
        digitalWrite(GROEN, LOW);
        digitalWrite(ROOD, HIGH);             // rood knippert: 1 keer per seconde
        delay(500);
        digitalWrite(ROOD, LOW);
        delay(500);
      } else if (digitalRead(DROOG) == LOW) { // grond droog
        digitalWrite(ROOD, HIGH);
        digitalWrite(GROEN, LOW);
      } else {                                // alles goed
        digitalWrite(ROOD, LOW);
        digitalWrite(GROEN, HIGH);
      }
    }
  5. 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
AansluitingVlotter tussen D3 en GND met INPUT_PULLUP; leeg = open = HIGH.
VeiligheidUitgelegd dat een losse draad ook 'open' geeft en dus een alarm: fail-safe.
ProgrammaEerst de vlotter, dan de knop; knipperen met twee wachttijden van 500 ms.
PortfolioPinlijst D2 knop, D3 vlotter, D10 rood, D11 groen.
24.13

Ontwerp: een verkeerslicht met voetgangersknop

Uitdagen4Ontwerpen50 min
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.
  1. 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.
  2. 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.
  3. 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.
  4. d
    Schrijf het programma.
    Zie de code.
    // Verkeerslicht met voetgangersknop (oplossing opdracht 24.13)
    const int ROOD = 11, ORANJE = 12, GROEN = 13;   // autolicht
    const int VROOD = 8, VGROEN = 9;                // voetgangerslicht
    const int KNOP = 2;                             // knop naar GND
    
    void setup() {
      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 groen
      digitalWrite(VROOD, HIGH);                    // voetgangers rood
    }
    
    void loop() {
      if (digitalRead(KNOP) == LOW) {               // iemand wil oversteken
        delay(3000);                                // auto's nog even groen
        digitalWrite(GROEN, LOW);
        digitalWrite(ORANJE, HIGH);
        delay(3000);
        digitalWrite(ORANJE, LOW);
        digitalWrite(ROOD, HIGH);
        delay(1000);                                // veiligheidstijd: alles rood
        digitalWrite(VROOD, LOW);
        digitalWrite(VGROEN, HIGH);                 // voetgangers groen
        delay(7000);
        digitalWrite(VGROEN, LOW);
        digitalWrite(VROOD, HIGH);
        delay(2000);                                // alles rood tot het oversteekpad leeg is
        digitalWrite(ROOD, LOW);
        digitalWrite(GROEN, HIGH);
      }
    }
Zo wordt dit beoordeeld
EisenMinstens vier, meetbaar; veiligheid: nooit tegelijk groen voor auto's en voetgangers, alles-rood-tijd.
SchemaVijf leds met elk een weerstand, knop met pull-up of pull-down, pinplan klopt met de code.
TijdsdiagramGroen → oranje → rood → (alles rood) → voetgangers groen → alles rood → groen.
ProgrammaLeest 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).
  1. 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.
  2. b
    Bereken vooraf de stroom bij elke weerstand (neem 2,0 V over de led en 5,0 V op de pin).
    220 Ω: 13,6 mA; 470 Ω: 6,4 mA; 1 kΩ: 3,0 mA; 2,2 kΩ: 1,4 mA; 4,7 kΩ: 0,64 mA ().
  3. c
    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.
  4. 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.
  1. 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.
  2. 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.