Bij deze CoderDojo gaan we verkeerslichten maken. Dat kan met:
Als je met de micro:bit of Arduino aan de slag gaat moet je zelf een circuitje bouwen. Daarvoor hebben we natuurlijk gekleurde LEDjes, en daarnaast ook knopjes en fotocellen waarmee je je verkeerslicht verder kunt uitbreiden.
Je kunt een circuit bouwen op een zogenaamd breadboard. Deze zijn er in allerlei soorten en maten. Op dit schema kun je zien welke gaatjes (elektrisch) met elkaar verbonden zijn.
Net als batterijen hebben LED lampjes een plus en een min. Als je goed kijkt zijn de pootjes van de LED's niet even lang: het net iets langere pootje is de plus, de kortere de min.
Een weerstand zet een deel van de stroom die er doorheen loopt om in warmte. Hiermee kun je bijvoorbeeld andere onderdelen in je circuit, bijvoorbeeld een LED, beschermen tegen te hoge spanningen.
Een fotocel is een soort weerstand, met de speciale eigenschap dat de sterkte van de weerstand afhangt van hoeveel licht er op de fotocel valt. Deze hoeveelheid licht kun je meten met zowel de micro:bit als de Arduino.
Sluit de micro:bit met de USB kabel aan op de computer
Maak een eerste programma: toon het hart-pictogram
Upload nu het programma naar de micro:bit
Veel verkeerslichten reageren op de omgeving, bijvoorbeeld wanneer een auto tot de streep rijdt of een fietser op een knop drukt. Gebruik nu de micro:bit knoppen om het verkeerslicht op groen (of juist op rood) te laten springen. Je kunt hiervoor een als ... dan ...
blok voor gebruiken.
De LEDs voor op de micro:bit werken als een soort lichtsensor. Door de lichtniveau
variabele te gebruiken kun je het verkeerslicht laten reageren op de hoeveelheid licht in de omgeving. Probeer bijvoorbeeld door je hand op de micro:bit te leggen het verkeerslicht op groen te laten springen. Je hebt hiervoor een vergelijking nodig, die vind je in het menu Logisch
.
Je kunt ook een aparte fotocel als lichtsensor gebruiken. Deze moet je aansluiten op pin 0, 1 of 2. Let op: Als je verkeerslicht 3 LEDs heeft moet je een van die LEDs aansluiten op pin 8, 12 of 16.
De fotocel sluit je als volgt aan (in dit voorbeeld op pin 2):
Net als in het vorige voorbeeld heb je een vergelijking nodig, dit keer alleen niet met lichtniveau
maar met de waarde van de pin waar je de sensor op hebt aangesloten.
Je kunt op meerdere manieren Python code voor de micro:bit schrijven:
Het voordeel van Mu is dat je code rechtstreeks naar de micro:bit wordt geschreven.
Een overzicht van alle Python functies voor micro:bit vind je hier.
from microbit import *
pin0.write_digital(1)
pin0.write_digital(1)
pin0.write_digital(0)
from microbit import *
pin0.write_digital(1)
sleep(1000)
pin0.write_digital(0)
while True:
pin0.write_digital(1)
sleep(1000)
pin0.write_digital(0)
sleep(1000)
Veel verkeerslichten reageren op de omgeving, bijvoorbeeld wanneer een auto tot de streep rijdt of een fietser op een knop drukt. Gebruik nu de micro:bit knoppen om het verkeerslicht op groen (of juist op rood) te laten springen. De toestand van knop A kun je uitlezen via pin 8: als de knop is ingedrukt geeft deze waarde 0, anders waarde 1. Met een als ( = if) kun je deze controle doen.
while True:
if pin5.read_digital() == 0:
pin0.write_digital(1)
sleep(1000)
pin0.write_digital(0)
sleep(1000)
De lichtsensor op de micro:bit zelf werkt nog niet in Python. Je moet dus een aparte fotocel als lichtsensor gebruiken. Deze moet je aansluiten op pin 0, 1 of 2. Let op: Als je verkeerslicht 3 LEDs heeft moet je een van die LEDs aansluiten op pin 8, 12 of 16.
De fotocel sluit je als volgt aan (in dit voorbeeld op pin 2):
Net als in het vorige voorbeeld heb je een als nodig, alleen moet je dit keer de waarde van pin 2 uitlezen en vergelijken met een bepaalde waarde (zie de micro:bit visueel stap). Let op: je moet nu niet een digitale (0 of 1) waarde maar een analoge waarde uitlezen, hiervoor is weer een aparte functie.
while True:
if pin2.read_analog() > 250:
pin0.write_digital(1)
sleep(1000)
pin0.write_digital(0)
sleep(1000)
Om een arduino visueel te programmeren kunnen we gebruik maken van de mblock5 editor (http://www.mblock.cc/mblock-software/).
Om een verkeerslicht te simuleren beginnen we met 1 led lampje en een arduino. Vervolgens kun je zelf aan de slag om een verkeerslicht in elkaar te zetten.
Let wel op: dit blok moet gecombineerd worden met een functie. Bijvoorbeeld 'groter dan' of 'kleiner dan'.
Kun jij nu met de lichtsensor een LED aan of uit zetten?
Als we met Arduino een programma schrijven dan hebben we altijd 2 'functies' die we altijd gebruiken, Arduino roept deze voor ons aan.
De functies zijn als volgt:
//Deze functie wordt aangeroepen zodra de arduino opstart,
//dit gebeurt dan ook maar 1 keer.
void setup() {
}
//Zodra de setup() functie is afgerond,
//wordt de loop() functie constant aangeroepen.
void loop() {
}
Het is dan ook verstandig om in de void setup()
functie alle instellingen voor het programma uit te voeren.
Vervolgens kunnen we logica, zoals een led aan of uit zetten, in de void loop()
functie zetten.
//Deze functie zorgt ervoor dat een pin op de Arduino als output kan functioneren.
pinMode(pinNummer, OUTPUT);
//Deze functie zorgt ervoor dat een pin op de Arduino als input kan functioneren.
pinMode(pinNummer, INPUT);
//Deze functie stuurt een HOOG signaal naar een pin
digitalWrite(pin, HIGH);
//Deze functie stuurt een LAAG signaal naar een pin
digitalWrite(pin, LOW);
//Deze functie leest een analoge waarde van een analoge pin uit.
analogRead(pin);
//Deze functie kan zo gebruikt worden:
int value = analogRead(pin);
//Deze functie laat het programma een aantal milliseconden wachten:
delay(milliseconden)
We gaan een led programmeren, hiervoor moeten we eerst een aantal instellingen goed zetten. We gaan bijvoorbeeld een pin hoog of laag aansturen. Dit betekent dat de arduino dus een signaal output.
Weet jij nog hoe we een arduino pin kunnen configureren als output
?
Vergeet niet dat we instellingen in de void setup()
functie plaatsen, zodat deze maar een keer uitgevoerd worden.
int groeneLedPin = 0;
void setup() {
pinMode(groeneLedPin, OUTPUT);
}
void loop() {
}
Nu hebben we een pin als output gedefinieerd, kun jij hier een HOOG
signaal naar toe sturen?
int groeneLedPin = 0;
void setup() {
pinMode(groeneLedPin, OUTPUT);
}
void loop() {
digitalWrite(groeneLedPin, HIGH);
}
Het ledje staat nu aan, kun jij het uit zetten?
int groeneLedPin = 0;
void setup() {
pinMode(groeneLedPin, OUTPUT);
}
void loop() {
digitalWrite(groeneLedPin, LOW);
}
En heb je een idee hoe we het ledje kunnen laten knipperen?
int groeneLedPin = 0;
void setup() {
pinMode(groeneLedPin, OUTPUT);
}
void loop() {
digitalWrite(groeneLedPin, LOW);
delay(1000); //1 seconde
digitalWrite(groeneLedPin, HIGH);
delay(1000); //1 seconde
}
Nu hebben we 1 led, kun jij een stoplicht maken met 3 ledjes ?
//Geeft een getal terug tussen de 0 en 1023. (int)
analogRead(pin);
//Sla de waarde op in 'gelezenWaarde'
int gelezenWaarde = analogRead(pin);
We voegen nu een input
toe aan ons systeem, weet jij nog hoe we dit instellen?
int groeneLedPin = 0;
int lichtSensorPin = 1;
void setup() {
pinMode(groeneLedPin, OUTPUT);
pinMode(lichtSensorPin, INPUT);
}
void loop() {
}
Als de waarde van de lichtsensor nu hoger is dan bijvoorbeeld 500, kun jij dan de led uitzetten?
int groeneLedPin = 0;
int lichtSensorPin = 1;
void setup() {
pinMode(groeneLedPin, OUTPUT);
pinMode(lichtSensorPin, INPUT);
}
void loop() {
int gelezenWaarde = analogRead(lichtSensorPin);
if (gelezenWaarde > 500)
{
digitalWrite(groeneLedPin, HIGH);
}
else
{
digitalWrite(groeneLedPin, LOW);
}
}