Arduino Arduino UNO Sam Decoster CoderDojo Roeselare Sam Decoster
Inleiding Arduino is een open-source ontwikkelbord, waarmee het mogelijk wordt om informatica te koppelen aan fysieke objecten. Het is dus een apparaat om fysische informatica makkelijk en toegankelijk te maken. De Arduino wordt dan ook door verschillende groepen gebruikt, hij is oorspronkelijk ontworpen voor designers om in hun kunst interactie te kunnen verwerken. Daarna zijn ook andere hobbyisten, en Industrial Designers de Arduino gaan gebruiken. Hij wordt nu zelfs door elektrotechnici gebruik omdat hij zo gemakkelijk werkt, en er heel veel uitbreidingen te vinden zijn op het internet. Het is dus eigenlijk een kleine computer die fysieke componenten kan aansturen. Je kunt er dus hele robots mee bouwen, of ermee het internet op gaan. Eigenlijk is het dus een makkelijk te programmeren stukje hardware die vrijwel alles kan. Van een vliegtuig aansturen tot het brein zijn van een 3D printer. CoderDojo P. 2 Sam Decoster
Pinmap CoderDojo P. 3 Sam Decoster
Arduino Software De open-source Arduino omgeving maakt het gemakkelijk om een code te schrijven en deze uploaden naar de i/o board. Het draait op Windows, Mac OS X en Linux. Het programma is geschreven in Java en gebaseerd op de verwerking, avr-gcc, en andere open source software. Door gebruik te maken van de Arduino Software (Arduino IDE) is het dus mogelijk om op een simpele manier een programma te schrijven voor een micro-controller zonder kennis te hebben van programmeren in C of andere complexere software. In deze cursus zal het gebruik van deze Arduino IDE stap voor stap uitgelegd worden. Achter elk onderdeel die uitgelegd wordt in deze cursus zijn er ook noch oefeningen zodat je direct aan de slag kunt met het aanleren van het programmeren in Arduino. Aan de linkerkant ziet u een voorbeeld van de ontwikkelomgeving van het Arduino programma. Hierin zal je het programma schrijven die je vervolgens zult uploaden in het Arduino bordje. We merken op dat een basisprogramma in Arduino bestaat uit 2 grote dellen, namelijk: void setup() en void loop() De setup lus wordt slechts 1 keer doorlopen bij het inschakelen van de Arduino. De loop lus wordt continu herhaald. Afbeelding: Arduino Software CoderDojo P. 4 Sam Decoster
Gebruik digitale uitgang Zoals je kunt zien op P.3 beschikt het Arduino UNO bordje over 14 digitale pinnen. Deze digitale pinnen kunnen zowel gebruikt worden als ingang en als uitgang. We gaan momenteel leren hoe deze pin kan gebruikt worden als uitgang. Een uitgang kan een logische waarde hoog 1 bezitten of een logische waarde laag 0 bezitten. Aangezien dat het Arduino bordje werkt op een spanning van 5V is een logische 1 gelijk aan 5V en een logische 0 gelijk aan 0V. Stel nu dat je een LED wil doen oplichten, hebben we een logische 1 nodig (+5V). Dit kunnen we doen door een bepaalde digitale pin van ons bordje een logische 1 toe te kennen en daar een led op aan te sluiten zoals op onderstaande afbeelding. De uitgang 13 (digitale pin 13) is hier via een weerstand verbonden met de Anode van de LED. De Kathode van de led is op zijn beurt verbonden met de GND (massa of 0V). Als we nu een programma schrijven die zegt dat de digitale pin 13 een hoog signaal moet hebben (+5V dus) dan zal de led beginnen oplichten. Schematische voorstelling CoderDojo P. 5 Sam Decoster
Programma Wanneer we hiervoor een programma willen schrijven ziet dit er als volgt uit: /* Maker: Sam Decoster Programma: Brandende LED Datum: 07/02/2014 */ int led = 13; //maak een variabele met de naam "led" die gelinkt is met pin 13 void setup() { pinmode(led, OUTPUT); //zeg dat "led" bedoeld is als uitgang void loop() { digitalwrite(led, HIGH); //plaats de toestand van pin 13 op "1" (+5V) Het controleren en uploaden van het programma We zien links bovenaan enkele blauwe icoontjes staan. Met deze icoontjes kan je je programma controleren of er fouten in je code zitten waardoor het Arduino bordje het programma niet zal kunnen lezen, een icoontje om het programma te uploaden naar het Arduino UNO bordje. 1 2 Knop 1: dient om je programma dat je geschreven hebt te uploaden. Knop 2: dient om je programma te verzenden naar je Arduino UNO bordje. Opmerking: Zorg ervoor dat je bij het versturen van je programma naar Arduino, het juiste Arduino bordje hebt geselecteerd! Het type bord kun je selecteren bij: Werktuigen => Board => Arduino UNO Indien je een ander bordje gebruikt dan de UNO moet je het juiste bordje aanklikken in de lijst CoderDojo P. 6 Sam Decoster
Het resultaat Wanneer je dit alles hebt uitgevoerd kun je zien dat de led zal gaan branden. Dit was een basis uitleg over hoe je een digitale pin kan sturen. In het volgend stuk gaan we gebruik maken van tijd, hiermee kunnen we de led dus laten aan en weer uit gaan (knipper) met een ingestelde tijd. Moest het zijn dat er ergens een fout in je programma zit, zal deze tijdens het controleren gedetecteerd worden en zie je de locatie waar de fout ongeveer zit. LET OP! Arduino is Hoofdletter gevoelig, kijk dus goed of je een hoofdletter plaatst waar nodig we merken ook op dat elke programma regel gesloten wordt met een puntkomma ; CoderDojo P. 7 Sam Decoster
Gebruik maken van een delay Een delay is een regel in je programma waar de microcontroller een bepaalde tijd zal wachten tot hij de volgende regel van het programma leest en uitvoert. De code die we moeten plaatsen in Arduino om tegen de controller te zeggen dat hij even moet pauzeren is het volgende: delay(1000); Het getal dat tussen hakjes staat is de tijd in mille seconden (ms) dat de controller moet wachten Het laten flikkeren van een LED Als we nu een led willen doen laten knipperen moeten we een digitale pin op 1 plaatsen dan een tijdje wachten en vervolgens die pin op 0 plaatsen dan weer een tijdje wachten, Dit moet blijven herhaald worden. Als we dit in een programma gieten, ziet dit er als volgt uit: /* Maker: Sam Decoster Programma: Knipperende LED Datum: 07/02/2014 */ int led = 13; //maak een variabele met de' naam "led" die gelinkt is met pin13 void setup() { pinmode(led, OUTPUT);//zeg dat "led" bedoeld is als uitgang void loop() { digitalwrite(led, HIGH); // plaats de toestand van pin 13 op "1" (+5V) delay(1000); // wacht 1 seconde digitalwrite(led, LOW); // plaats de toestand van pin 13 op "0" (0V) delay(1000); // wacht 1 seconde CoderDojo P. 8 Sam Decoster
Tekening van de schakeling In het programma hebben we gezegd dat de digitale pin 13 zal moeten gaan knipperen 1 -> 0 -> 1 -> 0 CoderDojo P. 9 Sam Decoster
Opdracht 1. Probeer nu een looplichtje te maken van 6 led s 2. Een kleine uitbreiding hierop is het maken van een Knight Rider looplichtje. Dit lichtje zal dan heen een weer gaan lopen. CoderDojo P. 10 Sam Decoster
Het lezen van digitale ingangen Het is niet enkel mogelijk om de digitale pinnen (0 tot en met 13) te gebruiken als uitgang, deze pinnen kunnen ook gebruik worden als uitgang. De ingang aan zo n digitale pin kan dan een logische 1 zijn (+5V) of een logische 0 (massa of 0V). We moeten hierbij wel opletten dat we voor een nul wel degelijk de pin verbinden aan de massa, anders zou het kunnen dat de microcontroller in de Arduino UNO, de ingang als een logische 1 bekijkt i.p.v. een 0. Het maken van zo n 1 en 0 kunnen we doen met een weerstand en een drukknop, (zie onderstaand schema) Wanneer de drukknop niet is ingedrukt, is de ingang verbonden met de massa via de weerstand, dit is dus een logische 0 Wanneer de drukknop wel is ingedrukt, zal er een spanning van 5V over de weerstand staan, en is de ingang dus verbonden met de +5V klem, dit wil zeggen dat we een logische 1 bekomen. Hoe in het programma een digitale ingang gebruiken? Eerst en vooral moet in het deel setup de pin niet als uitgang geplaatst worden maar als ingang. Dit gebeurt met volgende regel: pinmode(inpin, INPUT); De waarde van deze ingang moet dan noch kunnen openslagen worden. Dit kunnen we doen in een variabele, een variabele is een naam dat je zelf kunt kiezen die een bepaalde waarde bezit. De toestand van de ingang kun je dan in de variabele steken met deze code: variabele = digitalread(inpin); tussen de haakjes komt de naam van de pin die je hebt toegekend. De waarde van de variabele kan je dan vervolgens plaatsen op een digitale uitgang, dit gebeurt met volgende code: digitalwrite(ledpin, val); voor de komma tussen de haakjes plaats je de naam van de uitgang die je hebt toegekend als uitgang. Achter de komma plaats je de variabele die de waarde bezit. CoderDojo P. 11 Sam Decoster
Programma Wanneer we nu een programma willen schrijven die de toestand van de ingang inleest en vervolgens deze toestand plaatst op een andere uitgang kommen we volgend programma uit: /* Maker: Sam Decoster Programma: drukknop Datum: 07/02/2014 */ int ledpin = 13; // noem pin 13 "ledpin" int inpin = 7; // noem pin 7 "inpin" int variabele = 0; // maak een variabele en ken de waarde toe void setup() { pinmode(ledpin, OUTPUT); // zeg dat "ledpin" een uitgang is pinmode(inpin, INPUT); // zeg dat "inpin" een ingang is void loop() { variabele = digitalread(inpin); // lees de toestand van de "inpin" (7) digitalwrite(ledpin, variabele); // zet de toestand op de "ledpin" (13) CoderDojo P. 12 Sam Decoster
Voorbeeldtekening Op deze tekening kun je duidelijk zien hoe een drukknop en weerstand geschakeld moet worden. De ingang die hier gebruikt wordt is Pin 2. CoderDojo P. 13 Sam Decoster
AnalogWrite() AnalogRead() Het schrijven van een analoge waarde (PWM signaal) op een pin, kan gebruikt worden om een LEDlicht op verschillende helderheden te laten werken, of om een motor op verschillende snelheden te kunnen laten draaien. Na een oproep analogwrite() zal de pin een blokgolf genereren met een gekozen inschakeltijd (duty cycle). De frequentie van dit PWM signaal is meestal 490Hz, de Pin 5 en 6 hebben een frequentie van 980Hz (wanneer we deze gebruiken voor een PWM signaal). Een PWM signaal bij Arduino UNO kan gegenereerd worden op pin 3, 5, 6, 9, 10 en 11. Op de Arduino mega is dit pin 2 tot en met 13 en 44 tot en met 46. Bij oudere Arduino bordjes die een ATmega8 bezitten kan de functie analogwrite() enkel gebruikt worden op pin 9, 10 en 11. De PWM-uitgangen gegenereerd op pennen 5 en 6 hebben een hogere dan verwachte duty cycles. Dit komt door interactie met de millis () en vertragingsfuncties (), die dezelfde interne timer gebruikt om deze PWM output genereren delen. Dit zal vooral worden opgemerkt op low duty-cycle instellingen (bv. 0-10) en kan een waarde van 0 niet volledig uitschakelen van de uitgang op pennen 5 en 6. Duty Cycle De waarde van de duty Cycle kan gekozen worden tussen 0 (altijd uit) en 255 (altijd aan) analogwrite(pin, DutyCycle) CoderDojo P. 14 Sam Decoster
analogread() analogread(pin) de retourwaarde van een analogread() functie varieert tussen 0 en 1023. Deze waarde kunnen we dan plaatsen in een variabele door het volgende te doen: variabele = analogread(analogpin); Voorbeeldprogramma int ledpin = 9 ; / / LED aangesloten op digitale pen 9 int analogpin = 3 ; / / potentiometer aangesloten op de analoge pin 3 int val = 0 ; / / variabele om de gelezen waarde op te slaan void setup ( ) { pinmode ( ledpin, OUTPUT ) ; / / zet de pin als uitgang void loop ( ) { val = analogread ( analogpin ) ; analogwrite ( ledpin, val / 4 ) ; / / lees de input pin / / analogread waarden gaan 0-1023, analogwrite waarden van 0 255 Tekening CoderDojo P. 15 Sam Decoster
Oefening 1. Open de opdracht van pagina 10, en zorg ervoor dat de snelheid waarmee dat de led s zullen lopen bepaald wordt door een potentiometer. TIP: in plaats van een getal tussen de haakjes te plaatsen bij delay, kun je ook een variabele plaatsen. delay(15); Is ook gelijk aan: Int X; X = 15; delay(x); Je hoeft dus enkel maar de tijd te veranderen door een variabele en bij het begin van het programma de waarde van de potentiometer in deze variabele te plaatsen. 2. Probeer nu hetzelfde programma als hierboven, maar zorg er nu voor dat de tijd noch groter is, de variabele bezit namelijk een waarde tussen 0 tot en met 1023 bij het inlezen van de analoge pin. Zorg er dus voor dat de tijd kan variëren tussen 0 tot en met 4092. Tip: voer een rekenkundige bewerking uit na het inlezen van de analoge pin. CoderDojo P. 16 Sam Decoster
For loop Een for lus wordt gebruikt om een blok instructies een bepaald aantal keer te herhalen. Een for lus bestaat uit 3 grote delen. for (1; 2; 3 { code 1. Initialisatie: bestaat uit: int i = 0 dit gebeurt bij de eerste keer dat de for lus wordt gelezen. 2. Test/controle controlleert of de variabele voldoet aan een bepaalde waarde, indien niet wordt de for lus verlaten. vb: i < 100 3. Voert een bewerking uit met de initialisatie variabele. Iedere keer als de lus wordt herhaalt wordt deze bewerking gedaan. Vb: i++ (dit is gelijk aan i = i + 1) Voorbeeldprogramma Als voorbeeld gaan we een led laten dimmen op een bepaalde snelheid. int PWMpin = 10; //led wordt aangesloten op pin 10 (pwm pin) void setup() { pinmode(pwmpin, OUTPUT) void loop() { for (int i=0; i <= 255; i++){ analogwrite(pwmpin, i); delay(10); In dit programma zal de LED starten in toestand 0 = uit. Dan zal de uitgang geleidelijk stijgen naar 255 = volledig aan dit blijft herhaald worden. CoderDojo P. 17 Sam Decoster
Opdrachten 1. In het voorbeeldprogramma start de led op waarde 0, gaat dan geleidelijk stijgen naar 255, en gaat dan weer bruusk naar 0. Probeer nu een programmatje te schrijven dat de led start vanaf nul geleidelijk stijgt naar 255 en dan in plaats van direct naar 0 terug te keren geleidelijk terug naar 0 te gaan. TIP: in deze opdracht moet je gebruik maken van 2 for lussen. 2. In deze opdracht zullen we het een beetje moeilijker maken. We gaan nu gebruik maken van 2 led s deze 2 led s gaan alle twee traag aan en traag uit alleen willen we nu dat de 1ne led start met toestand 0 en de andere start met toestand 255. Dit wil zeggen dat de 1ne led helderder zal worden terwijl dat de andere led minder helde wordt, dit allemaal op hetzelfde moment TIP: Er moet hier ook gebruik gemaakt worden van 2 for lussen. + dat er een rekenkundige bewerking nodig is voor de 2 de led. 3. Nu je al goed gebruik kunt maken van het sturen van een PWM signaal, en gebruik kunt maken van een for lus, mag je eens je eigen creativiteit gebruiken. In plaats van een gewone led gaan we nu een RGB led gebruiken, dit is led die 3 verschillende kleuren bezit, deze 3 kleuren kunnen ook gedimd worden zodat we de kleuren zelf kunnen mengen. CoderDojo P. 18 Sam Decoster