Track 2

Afgelopen jaar heb je al wat ervaring opgedaan in het hardware programmeren met de Raspberry Pi. Helaas kan deze Pi niet alles wat je nodig hebt om je bordspel te kunnen aansturen. Tussen de sensoren in je kit, zitten namelijk een aantal analoge sensoren. De lichtsensor is een voorbeeld van een sensor uit je kit die analoog meet. In tegenstelling tot digitale sensoren (zoals knopjes) die twee waarden doorgeven - TRUE of FALSE - moeten analoge sensoren specifiekere waarden kunnen doorgeven. Met een lichtsensor wil je niet meter of het licht is of niet, maar juist hoe licht het is. Zo'n sensor moet dus meerdere waarden kunnen doorgeven. De Raspberry Pi kan zulke waarden niet uitlezen, maar de Arduino wel. De lichtsensoren die in je kit zitten heten LDR's (light-dependent resistors). Hiermee kun je dus lichtsterkte meten. Hoe je die uitleest leer je in Track 4, maar daarom gebruiken we voor dit project dus een Arduino.

Basis Arduino programmeren

De Arduino komt in veel verschillende soorten en maten voor. Met een Arduino kun je net als op je Pi sensoren uitlezen en actuatoren aansturen. Het grote verschil is dat de Arduino geen volwaardige computer is. Zo heeft hij bijvoorbeeld geen operating system. Een Arduino is wat we noemen een microprocessor. Op een Arduino kan maar één programma tegelijkertijd draaien en we hebben een extern programma nodig om onze code op de Arduino te zetten. De zogeheten Arduino IDE. De Arduino IDE is een programma dat op je laptop draait waar je Arduino code in kunt schrijven. Vervolgens compileerd de IDE de code en kun je dit via een USB-kabel op je Arduino zetten. Download en installeer de IDE vast op je computer, want die gaan we nog veel gebruiken de komende tijd.

De IDE is te downloaden op deze pagina:
https://www.arduino.cc/en/main/software

In figuur 2.1 is te zien hoe deze IDE eruit ziet en daaronder leggen we uit hoe we deze gebruiken.

Figuur 2.1: De Arduino IDE

In het grote witte vlak typ je de code die je later op je Arduino wilt zetten. Op het moment dat je een nieuw Arduino project opent, krijg je automatisch onderstaande code te zien:

void setup() {
  // put your setup code here, to run once:

}
void loop () {
  // put your main code here, to run repeatedly:

}

Zoals je ziet lijkt de structuur (syntax) van de taal erg op die van JAVA, dus die zou bekent moeten voorkomen. We zien twee functies staan, de setup() en de loop() functie. In de setup() functie zetten we alle code die we maar één keer willen uitvoeren (zoals het op in-/ of output instellen van de pinnen) en in de loop() functie schrijven we de code die continu opnieuw moet worden uitgevoerd. Deze structuur moet je herkennen van het programmeren van de Raspberry Pi. Het enige verschil is dat je in de Arduino IDE NIET in een andere structuur kan programmeren. Ieder programma MOET een setup() en een loop() functie hebben, anders krijg je foutmeldingen tijdens het compileren.

Nu zijn er heel veel verschillende Arduino's op de markt. Eerst moeten we de IDE vertellen welk type Arduino we willen programmeren. Onder het kopje Hulpmiddelen (of Tools in de Engelse versie) zie je een aantal instellingen staan. Sluit de (Arduino) Nano aan op je laptop en zorg dat je de volgende instellingen overneemt:

  • Board: Arduino Nano
  • Processor: ATmega328 (Old bootloader)
  • Poort: COM??

De Poort moet je instellen op de USB-poort waar jouw Arduino op zit aangesloten. Dit verschilt per computer! Zie je meerdere COM-poorten staan en heb je geen idee op welke de Arduino zit aangesloten? Haal dan je Arduino uit je laptop en open het lijstje met COM-poorten. Onthoud welke er staan, doe de Arduino opnieuw in je computer en open het lijstje opnieuw. De COM-poort die erbij is gekomen, is degene waar jouw Arduino op zit aangesloten.

Van de Nano zijn er een paar verschillende versies. Ten eerste heb je Nano's met verschillende processoren. Op de Nano die jullie hebben gekregen zit de ATMEGA328. Deze moet je selecteren bij de processor. Daarnaast heb je waarschijnlijk een Arduino met een oude bootloader. Die optie moet je dus kiezen bij Processor.

We willen de IDE voornamelijk gebruiken om code op de Arduino te zetten. Als de instellingen goed staan, kun je klikken op het ronde knopje met het pijltje naar rechts. Als je op dit knopje drukt probeert de IDE je programma te compileren en op je Arduino te zetten. Hiervoor moet je de Arduino code (sketch) wel eerst opslaan. De eerste keer vraagt de IDE dit zelf. Navigeer naar een map waar je de sketch wilt opslaan en kies een mooie naam. De IDE maakt op die plek zelf een nieuwe map aan met de naam die hebt meegegeven en zet in die map de sketch als een .ino bestand met wederom dezelfde naam. Een Arduino sketch zit dus altijd in een map met dezelfde naam als de .ino file zelf. Mocht je tussentijds willen controleren of je code klopt, zonder het meteen naar de Arduino te schijven? Dan kan je op het ronde knopje met het vinkje klikken. Dan gaat de IDE je code alleen proberen te compileren, zonder het naar de Arduino te schrijven.

Het zwarte vlak onderaan in de IDE is de console. Hier worden alle statusmeldingen van de compiler in getoond. En in Track 4 ga je leren hoe je via een Seriële verbinding hier statusmeldingen kunt tonen om bijvoorbeeld te kunnen debuggen.

In de vorige Track hebben jullie al kennis gemaakt met het Pinout diagram van de Nano. Deze hebben we nogmaals voor jullie neergezet in figuur 2.2.

Figuur 2.2: Het pinout diagram van de Arduino Nano
(Klik op het plaatje voor een grotre weergave)

In de eerste track hebben we het al gehad over de twee GND pinnen, de 5V pin en de 3V3 pin. Tijd om eens te gaan kijken naar wat andere labels op de Nano. Naast de bovengenoemde labels, zie je de meeste pinnen aangeduid met een getal in een paars label of een A-getal in een donker groen label. Dit zijn de getallen om de pinnen van de Arduino aan te spreken. De A-getallen kunnen naast digitale input ook gebruikt worden voor analoge input. Met uitzondering van pinnen A6 en A7, die alleen analoge input kunnen verwerken. Over de Analoge pinnen leer je meer in Track 4.

Ook wil ik je wijzen op pin 13. Hier zie je namelijk als enige pin een oranje label staan met daarin drie pijltjes. Deze pin is namelijk aangesloten op de build-in led. Op de Arduino zie je namelijk een aantal leds gesoldeerd en één daarvan kunnen we zelf aanspreken, door pin 13 aan te spreken. Dit gaan we in de volgende opdracht doen.

Download de blinking-led opdracht
Om deze .zip te kunnen uitpakken, is de code nodig die op het ticket van Track 2 staat.

Arduino output

In dit onderdeel nemen we je mee in het aansturen van actuatoren via de Arduino. Je gaat zien dat dit in de basis op hetzelfde neerkomt als bij de Raspberry Pi. Eerst moeten we een pin instellen als output en vervolgens moeten we die pin op HIGH of LOW zetten. Onderstaande code, die erg lijkt op het blink programma, heeft voor nu alle regels die we willen gebruiken:

const int LED = 13;

void setup() {
 pinMode(LED, OUTPUT);
}

void loop() {
 digitalWrite(LED, HIGH);
 delay(1000);
 digitalWrite(LED, LOW);
 delay(1000);
}

We beginnen eerst met het declareren van een constante om het pin nummer in op te slaan. Een constante is een eigenlijk een variabele die je later in je code niet meer kunt aanpassen. Dit doen we om verschillende redenen. Allereerst is het nu in je code zelf duidelijker welk componenten we aanspreken, dan wanneer we alleen maar getallen tegenkomen. Daarnaast kan het voorkomen dat je de fysieke schakeling van je project misschien wel eens wil veranderen. Als je dan je LED ineens op een andere pin aansluit, hoef je dat nu maar op 1 plek te weijzigen. Anders moet je heel je code doorlopen en hopen dat je overal het juiste nummertje hebt aangepast. Tot slot gebruiken we een constante, om te voorkomen dat we de waarde verderop in de code een andere waarde geven. Want het is niet zo dat componenten tijdens het draaien van de code ineens op een andere pin worden aangesloten. Een constante maakt je aan door het woord const voor de declaratie van een variabele te zetten. Een ongeschreven regel daarbij is dat je namen van constanten in hoofdletters schrijft. Dan is verderop in je programma nog duidelijk te zien wat constanten en wat variabelen zijn.

De aangemaakte constante wordt in zowel de setup() als de loop() functie gebruikt. We zetten in de setup() functie de pin op output en zorgen er in de loop() functie voor dat de led om de seconde aan en uit gaat. Met de digitalWrite() functie kunnen we per pin nummer meegeven of de pin hoog (HIGH) of laag (LOW) moet zijn. Op het moment dat we een pin hoog zetten, zetten we spanning op de pin en zal de LED aan gaan. Op het moment dat we de pin laag zetten, halen we juist de spanning van de pin en zal de LED uit gaan. De delay() functie werkt vrijwel hetzelfde als de time.sleep() functie uit Python. Het enige verschil is dat je bij de delay() functie milliseconden moet meegeven en je hem niet eerst hoeft te importeren. Een delay van 1000 milliseconden is dus een delay van 1 seconde.

Genoeg uitleg voor nu. Het is de hoogste tijd om zelf eens een beetje te spelen met Arduino code.

Voor het maken van de opdrachten ben je altijd vrij om de code van de site te kopiëren naar de IDE en vewrvolgens aan te passen. Het enige probleem is echter wel dat je dan een aantal onzichtbare karakters mee kopieërd waar de Arduino IDE foutmeldingen op geeft. Om dit op te lossen moet je alle enters en tabs weghalen en zelf opnieuw toevoegen. Je kunt uiteraard wel zelf de code overtypen.

Let op! Denk eraan dat je bij deze opdracht een weerstand opneemt in je schakeling! We gaan het niet altijd blijven vermelden, maar in het begin geven we je nog even een reminder.

Download de Arduino output opdracht
Om deze .zip te kunnen uitpakken, is de code nodig die op het ticket van Track 2 staat.

Arduino input

In dit onderdeel nemen we je mee in het uitlezen van digitale sensoren via de Arduino. En je zult zien dat dit wederom in de basis op hetzelfde neerkomt als met de Raspberry Pi. Eerst moeten we een pin instellen als input en vervolgens kunnen we van een pin uitlezen of hier een hoog of laag signaal opstaat. Onderstaande code heeft voor nu alle regels die we willen gebruiken:

const int BUTTON = 13;

void setup() {
 pinMode(BUTTON, INPUT_PULLUP);
}

void loop() {
  if (!digitalRead(BUTTON)) {
    // Doe iets als de knop wordt ingedrukt
 else
    // Doe iets als de knop NIET wordt ingedrukt
 }
}

We beginnen wederom met het declareren van een constante die in zowel de setup() als de loop() functie gebruikt kan worden. Vervolgens zetten we in de setup() functie de pin op INPUT_PULLUP, waardoor meteen de pin op input wordt ingesteld en meteen de pull-up resistor hoog wordt gezet. Met deze toevoeging zetten we de pull-up resistor die aangesloten zit op de desbetreffende pin hoog. Een pull-up resistor is een ingebouwde weerstand in de Arduino, die intern aangesloten zit op een pin. Door de pull-up resistor hoog te zetten, zetten we spanning op de pin via deze ingebouwde weerstand. Zo hoef je dus niet bang te zijn dat je Arduino doorbrand, want er zit al een standaard weerstand in. Deze optie gebruik je meestal speciaal voor knopjes en dergelijke. (De Pi heeft ook pull-up resistors)

Let op! Soms vind je schakelingen op het internet waar mensen hun knopje op de 5V (of 3.3V) hebben aangesloten. Er zijn manieren om dit werkend te krijgen, maar altijd met behulp van een weerstand. Als je een knopje op de 5V aansluit en er geen weerstand tussen doet, is de kans groot dat je Arduino doorbrand! De bovenstaande methode met de pull-up resistor raden wij als docenten aan, omdat dit de meest veilige is.

In de loop() functie zie je een if-statement. De functie digitalRead(BUTTON) geeft de status terug van de pin die je als parameter hebt meegegeven. Als er spanning op de pin staat geeft de functie True terug, anders geeft de functie False terug. (Ook output pins zou je met deze functie kunnen uitlezen) Omdat de pull-up resistor hoog staat, geeft de functie False terug als de knop wordt ingedrukt. Als de knop namelijk niet is ingedrukt, kan de spanning nergens heen. De spanning blijft daardoor op de pin staan, waardoor de functie True uitleest. Op het moment dat de knop wordt ingedrukt, loopt de stroom weg van de pin naar de Ground en leest de functie False uit.

Download de Arduino input opdracht
Om deze .zip te kunnen uitpakken, is de code nodig die op het ticket van Track 2 staat.

Hall effect switch

Nu je weet hoe je een knopje moet uitlezen, is het uitlezen van de hall effect switch die ook in je kit zit niet heel moeilijk meer. Een hall effect switch is namelijk gewoon een knopje die dicht gaat op het moment dat er een magneet bij wordt gehouden. In figuur 2.3 is te zien hoe je de switch moet aansluiten.

Figuur 2.3: Een hall effect switch aangesloten op een Nano

De hall effect switch die jullie hebben, zet je met de halfronde kant naar je toe in je breadboard. Alle pinnen moeten zoals in het plaatje in hun eigen rij van het breadboard staan. Daarvoor moet je de drie pinnen een klein beetje uit elkaar trekken. Vervolgens sluit je de linker pin aan op de 5V van je Nano, de middelste op een Ground van je Nano en de meest rechter gaat naar een digitale pin. Vervolgens zet je op die pin gewoon de pull-up resistor aan en kun je op de manier zoals hierboven is beschreven, onder het kopje Arduino input, de switch uitlezen. Als je nu een (sterke) magneet bij de switch houdt, gaat deze dicht en registreert je Nano alsof er een knopje is ingedrukt. Werkt je magneet niet? Draai deze dan even om. De verschillende kanten van de switch registreren ook een andere pool van de magneet.

Track 2 eindopdracht

Nu heb je voldoende informatie om de eindopdracht voor Track 2 te maken. Heb je de opdracht als groep werkend? Roep er dan weer een docent bij om de opdracht te laten aftekenen. Als de opdracht goed is, krijgen jullie een ticket voor Track 3.

Let op! Denk bij het maken van deze opdracht aan de weerstand voor de led en de pull-up resistor voor de switch!

Download de Track 2 eindopdracht
Om deze .zip te kunnen uitpakken, is de code nodig die op het ticket van Track 2 staat.