Het eenvoudigste signaal dat onze Arduino kan sturen is een digitaal signaal. Hier zijn maar twee mogelijkheden AAN of UIT.
De code:
In het voorbeeld hiernaast worden de drie vaste LEDs op de Brainbox telkens één seconde aan en uit gezet.
Stap 1) Voor welke pin gebruik je liever een naam?
Het is vaak duidelijker om je pins een naam te geven, zodat in je code duidelijk blijft waarvoor ze dienen. Dat kan door voor void setup de namen te geven die aan een bepaalde pinnummer verbonden worden. Hiervoor gebruik je doorgaans const int , dit is een int, zoals je die kent van Processing, die wordt gebruikt voor een getal dat niet meer zal veranderen in je code, bijvoorbeeld:
const int BLAUW = 13;
const int GEEL = 30;
const int ROOD = 17;
Stap 2) Welke pin dient als input of als output?
In void setup geef je aan welke pin je als INPUT of als OUTPUT wil gebruiken.
Meestal geef je hier gewoon de nummer van de pin op je Arduino. Bijvoorbeeld:
pinMode(18, OUTPUT); // Pin 18 is een OUTPUT
Indien je je pin een naam hebt gegeven gebruik je hier de naam. Bijvoorbeeld:
pinMode(BLAUW, OUTPUT);
// Pin BLAUW (Hierboven aangeduid als de naam voor pin 13) is een OUTPUT
STAP3) Wat moet er gebeuren in mijn programma?
In void loop beschrijf je wat er moet gebeuren in je programma. Welke pin zet je HIGH, welke pin zet je LOW?
Met de digitalWrite functie geef je een HIGH of een LOW signaal naar een PIN
Met de delay functie blijft je programma voor een bepaalde tijd wachten in je toestand zoals aangegeven in je programma. De parameter bij de delay functie geeft aan hoelang je wil wachten (in milliseconde). Bijvoorbeeld:
void loop () {
digitalWrite (LED_BUILTIN, HIGH);
// zet de LED aan (spanning HIGH)
delay (1000); // wacht een seconde
digitalWrite (LED_BUILTIN, LOW);
// zet de LED uit (spanning LOW)
delay (1000); // wacht een seconde
}
In dit voorbeeld zullen de drie vaste LEDs van de Brainbox om de beurt één seconde aan en één seconde uit gaan.
Indien je externe LEDs wil aansturen dan kan je de nummers in de eerste drie regels aanpassen naar de digitale pins op je Arduino die je hiervoor wil gebruiken.
De digitale pins:
Op je Brainbox Arduino bord heb je heel wat contactpunten en enkele ingebouwde uitvoerorganen (LED's en buzzer). Hiernaast zie je een schema van de Brainbox Arduino die we gebruiken in de klas. De meestegbruikte digitale pins zie je in het rode vak bovenaan. Voor hun nummer moet je enkel naar het tweede nummer kijken. A0/18 is dus pin 18 en A5/23 is dus pin 23.
INPUT en OUTPUT:
Alle blauwe pins mogen we gebruiken als digitale pins voor uitvoer (OUTPUT). In de praktijk zal je vooral pin 18 tot 23 gebruiken als digitale invoer- en uitvoerpins. Je kan daar bijvoorbeeld een schakelaar of een LED op aansluiten.
De interne LED's kunnen we bedienen met pin 13 (blauw) pin 30 (groen) en 17 (rood). De buzzer met pin 7.
Let op de 5V pins geven altijd 5 Volt, de GND pins gebruik je als de negatieve pool om je kringloop te sluiten.
De digitale pins:
Op de Arduino Uno heb je opnieuw heel wat contactpunten en één ingebouwde LED als uitvoerorgaan. Hiernaast zie je een schema van de Arduino Uno.
INPUT en OUTPUT:
Je zal hier vooral pin 2 tot 13 gebruiken als digitale invoer- en uitvoerpins. Je kan daar bijvoorbeeld een schakelaar of een LED op aansluiten.
Pin 0 en pin 1 zijn wel digitale pins, maar die gebruik je best nooit in je programma, omdat die ook voor signalen van en naar je laptop zorgen.
Ook de Analoge IN pins kan je als digitale pins gebruiken, maar in de praktijk zal je die daar zelden voor gebruiken.
Interne LED: Pin 13 is ook verbonden met de interne LED (L).
Lees de 3 delen hierboven (digital OUT, pinoverzicht Brainbox en UNO) grondig en zorg dat je alle stappen goed begrijpt.
Maak nu zelf een eenvoudig looplicht (enkele LEDs die opeenvolgend branden) op je Arduino binnen Tinkercad. Je mag hiervoor gerust de basis van je herhalingsopdracht met het proefexamen gebruiken.
Wie nog niet vertrouwd is met het werken met Arduino in Tinkercad kan eerst het filmpje hierover bekijken onderaan de Arduino pagina.
Verander de naam van project in Tinkercad naar Oef1_Naam_Voornaam
Heb je vragen? Zet ze in het forum op Smartschool.
Je kan je Arduino naar de spanning op een bepaalde pin laten kijken en afhankelijk van die spanning iets laten uitvoeren. Het eenvoudigste voorbeeld met een digitale input en een digitale output is waarschijnlijk: als een drukknop is ingedrukt, dan moet er een LED branden.
Hiernaast zie je de code en de schakeling.
De code:
In het voorbeeld hiernaast wordt een schakeling met een LED en een schakelaar gemaakt. Wanneer de schakelaar wordt ingedrukt, dan begint de LED te branden.
Stap 1) Voor welke pin gebruik je liever een naam?
Pin 8 noem ik schakelaar.
Pin 10 noem ik LED.
const int schakelaar = 8;
const int LED = 10;
Stap 2) Welke variabelen heb je nodig om een toestand te meten?
Aangezien ik nu een waarde ga lezen op de schakelaar moet ik ook een variabele aanmaken die de gelezen waarde kan bewaren. Ik geef hier ook de beginwaarde in. Die is hier 0 wat hetzelfde is als LOW (je mag één van beide gebruiken).
int schakelstand = 0;
Stap 2) Welke pin dient als input of als output?
In void setup geef je aan welke pin je als INPUT of als OUTPUT wil gebruiken.
pinMode (LED, OUTPUT);
pinMode (schakelaar, INPUT);
Stap 3) Wat moet er gebeuren in je programma?
In void loop beschrijf je wat er moet gebeuren in je programma.
Met de digitalRead functie ga ik kijken naar de spanning op een bepaalde pin.
De variabele schakelstand houdt de waarde bij die ik lees op pin 8 (schakelaar).
schakelstand = digitalRead (schakelaar);
Indien de spanning HIGH is, zet de LED aan (HIGH), anders zet de LED uit (LOW).
if (schakelstand == HIGH) { // indien schakelstand is HIGH
digitalWrite (LED, HIGH); // zet spanning pin 10 op HIGH
}
else { // in alle andere gevallen
digitalWrite (LED, LOW); // zet spanning pin 10 op LOW
}
In het voorbeeld hierboven zie je dat er bij de drukschakelaar een weerstand gebruikt werd. Dit noemen we een 'Pulldown-weerstand'.
Waarom gebruiken we een die? In de praktijk geeft een drukknop soms nog foute signalen naar onze Arduino. Dat komt omdat er soms nog een kleine spanning op de pin staat. Onze Arduino denkt dan dat de schakelaar is ingedrukt terwijl dat niet het geval is.
Om zo'n vals signaal te vermijden wordt een hoge weerstand (10000 Ω) geplaatst tussen de pin die gelezen wordt door onze Arduino en de GND van onze Arduino. Als er toch nog wat spanning zou staan op de pin van onze Arduino, dan kan die nu naar GND verdwijnen via onze weerstand.
Wanneer onze schakelaar ingedrukt wordt zal er nauwelijks stroom wegvloeien naar de GND omdat onze weerstand zo groot is.
Gebruik bij schakelingen steeds de volgende regels (zie het laatste schema met LED en drukschakelaar als voorbeeld):
Kies voor de draad die van 5V of van de +pool van je voeding komt zoveel mogelijk een rode kleur.
Kies voor de draad die van je GND of van je -pool van je voeding komt zoveel mogelijk zwart.
Indien er meer dan één draad naar je 5V of je GND gaan, gebruik dan de rode rail (5V) en de zwarte rail (GND).
Kies voor draden naar en van je pins uiteenlopende felle kleuren.
Probeer je schakeling overzichtelijk te houden.
Lees de delen 4, 5 en 6 hierboven (Digital IN, pulldown resistor gebruiken, enkele afspraken..).
Dupliceer je schakeling van oefening 1 'Oef1_Naam_Voornaam' in Tinkercad.
Ga in het dashboard met je circuits op Tinkercad naar oefening1, klik op het tandwiel en klik dan op 'duplicate'.
Verander de naam van je schakeling in Oef2a_Naam_Voornaam in Tinkercad.
Voeg nu een schakelaar met een pulldown-resistor toe aan je schakeling.
Ga je code nu uitbreiden, met wat je hierboven in deel 4 geleerd hebt, zodat je looplicht van oefening 1 pas brandt als je de schakelaar ingedrukt hebt.
Ga nu je code opnieuw aanpassen zodat je het volgende resultaat krijgt: Wanneer je drukschakelaar is ingedrukt gebeurt er niets, wanneer je drukschakelaar niet is ingedrukt dan brandt je looplicht.
Lees hierboven '6) Enkele afspraken bij het maken van schakelingen' nog eens. Maak nu van je schakeling een ordelijke schakeling volgens de afspraken.
Lees nog eens grondig deze pagina, zodat je alle onderdelen begrijpt en kan toepassen. Test jezelf met de lijst hieronder of dat allemaal lukt.
Heb je vragen? Zet ze in het forum op Smartschool.
Een circuit dupliceren in Tinkercad
Digitaal betekent dat er enkel gekeken en doorgegeven wordt of er wel (HIGH) of geen (LOW) spanning op een pin staat.
Maak voor elke input een variabele aan waarmee je de toestand van een pin kan bijhouden.
Indien je liever een naam dan een nummer gebruikt voor een pin dan kan je een pin een naam geven met const int...
Met de pinMode() functie geef je aan welke pin je als INPUT of als OUTPUT wil gebruiken.
Met de digitalRead() functie kijkt onze Arduino of er spanning (HIGH) of geen spanning (LOW) staat op een pin.
Met de digitalWrite() functie geeft onze Arduino spanning (HIGH) of geen spanning (LOW) door aan een pin.
Met de delay() functie blijft ons programma in dezelfde toestand voor het gegeven aantal milliseconden.
De basis: Jullie hebben nu geleerd hoe een drukknop een digitaal IN signaal geeft. Toch is het nog wel een uitdaging om je code zo op te bouwen dat je een telsysteem bekomt dat begint te tellen bij 0 en telkens je op de drukknop duwt er maar één bijtelt.
Het eerste idee is natuurlijk dat je bij elk digital HIGH signaal een variabele 'teller' gaat verhogen met 1. De basis voor zo'n schakeling en code vind je hieronder.
Je mag van deze basis vertrekken maar zorg wel dat je Serial Monitor de waarde van de teller weergeeft. Test dit dan al eens uit.
Probleem: Je zal merken dat je Arduino bij het drukken op de knop meteen veel langer verdertelt. Het probleem zit hem hier in de snelheid van onze Arduino.
Bij het indrukken van de drukknop gaat je programma immers meerdere keren door void loop. Als je in je code bij elk HIGH signaal 'teller +1' doet, dan zal je bij merken dat je teller telkens veel verder telt dan 1 erbij.
De teller verbeteren: Hiervoor moet je in je code een oplossing zoeken. Er zijn vast meerdere oplossingen, maar een mogelijkheid kan zijn dat er bij je teller maar 1 mag worden bijgeteld nadat je Arduino eerst een LOW signaal heeft geregistreerd. Dat zou je bijvoorbeeld kunnen oplossen met een boolean die 'toestemming geeft om te tellen' als je digitalRead een LOW heeft gelezen.
Let op een boolean in Arduino is een 'bool'. Bijvoorbeeld:
bool teltoestemming = true;
In je code zal je dan moeten aangeven dat je teller er 1 mag bijtellen als hij de teller 'toestemming' heeft om te tellen. Zodra hij er 1 heeft bijgeteld mag er niet verdergeteld worden tot de drukknop weer is losgelaten.
De telling weergeven: Wanneer je je telling helemaal goed hebt gekregen, dan wordt het tijd om die weer te geven op een LCD zoals hiernaast. Je vindt deze in je Arduino-doos en bij de Tinkercad onderdelen. We noemen dit een 7-delig LED display.
De schakeling kan je vinden op de site bij de onderdelen.
Je mag dit display zien als een 8 losse LEDs met twee weerstanden. Met het schema op de pagina kan je dan zien welke LED's je zal moeten laten branden om een getal weer te geven. Let wel goed op dat je steeds je weerstanden goed plaatst. Zonder weerstand branden je LEDs door en is je display niet meer bruikbaar!
Maak in je code best meteen een functie voor elk getal, waarin je aangeeft welke LEDs bij dat getal moeten branden en hou de code goed bij, zo kan je die later opnieuw gebruiken.
Opdracht: Zorg nu dat alle getallen worden weergegeven van 0 tot 9, en dat je teller daarna opnieuw begint bij 0.
Als je de schakeling gemaakt hebt met de onderdelen van je doos, stuur dan een filmpje door met je Arduino code . Als je de schakeling en code in Tinkercad hebt gemaakt, stuur de link dan door. Veel succes!