Arduino - Verkeerslicht
In dit project sluiten we drie LEDs aan op de Arduino en sturen we die aan als een verkeerslicht.
Lessen:
- Gebruik van het breadboard en aansluitdraden
- Eigenschappen van LEDs en weerstanden
- Begin met programmeren
- De setup() en loop() functies
- De for loop
- De delay() functie
Contents
Het breadboard
Een breadboard is een hulpmiddel waarmee, zonder solderen, heel gemakkelijk elektronische schakelingen kunnen worden gemaakt en weer afgebroken. Met een breadboard kun je dus gemakkelijker experimenteren. In Nederland wordt een "breadboard" soms ook wel een broodplankje genoemd, maar ik denk dat het beter is om het woord breadboard te blijven gebruiken. Boord snijden we op een broodplank en elektronische schakelingen testen we op een breadboard. Op die manier komen er geen kruimels in de gaatjes en werkt de elektronica zoals bedoeld.
Een breadboard is een plaatje vol met gaatjes. De meeste elektronische componenten kun je zo in die gaatjes steken. Ook kun je er speciale verbindingsdraadjes insteken om dingen met elkaar te verbinden. De in- en uitgangen van Arduino's beschikken ook over connectoren waar dergelijke verbindingsdraadjes gemakkelijk in geprikt kunnen worden. Het handige van breadboards is dat een bepaalde series gaatjes van binnen al met elkaar verbonden zijn. Als je het allemaal precies wilt weten kun je bijvoorbeeld hier kijken, maar ik denk dat een korte uitleg voldoende is. Boven- en onderaan het breadboard zitten twee rijen die over de hele lengte vanbinnen aan elkaar zitten. Dit wordt de rails genoemd. Vaak wordt zowel boven als onder een van de twee rijen met rood aangegeven en de andere met zwart of blauw. Het idee is dat een rode rij plus spanning heeft (meestal 5 Volt) en de blauwe nul spanning. Door ergens in een van de twee rode randen een draadje te steken met 5 Volt spanning, staat overal op die regel 5 Volt. De blauwe regel kunnen we dan met de nul verbinden, waarna we overal gemakkelijk stroom vandaan kunnen halen. Het is een goed gebruik om draden e gebruiken met een kleur die past bij hun functie. Dus rood voor draden die 5 Volt "voeding" dragen en zwart voor draden die aan de nul zitten. Als je genoeg draden en kleuren hebt zou je bij het verkeerslicht hier een groene draad kunnen gebruiken voor het groene lampje, een gele draad voor het gele lampje en dan een oranje draad voor het rode lampje - deze kan beter niet rood zijn want dat wijst op een plus. Het is een goede gewoonte, maar doe gerust wat anders als dat zo uitkomt.
|
|
| Verbindingen in het breadboard |
De andere gaatjes zijn juist vertikaal verbonden, waarbij de verbinding in het midden met een grote opening is verbroken. Voorbeelden van deze verbindingen zijn aangegeven met de oranje en blauwe pijlen in bovenstaand plaatje (dat met een groene pijl ook de rails aangeeft).
LEDs
De term LED betekent Light Emitting Diode. Het is dus een diode die licht geeft. Een diode is een elektronisch onderdeeltje waar de stroom maar in één richting doorheen kan: alleen van de plus-kant naar de nul-kant; andersom kan er geen stroom doorheen. Dit betekent dat een LED alleen licht geeft als het juiste pootje aan de plus zit en het andere aan de nul. Normale LED's hebben een spanning nodig van 1,5 Volt waarna er een heel klein stroompje gaat lopen van 20 mA (dat is 20 milli Ampère: 0,020 Ampère). Nu zijn LEDjes tamelijk kwetsbare diodes. Als de spanning of de stroom te groot wordt gaan ze snel kapot. Ook als er een te grote spanning verkeerd om wordt aangesloten gaan ze kapot. Arduino werkt (meestal) met 5 Volt en dat is teveel voor een LEDje. LEDjes moeten dus beschermd worden tegen deze te hoge spanning en dat doen we met een weerstand. Weerstanden remmen de stroom die kan lopen. Grote weerstanden remmen heel sterk, en kleine weerstanden remmen maar een beetje. Vrijwel alle weerstanden zien er klein uit; het gaat om de weersandswaarde en niet om het aantal centimeters. Het is van belang om de juiste weerstand te gebruiken. Bij gebruik van 5 Volt en een normaal LEDje is een weerstand van 180 Ω (Ω spreek je uit als "oom") ideaal. Iets meer, bijvoorbeeld 220 Ω mag ook, maar het moet niet minder dan 150 Ω worden. Bij correct gebruik gaan LEDjes heel erg lang mee.
LET OP: Een ander ding dat in dit opzicht best belangrijk is, is dat Arduino's maar weinig stroom kunnen leveren. Per uitgang kunnen ze zo'n 20 mA wel aan, maar veel meer moet het niet worden. Je kunt best dus een LED aansluiten op één, of zelfs elke uitgang van de Arduino, maar veel meer moet je per uitgang niet aansluiten want anders gaat de Arduino kapot. Dat gebeurt dus ook als zo'n LED niet beschermd is met een weerstand!
![]()
|
| LEDjes in allerlei kleuren; lange pootje aan de plus, korte aan de min! |
Tegenwoordig heb je LEDjes in allerlei kleuren. In bovenstaande figuur kun je goed zien dat LEDjes twee pootjes hebben. Het lange pootje moet aan de "plus" en het korte pootje aan de "min". Ideaal is het als de spanning op het lange pootje 1,5 Volt hoger is dan op het korte pootje.
Om een LEDje correct aan te sluiten heb je dus een weerstand nodig. Het maakt daarbij niet uit of de stroom eerst door de LED gaat en daarna door de weerstand, of eerst door de weerstand en daarna door de LED. Je kunt dus, vanaf de plus gerekend, de stroom eerst door de weerstand laten gaan, dan naar het lange pootje van de LED en daarna naar de nul, of je verbind juist eerst het lange pootje van de LED direct met de plus, het korte pootje met de weerstand om tenslotte de andere kant van de weerstand met de nul te verbinden. Beide is goed.
De verkeerslichten aansluiten
Benodigdheden:
Altijd (gaan we niet steeds noemen):
- 1 Arduino bord
- 1 geschikte USB kabel
- 1 breadboard
- diverse aansluitdraden
Extra:
- 1 rode LED
- 1 gele of oranje LED
- 1 groene LED
- 3 weerstanden van 180Ω-220Ω
Prik de drie LEDjes op het breadboard en wel zo dat elk pootje in een aparte kolom zit. Bijvoorbeeld: rood in kolommen 22 en 23, geel in kolommen 26 en 27 en groen in kolommen 30 en 31. Zorg daarbij dat de lange pootjes rechts zitten (oneven kolommen). Leg nu met een oranje draadje verbinding tussen kolom 23 en pin 10 van de Arduino, leg een geel draadje tussen kolom 27 en pin 7 van de Arduino, en leg met een groen draadje verbinding tussen kolom 31 en pin 4 van de Arduino. Leg nu verbinding tussen de korte pootjes en de nul-rij met behulp van de drie weerstanden. Verbind vervolgens de nul-rij met een zwart (of blauw) draadje met een van de GND pinnetjes op de Arduino.
Het geheel ziet er dan schematisch alsvolgt uit:
|
| Aansluitingen "Verkeerslicht" |
Het programma uploaden
In onderstaand vernster staat weer het programma. Selecteer de hele tekst met de muis en kopieer het naar het clipboard met Crtl+c. Vergeet niet om in de Arduino software eerst alles te selecteren met Crtl+a om over de geselecteerde tekst heen te plakken met Crtl+v. Als je wilt mag je meteen het resultaat uploaden om te zien wat er gebeurt.
int redled = 10; // de rode LED zit aan pin 10
int yellowled = 7; // de gele LED zit aan pin 7
int greenled = 4; // de groene LED zit aan pin 4
void setup()
{
// zorg ervoor dat de LED-pins gezien worden als OUTPUT
// OUTPUT pins worden door de processor aan- en uitgezet
pinMode(redled, OUTPUT);
pinMode(yellowled, OUTPUT);
pinMode(greenled, OUTPUT);
}
void loop()
{
// groen
digitalWrite(greenled, HIGH); // zet de groene LED aan
delay(10000); // wacht 10 000 milli seconde = 10 seconden!
digitalWrite(greenled, LOW); // zet de groene LED uit
// oranje
digitalWrite(yellowled, HIGH); // zet de oranje LED aan
delay(1000); // wacht 1 seconde!
digitalWrite(yellowled, LOW); // zet de oranje LED uit
// rood
digitalWrite(redled, HIGH); // zet de oranje LED aan
delay(10000); // wacht 10 seconden
digitalWrite(redled, LOW); // zet de oranje LED uit
}
Uitleg van het programma
Elk Arduino programma heeft minimaal twee functies: select() en loop(). In de code staan die als:
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
Een functie is een blok opdrachten die achter elkaar worden uitgevoerd en die aangeroepen kan worden met de naam van de functie. Zo'n naam kan van alles zijn, maar mag geen bekende naam zijn, mag geen spaties bevatten en moet met een gewone letter beginnen. Een functie voert niet allleen opdrachten uit, maar kan ook een resultaat berekenen. Dat resultaat is dan van een bepaald type: een getal, een tekst, of wat anders. De term void betekent echter dat er geen resultaat zal zijn. Na de naam van de functie staan er twee ronde haakjes. Dat is het deel waar parameters meegegeven kunnen worden. We komen daar in een later hoofdstuk op terug. setup() en loop() hebben geen parameters, maar de haakjes zijn toch noodzakelijk. Daarna volgt er een accolade opnenen, dan de opdrachten die de functie moet uitvoeren, en tenslotte een accolade sluiten. Die accolades worden vrij veel grbruikt: meerdere opdrachten die tussen accolades staan worden steeds als een bij elkaar horend cluster opdrachten gezien. Bovenstaande functies hebben overigens nog geen opdrachten, de functies zijn leeg, maar de structuur is daardoor des te helderder. Een onzichtbaar programma achter de schermen zorgt ervoor dat setup() als eerste wordt doorlopen. Daarna zorgt hetzelfde programma ervoor dat loop() continue wordt aangeroepen. Als de loop() functie dus klaar is, wordt hij meteen opnieuw aangeroepen en begint loop() dus weer aan het begin.
In het programma van verkeerslichten zien we de volgende dingen:
- Er worden drie variabelen gedefinieerd, de pin van elk van de drie LEDs
- In de functie setup() worden de pootjes van de LED-lampjes ingesteld als OUTPUT poorten
- De loop() functie zorgt voor het verkeerslicht patroon dat continu doorloopt
De setup functie roept drie maal de standaard (oranje) functie pinMode() aan. Bij deze functie moet je opgeven van welke pin dje de pinmode wilt instellen. In de eerste aanroep is dat redled, waarvan de waarde 10 is. Nadat setup() zijn werk heeft gedaan kan de Arduino de LEDjes aan en uitzetten. Dat gebeurt in de loop() functie. Je ziet hier drie stukken code:
- Een stuk waarin de groene LED voor 10 seconden wordt aangezet en daarna weer uit
- Een stuk waarin de oranje LED voor 1 seconden wordt aangezet en daarna weer uit
- Een stuk waarin de rode LED voor 10 seconden wordt aangezet en daarna weer uit
Hierna is loop() klaar, maar zoals we nu weten wordt loop() meteen weer aangeroepen. Daardoor gaat, nadat de rode LED is uitgezet de groene meteen weer aan.
De functie delay() laat de Arduino een aantal milliseconden wachten: delay(10000) wacht 10 seconden. Dankzij deze wachttijd blijft het betreffende LEDje gedurende die tijd aan.
Zie je dat de loop() precies 21 seconden duurt? Hoewel niet helemaal precies: de delays duren bij elkaar 21 seconden, maar de andere opdrachten vragen ook een beetje tijd. Een heeeeel klein beetje: zo'n Arduino kan miljoenen opdrachtjes verwerken per seconde!
Het commentaar in het programma is bedoeld als uitleg over de werking ervan. Uitleg zal steeds vooral in het commentaar zitten. Probeer dus steeds de code te lezen en te begrijpen. De tekst van de cursus zal hoofdzakelijk nieuwe elementen bespreken.
Beetje spelen
Je hebt nu het een en ander gezien. Om het meer in de vingers te krijgen is hetbelangrijk dat je er zelf mee aan de slag gaat. In deze sectie Beetje spelen staan wat extra ideetjes en opdrachtjes die je kunt proberen. Probeer zelf die opdrachtjes uit door de programmaatjes aan te passen.
- Stel dat uit onderzoek blijkt dat het verkeerslicht te kort op oranje staat. Kun jij die tijd verlengen naar 1,5 seconde?
- Stel nu dat dit het programma is voor de lichten van een drukke, doorgaande route en dat het hier langer groen moet worden. Kun jij dat aanpassen?
- Gefeliciteerd: Duitsland is ook geintereseerd in jouw verkeerslichtregeling! Maar daar geven ze een extra signaal dat het snel groen gaat worden. Automobilisten kunnen dan alvast hun auto in de versnelling zetten om zo net iets eerder op te trekken dan bij ons. Een seconde voor het groen wordt gaat dan naast het groen ook het oranje licht aan. Kun jij het programma zo aanpassen dat dit ook gebeurt?
- Aannemende dat dit het verkeerslicht is van een bepaalde kruising, dan staat het licht van de kruisende weg natuurlijk op rood als het hier groen of oranje is en vice versa. Denk je dat jij dat kunt maken met een paar extra LEDjes, weerstandjes en wat extra programma regels?




