De Arduino-microcontroller in de motorvoertuigentechniek (7)

Vergelijkbare documenten
De Arduino-microcontroller in de motorvoertuigentechniek (6)

Werkbladen voor Arduino workshop 1

Arduino Workshop 1 Zuid-Limburg

RCL Arduino Workshop 1

In- en uitgangssignalen van microprocessoren

De Arduino-microcontroller in de motorvoertuigentechniek (3)

Tweede workshop Arduino

De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (3)

Oefening 1 - Seriële communicatie via USB

Workshop Arduino voor beginners deel 2

Arduino CURSUS. door Willy - 09-juni-2017

Programmeren met Arduino-software

MAKERKLAS WORKSHOP ARDUINO. Maandag 7 december 2015

Arduino : Morse Voltmeter

De Arduino-microcontroller in de motorvoertuigentechniek (8)

1 Communicatie via de CAN-bus met Arduino-shield

Arduino. Arduino UNO. Sam Decoster. CoderDojo Roeselare. Sam Decoster

Veiligheid,comfort en communicatie (1)

1. Sluit de LED aan zoals afgebeeld 2. Sluit de USB-kabel aan op de Arduino 3. Klik op de knop uploaden 4. De LED begint te knipperen

Arduino Cursus, Deel 2 Programmeren. Simon Pauw, ZB45, Amsterdam

De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (4)

Technology, Innovation & Society Delft

EM2 Microcontroller Project. LED cube

Motormanagement simulatie MegaSquirt Hoofdstuk 3

MegaSquirt motormanagement-simulatie Hoofdstuk: Inleiding

Arduino[4KIDS] Maak je eigen muziekinstrument!

Workshop Arduino - deel 2

Workshop Arduino Uno. Touw dag 6 juni 2015 Harold Pootjes en Simon Pauw

th_elt Hardware & Software

De Arduino-microcontroller in de motorvoertuigentechniek (2)

Naam + Klas: Laptop Nr: Cijfer:

Arduino Zuid-Limburg Workshop 2

Opgave Tussentijdse Oefeningen Jaarproject I Reeks 4: Lcd Interface & Files

De Arduino-microcontroller in de motorvoertuigentechniek (4)

Deel 1: Arduino kennismaking. Wat is een microcontroller, structuur van een programma, syntax,

De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (2)

KAEDU : Outputs en inputs

Inhoud Inhoud. Inleiding 1 Leerdoelen 1

ES1 Project 1: Microcontrollers

Tinyserir-RC5. Datasheet. Tinyserir-RC5 Page: 1 of 8

Arduino. HCC Vlaanderen - Mechelen 7 februari Luc De Cock

Accelerometer project 2010 Microcontroller printje op basis van de NXP-LPC2368

2 Algemene opbouw van een computersysteem

7,6. Samenvatting door A woorden 12 april keer beoordeeld. Natuurkunde. Natuurkunde Systemen. Systemen

2 Elementaire bewerkingen

Inhoudsopgave LED dobbelsteen

delay(1000); // Eén seconde pauze digitalwrite(pin, LOW); // zet 'pin' uit delay(1000); // Eén seconde pauze }

Fig. 2. Fig ,5 4 3,5 3 2,5 2 1,5 U (V) 0, temperatuur ( C)

AVR-DOPER MINI ASSEMBLAGE HANDLEIDING + LAYOUT. Geschreven door: Tom Vocke

Arduino Programmeer handleiding

Hoofdstuk 5: Signaalverwerking

Workshop Arduino voor beginners. door TkkrLab Enschede

De FOR lus: // terug naar waar je vandaan kwam Serial.begin(115200); // communicatie snelheid met de PC

Raspberry Pi Interfacing.

arduino programmeerboek Davy Wolfs

DDS chips. DDS = Direct Digital (frequency) Synthesis. Output = sinusvormig signaal. Maximum frequentie = ½ klokfrequentie

A R D U I N O. addendum bij: Leren programmeren, meten en sturen met de Arduino. 3 e druk INHOUD

Arduino Workshop. door Geert Roumen (CC) BY-SA. lemio.nl/arduino/

Hybride voertuigen (2)

Ar-doe-wie-no. Voorwoord

Netwerk Interfacing Data Logging.

Algemene beschrijving van de regelprogramma's

by Jody Culkin Bronnen die gratis gebruikt, verspreid of aangepast kunnen worden. meestal software of hardware.

Wat is Arduino? Arduino = microprocessor (Atmel)

Automatische spoel installatie voor legionella preventie. NTKC - Bennie ten Haken 27 Mrt

SYSTEMEN 11/3/2009. Deze toets bestaat uit 3 opgaven (28 punten). Gebruik eigen grafische rekenmachine en BINAS toegestaan. Veel succes!

Weerstation. Weerstation met Arduino C.G.N. van Veen. HiSPARC. 1 Weerstation. 2 Arduino. 2.1 Werking van Arduino

Elementaire meettechniek (6)

Arduino Opstartgids.

ES1 Project 1: Microcontrollers

MegaSquirt SMD. MegaSquirt V3.57 SMD Main Board

Na de intro zijn wij begonnen met concepten, en hebben we elk idee dat we hadden op geschreven.

DATA SHEET C2-20. Besturing voor elektrische actuators. DATA SHEET C2-20 A&E Trading b.v. 1

Hand-out Introductieworkshop LED programmeren

PIC Callgever Door PA1RUM

ES1 Project 1: Microcontrollers

Inductiemeter via de parallelle poort

Ravi Ramcharan Arduino PRO Smart leeslampje

Multi Purpose Converter 20A

Klasse B output buffer voor een Flat Panel Display Kolom aansturing

E. Gernaat (ISBN ), uitgave Overzicht meest toegepaste CR-hogedrukpompen

Inleiding elektronica Presentatie 1

HOP9850. void sendfrequency(unsigned long frequency) zie SWEEP9850

Programmering Tiny45 voor de DCC locdecoder

Antwoorden Systeembord Fysische informatica voor de onderbouw havo/vwo

Logische schakelingen

Arduino. C.F.J. Pols.

ES1 Project 1: Microcontrollers

Programmeer-handleiding Easyboard MB

Spanningsdriver 1 Compensatie van spanningsval

by Jody Culkin Bronnen die gratis gebruikt, verspreid of aangepast kunnen worden. meesta software of hardware.

Stappenmotor Interface. Controller

Voorwoord / veiligheidsaanwijzing 3. Sein decoder voor DCC systemen 4. Aansluitingen overzicht van de decoder 4. Aansluiten van de decoder 5

Bouwbeschrijving UniSAI

Installatiehandleiding

Labo digitale technieken

b) Teken op de bijlage welke lampjes van het klokje branden om 19:45:52. Schrijf eronder hoe je dit bepaald/berekend hebt. (3p)

DF405_V5 Universele uitlezing opbouw

// hier wordt de functie: ZegHallo aangeroepen

HANDLEIDING - LEVEL INDICATOR M A N U A L

Transcriptie:

De Arduino-microcontroller in de motorvoertuigentechniek (7) E. Gernaat (ISBN 978-90-79302-11-6) 1 Programma s en projecten 1.1 Oefenprogramma s 1.2 Programma 2 De nu volgende programma s zijn oefenprogramma s. Deze worden gevolgd door twee projectprogramma s. De programma s kunnen in een mapje training worden geplaatst en dat mapje moet dan in de Schetsboek-map van de Arduino worden gezet. Elk programma kan dan door de Arduino worden gecompileerd en geupload. De vragen onderaan het programma moeten worden uitgewerkt. Dit hoofdstuk geeft toelichting op elk programma. De programma-bestanden zijn op de Timloto-site te vinden. Program2.ino Het programma laat de led op de Arduino-Uno print knipperen. Op de print bevindt zich een kleine led die via de Arduino pin 13 (PB5) kan worden aangestuurd. 1. void setup() 2. { 3. pinmode(13,output); 4. } 5. void loop() 6. { 7. digitalwrite(13,high); // Led licht op 8. delay (500); // wacht 500 ms 9. digitalwrite(13,low); // Led dooft 10. delay (500); // wacht 500 ms 11. } Vragen en opgaven (zie toelichting) 1. Compileer en upload het programma. 1

2. Verander de knipperfrequentie zodanig dat het knipperen net niet meer met het blote oog te zien is. 3. Probeer nu eens een signaal te programmeren met een frequentie van 250 Hz. Sluit de oscilloscoop aan op pin 13 en de GND en meet het signaal. 4. Verander nu het signaal zodanig dat de led voor 75% uit is en voor 25% aan. Controleer dit met de oscilloscoop. 5. Verander nu de aan-uit tijd zodanig dat de led op ongeveer de halve lichtsterkte oplicht. Noteer de aan- uittijd voor een volgende opdracht. 1.2.1 Toelichting Omdat de uitgangspinnen diverse modes kennen, wordt in void setup() pin 13 als uitgangspin gedefiniëerd (regel 3). In regel 7 schrijven we een logische 1 (HIGH) naar pin 13. De led gaat dan aan. In regel 8 wachten we 500 ms waarna we de led weer uit zetten (LOW). In regel 10 wachten we weer 500 ms. Door de loop-functie beginnen we hierna weer met regel 7. De led gaat dus voortdurend aan en uit. Een delay in microseconden kan worden geprogrammeerd met de opdracht delaymicroseconds(). 1.3 Programma 3 Program3.ino Inlezen stand van een schakelaar. Het programma zet de led op de Arduino print aan of uit. De interne led is verbonden met pin 13. De schakelaar wordt verbonden met pin 2 (PD2) en de min (GND). De input-pin wordt in de pull-up mode gezet. // ruimte voor variabelen en constanten 1. byte schakelstand = 0; 2. void setup() 3. { 4. pinmode(2,input PULLUP); //configureer pin 2 met pull-up weerstand. 5. pinmode(13, OUTPUT); //configureer pin 13 als uitgangspin 6. } 7. void loop() 8. { 9. schakelstand=digitalread(2); //pin 2 wordt ingelezen. 10. if (schakelstand == HIGH) 11. { 12. digitalwrite(13,high); 13. } 14. else 15. { 16. digitalwrite(13,low); 2

17 } 18 } Vragen en opgaven (Zie toelichting) 1. Verklaar waarom het hier noodzakelijk is om de ingangspin 2 te configureren met de interne pull-up weerstand. 2. Hoe zouden we de schakelaar aan moeten sluiten wanneer we de interne pull-up niet activeren (pinmode(2,input)? Maak een tekening. 3. Wat is het maximale decimale getal dat een variabele byte kan bevatten? 4. Verander nu het programma zodanig dat de led wanneer deze geactiveerd wordt gaat knipperen. 5. Maak nu naar eigen inzicht een nieuw programma. Vervang de schakelaar door een drukschakelaar. Als het programma start, licht de led flauw op en als we de schakelaar indrukken licht de led op volle sterkte op (simulatie remlicht). Schrijf dit nieuwe programm weg onder naam Program3b. 1.3.1 Toelichting In fig. 7.1 zien we een stukje van het inwendige van de ATmega 328/P controller. De programmeur maakt met de INPUT PULLUP statement een FET actief waardoor de pull-up weerstand wordt ingeschakeld. We kunnen dan op eenvoudige wijze een schakelaar met de Arduino-pin en de min (GND) verbinden. Verder wordt in het programma een variabele van het type byte toegepast. Dit + 5V 1 pin 2 PD2 pinmode (2,INPUT_PULLUP) of pinmode(2,input) Figuur 1: We kunnen de ingqangspin zodanig configureren dat intern een pull-up weerstand wordt ingeschakeld. wil zeggen dat de controller één geheugenplaats van 8 bits (1 byte) reserveert. Deze geheugenplaats geven we de naam schakelstand en kennen vervolgens aan de geheugenplaats de waarde 0 toe (initialisatie). In regel 9 wordt de stand 3

van de schakelaar ingelezen en vervolgens wordt de schakelstand 0 of 1 opgeslagen in de variabele schakelstand. Nu moeten we afhankelijk van de schakelstand iets gaan beslissen. We gebruiken hiervoor een if..else statement. Als de schakelstand 1 is doe de led aan zo niet doe de led uit. In een flow-chart (stroomdiagram) ziet dit eruit als in fig. 7.2. schakelstand = 0 led aan ja schakelstand 1? nee led uit Figuur 2: Grafische voorstelling (stroomdiagram) van de if..else statement. 1.4 Programma 4 Program4.ino Het programma toont de PWM-mogelijkheden van de Arduino. De statement die gebruikt wordt om één van de PWM-pinnen aan te sturen is analogwrite. We gebruiken hier pin 10. Om het effect te zien sluiten we een led in serie met een 220 Ω weerstand aan op 5 V en pin 10. Dus plus-aansluiting led op 5 V en min aansluiting op pin 10. We maken gebruik van de for lus om de duty-cycle telkens met 1 stap te verhogen. 1. # define PWMpin 10 //geef aan pin 10 de naam PWMpin 2. void setup() 3. { 4. for (int i=0; i <= 255; i++) // hier wordt i gedefiniëerd als variable. 5. { 6. analogwrite(pwmpin,i); 7. delay(20); 8. } 9. } 10. void loop() // draait leeg 11. { 12. } Vragen en opgaven (zie toelichting) 1. Het programma bevindt zich in de void setup() functie. Om het programma nog een keer uit te voeren moeten we op de resetknop drukken. Waarom? 2. Sluit een oscilloscoop op pin 10 (met of zonder led) en meet het signaal. Verklaar waarom de led langzaam dooft. 4

3. Zet nu het programma in de void loop() functie. Wat gebeurt er nu? Verklaar dit. Gebruik de oscilloscoop. 4. Wat gebeurt er als we de delay-tijd veranderen? 5. Sluit nu de plus van de led aan op pin 10 en de min aan de GND. Wat gebeurt en nu en verklaar de verandering met behulp van het signaal. 6. Softwarematig zouden we ook het effect van de vorige vraag kunnen verkrijgen door de for lus te veranderen in: (int i=255; i>=0 ; i- -). Verklaar dit. 7. De stapgrootte kunnen we veranderen door bijv. van (i++) i=i+5 te maken. Op welke wijze verandert het programma? 1.4.1 Toelichting Fig. 7.3 toont ons de aansluiting van de led op de Arduino-print. Regel 6 Ana- led 470 + 13 12 11 9 8 7 6 5 4 3 2 1 0 USB 10 ~ ARDUINO UNO 14 1 ATmega 328/P 9V 15 28 5V A0 A1 A2 A3 A4 A5 Figuur 3: Aansluiting led op de Arduino-print logwrite suggereert dat er een analoge spanning op pin 10 komt te staan. Dit is echter niet het geval. Het is een aan-uit signaal waarbij we de duty-cycle in 256 (0-255) stappen kunnen variëren. Op de Arduino zijn de PWM-pinnen aangeduid met een teken. We bekijken het programma. In regel 1 geven we pin 10 met een # define een naam nl. PWMpin. Verder zien we in regel 3 t/m 8 dat het eigenlijke programma in de void setup() functie staat. Het wordt dus maar 1x uitgevoerd. In de analogwrite(pwmpin,i) opdracht in regel 6 wordt de waarde van de variable i naar de PWMpin gschreven. De waarde i wordt in de for-lus steeds met 1 verhoogd, te beginnen met 0 en eindigend bij 255. In de void setup functie wordt 256 x naar PWMpin geschreven, elke keer met een getal dat 1 groter wordt. Het programma eindigt wanneer i = 255 wordt bereikt. De for-lus of loop wordt in fig. 7.4 als een flowchart weergegeven. i++ 5

is hetzelfde als i=i+1. Willen we de stapgrootte veranderen dan kunnen we bijv. schrijven i=i+5. begin loop maak i = 0 for (int i=0 ; i<=255; i++) { doe iets; } i = i +1 i <=255? einde loop nee ja voer program uit Figuur 4: Grafische voorstelling (stroomdiagram) van de for-loop. 1.5 Programma 5 Program5.ino Het programma leest een drie-standen of wisselschakelaar in (op pin 7, 8 en de GND aangesloten, zie tekening) en laat de led op de print afhankelijk van de gekozen schakelstand snel of langzaam knipperen. De logische standen van de schakelaar zijn 00,01,10 of 11. Afhankelijk van de gekozen schakelstand kunnen we de led uitzetten of langzaam of snel laten knipperen. Eén stand zal normaal gesproken niet voorkomen. 1. void setup() 2. { 3. pinmode(7,input PULLUP); // pin 7 en 8 als input met een interne pull-up weerstand 4. pinmode(8,input PULLUP); 5. pinmode(13,output); //configureer pin 13 uitgangspin 6. } 7. void loop() 8. { 9. if (digitalread(7) == HIGH && digitalread(8) == LOW) 10. { 11. digitalwrite(13, HIGH); // led 13 knippert langzaam 12. delay (500); 13. digitalwrite(13,low); 14. delay (500); 15. } 16. else if (digitalread(7) == LOW && digitalread(8) == HIGH) 17. { 6

18. digitalwrite(13, HIGH); //led 13 knippert snel 19. delay (100); 20. digitalwrite(13,low); 21. delay (100); 22. } 23. else if (digitalread(7) == HIGH && digitalread(8) == HIGH) 24. { 25. digitalwrite(13,low); //led uit 26. } 27. else if (digitalread(7) == LOW && digitalread(8) == LOW) 28. { 29. digitalwrite(13,low); //led uit of storing? 30. } 31. } Vragen en opgaven (zie toelichting) 1. Er wordt hier gebruik gemaakt van de logische EN (&&). Behalve EN kennen we ook nog..? 2. Teken nu eens de drie-standen schakelaar aangesloten op de Arduino print. 3. Hoe is de spanning op de pin-ingangen 7 en 8 wanneer de led uit is? 4. Wanneer zou de spanning op beide pin-ingangen 0 V kunnen bedragen? 5. Maak nu een waarheidstabel van de schakelaar op de Arduino. 6. Sluit nu zelf een tweede led aan op pin 9 en de GND (Denk om de pinmode) en simuleer een richtingaanwijzer. Pas dus het programma zelf aan en sla dit programma op onder de naam Program5b. Na behandeling van de LCD wordt dit programma gebruikt om ook de foutcode/storing weer te geven. 1.5.1 Toelichting Er wordt hier gebruik gemaakt van de if..else if statement. De twee pinnen van de schakelaar worden ingelezen en met elkaar vergeleken. Als pin 7 LAAG is EN pin 8 HOOG doe dan...als PIN 7 HOOG is EN pin 8 LAAG is doe dan... Zo worden alle digitale variaties op de ingangspinnen bekeken. De programmeur bepaalt vervolgens wat er moet gebeuren. Zie regelnummer 9, 16, 23 en 27 en fig. 7.5. Er is sprake van een bijzondere situatie wanneer de controller 00 inleest. Deze toestand kan alleen maar voorkomen wanneer er sprake is van massasluiting. In dat geval is er een storing. We zetten de led dan uit en we gaan in een volgende opdracht bekijken of we in deze situatie een storingscode naar een LCD-scherm kunnen schrijven. 7

5V pin 7 pin 8 0 0 0 1 1 0 1 1? led rechts aan led links aan leds uit Figuur 5: Aanluiting en waarheidstabel van de de driestandenschakelaar 5V 1.6 Programma 6 Program6.ino Een LCD-schermpje wordt aangesloten op de Arduino UNO en tekst wordt naar de LCD geschreven. Het 16 x 2 LCD-aansluitingcircuit: LCD RS pin naar digital pin 12 LCD E(nable) pin naar digital pin 11 LCD D4 pin naar digital pin 5 LCD D5 pin naar digital pin 4 LCD D6 pin naar digital pin 3 LCD D7 pin naar digital pin 2 LCD R/W pin naar min (GND) LCD VSS pin naar min (GND) LCD VDD pin naar 5V LCD K naar min (GND) loper 10k potmeter naar LCD VO (pin 3) (helderheid display) Andere twee sluitingen potmeter +5V en GND LCD A via R=220 Ω naar + 5V Min(nen) op LCD scherm kunnen worden doorverbonden 1. # include <LiquidCrystal.h> // include file als library (h=header) 2. // initialiseer de library met de nummers van de Arduino pinnen 3. LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 8

4. void setup() 5. { 6. lcd.begin(16, 2); // 16 kolommen en 2 rijen 7. lcd.clear(); // wis tekens LCD 8. lcd.setcursor (0,0); //zet lettertekens op LCD 9. lcd.print( Foutcode ); 10. lcd.setcursor (9,0); // zet lettertekens op LCD 11. lcd.print( P000 ); 12. lcd.setcursor (0,1); // zet lettertekens op LCD 13. lcd.print( Massa-sluiting ); 14. } 15. void loop() 16. { 17. } Vragen en opgaven (zie toelichting) 1. Sluit de LCD aan op de Arduino print. Gebruik hiervoor de speciale kabeltjes. 2. Zet nu -als oefening- bijv. je eigen naam en woonplaats op de LCD. 3. Combineer nu dit programma met Program5b (richtingaanwijzer) en wel zo dat op de lcd links, rechts en uit komt te staan wanneer het geheel correct werkt en dat de LCD de foutcode weergeeft wanneer beide pinnen aan de GND worden gelegd. Schrijf dit programma weg onder Program6b. 1.6.1 Toelichting De introductie-tekst van het programma geeft de aansluiting van het 16 x 2 LCD-scherm weer. 16 x 2 betekent 2 regels en 16 tekens per regel. De regels en tekens beginnen te tellen met 0. Afbeelding fig. 7.6 laat de aansluiting van de LCD op de Arduino zien. Omdat we een aantal min- en plus aansluitingen nodig hebben kunnen we een aantal doorverbindingen op de LCD maken. De verlichting en het contrast van het LCD-scherm kan met een potentiometer worden ingesteld. Om de LCD softwarematig aan te sturen maken we gebruik van de LiquidCrystal library (regel 1). Zo n library bevat functies die we kunnen gebruiken om de LCD aan te sturen; lcd.print() is bijv. zo n functie. In regel 3 moet worden verteld hoe we de LCD hebben aangesloten. Het eigenlijke programma wordt éénmalig uitgevoerd in het void setup() gedeelte. Regel 4 t/m 14. We vertellen eerst in regel 6 dat we met een 16 x 2 display te maken hebben (ook een 16 x 4 LCD is verkrijgbaar), wissen eventuele tekens (regel 7) en bepalen vervolgens de positie op de display (regel 8) en schrijven daar tekst naar toe (regel 9). We geven d.m.v. dubbele aanhalingstekens aan dat we met tekst te maken hebben en niet met een variabele. De hoofdfunctie void loop () blijft leeg. 9

220 LCD aansluiting 1 8 16 0 16 x 2 LCD 15 0 1 1= Vss 2= VDD 3= V0 4= RS 5 = RW 6= E 7= D0 8= D1 9= D2 10= D3 11= D4 12= D5 13= D6 14= D7 15 = A 16 = K 5 4 3 2 12 11 helderheid 10k USB 01 01 + ISP2 13 12 11 10 9 8 7 6 GND ARDUINO UNO 5 4 3 2 1 ISP 0 + 01 01 01 01 14 1 ATmega 328/P 15 28 9V 5VGND A0 A1 A2 A3 A4 A5 Voor extra min of plus (5V) kunnen ook de ISP pinnen worden gebruikt. D4 D5 D6 D7 RS E aansluitdraadjes met label Figuur 6: Aansluiting LCD-scherm op de ArduinoUno. Om het aantal aansluitingen op de Arduino te verminderen hebben we plussen en minnen al op de LCD doorverbinden (gesoldeerd). Verder hebben we de speciale aansluitkabeltjes van een label voorzien om het aansluiten gemakkelijker te maken. De plus(sen) en de min(nnen) sluiten we aan op de ISP-aansluitingen. We houden dan de overige voedingspinnen vrij voor componenten die we aan moeten sluiten bij de andere opdrachten. 10

1.7 Programma 7 Program7.ino De LCD is aangesloten op de Arduino zodat informatie naar de LCD kan worden geschreven. Het programma laat zien op welke wijze variabelen naar de LCD kunnen worden gestuurd en op welke wijze ze kunnen worden weergegeven (decimaal, binair of hexadecimaal). 1. # include <LiquidCrystal.h> // include file als library 2. LiquidCrystal lcd(12,11,5,4,3,2); //geef gebruikte pinnummers op 3. int getal=178; //initiëer de variabele 4. void setup() 5. { 6. lcd.begin(16, 2); //LCD met 16 kolommen en 2 rijen 7. } 8. void loop() 9. { 10. lcd.clear(); 11. lcd.setcursor(0, 0); 12. lcd.print(getal,dec); // geeft decimaal de variabele getal weer 13. lcd.setcursor(5, 0); // geeft binair 178d weer 14. lcd.print(getal,bin); 15. lcd.setcursor(0, 1); // geeft hexadecimaal 178d weer 16. lcd.print(getal,hex); 17. lcd.setcursor(5, 1); // geeft 2 decimalen weer 18. lcd.print(1.23456,2); 19. } Vragen en opgaven (Zie toelichting) 1. Sluit de LCD aan op de Arduino print 2. Verander het getal naar eigen inzicht en verklaar het resultaat. 3. Maak een programma met behulp van een for lus en wel zodanig dat er decimaal van 0 t/m 15 geteld wordt. Laat op de LCD de decimale, de binaire en de hexadecimale code zien. Schrijf het programma weg onder Program7b. 1.7.1 Toelichting Aan het begin van het programma (regel 3) wordt aan de variabele getal het decimale getal 178 toegewezen. Dit is een willekeurig getal. In regel 10 t/m 11

15 wordt dit getal decimaal, binair en hexadecimaal op de LCD weergegeven. Regel 18 laat zien hoe we de cijfers achter de komma van een getal kunnen beperken. De 2 achter 1.23456 geeft aan dat we het getal met een nauwkeurigheid van 2 decimalen willen weergeven. Let op: voor een komma gebruiken de Engelstalige landen een punt en omgekeerd. Dit kan soms verwarrend zijn. 1.8 Programma 8 Program8.ino De loper van een 10k lineaire potmeter wordt aangesloten op pin A0 van de Arduino. De andere potmeter-aansluitingen op +5V en de min (GND). De analoge spanning van de potmeter-uitgang wordt decimaal, binair en hexadecimaal op de LCD weergegeven. De AD-omzetter op de Arduino is 10 bits, maar we kunnen deze ook als 8-bits weergegeven. De LCD is aangesloten op de Arduino en tekst kan naar de LCD worden geschreven. 1. # include <LiquidCrystal.h> // include file als library 2. # define analoginpin A0 //geef pin A0 een naam 3. LiquidCrystal lcd(12,11,5,4,3,2); //initialiseer pinnummers 4. int PotmeterValue=0; 5. int PotmeterValue2=0; 6. void setup() 7. { 8. lcd.begin(16, 2); //Rijen en kolommen van de gebruikte LCD 9. } 10. void loop() 11. { 12. PotmeterValue = analogread(analoginpin); // in 10 bits ADC 13. delay(5); 14. PotmeterValue2 = map(potmetervalue,0,1023,0,255); //out 8 bits ADC 15. lcd.setcursor(0,0); verwijder eerdere tekens 16. lcd.print( ); aantal spaties tussen en is aantal tekens 17. lcd.setcursor(0, 0); 18. lcd.print(potmetervalue2,dec); 19. lcd.setcursor(5,0); verwijder eerdere tekens 20. lcd.print( ); aantal spaties tussen en is aantal tekens 21. lcd.setcursor(5, 0); 22. lcd.print(potmetervalue2,bin); 23. lcd.setcursor(0,1); verwijder eerdere tekens 24. lcd.print( ); aantal spaties tussen en is aantal tekens 12

25. lcd.setcursor(0, 1); 26. lcd.print(potmetervalue2,hex); 27. } Vragen en opgaven (zie toelichting) 1. Sluit de LCD aan op de Arduino print en upload het programma. 2. In eerste instantie wordt de analoge spanning van de potmeter weergeven als 8-bits. 3. Draai aan de potmeter en bestudeer het resultaat. Let vooral op het verloop van de binaire waarde. Valt daar iets op aan te merken? 4. Geef nu de variable PotmeterValue (i.p.v. PotmeterValue2) weer op de LCD. 5. Uit hoeveel bits bestaat nu de binaire weergave en waarom? 6. Wat is de resolutie (kleinste meetvariatie) van een 8 bits A/D omzetter bij een spanning van 5V? 7. Wat is nu de resolutie van een 10 bits A/D omzetter bij een spanning van 5V? 1.8.1 Toelichting In het programma worden voor de weergave eerst de tekens op de LCD gewist. Dit gebeurt door een lege tekststring in de lcd.print() statement te zetten. Omdat we meerdere karakters moeten wissen gebruiken we een aantal spaties tussen en dat overeenkomt met het aantal te wissen tekens. Vooral bij lage spanningen spelen binnenkomende storingen een grote rol. In de techniek worden analoog binnenkomende storingen ook altijd ontstoord. Behalve dat de ingaande draad afgeschermd wordt, wordt er meestal ook een laag doorlaatfilter toegepast. Dit filter bestaat uit een weerstand en een condensator. Hoog frequente storingssignalen worden door de condensator naar de massa (GND) afgevoerd. Zie fig. 7.7. In regelnummer 12 wordt de spanning van de analoge pin ingelezen en de digitale waarde hiervan weggeschreven in de variable PotmeterValue. Dit is een 10-bits waarde. Om deze waarde om te zetten naar een 8-bits wordt de functie in regel 14 gebruikt. Deze typische Arduino-C functie zet de getallenreeks van 0-1023 om in een getallenreeks tussen 0 en 255. Elke waarde wordt dan bijv. door 4 gedeeld en in een nieuwe map opgeslagen. De nauwkeurigheid van de omzetting wordt de resolutie genoemd. In een 8 bits A/D-omzetter vindt de spanningverhoging plaats in stapjes van 5V/256=0,02V. In een 10-bits omzetter zijn de stapjes 5V/1024=0,005V. In de overige programmaregels wordt - na het wissen- de uitgelezen waarde op display weergegeven. AD-omzetters hebben tijd nodig voor de omzetting. In veel programma s treft met een korte delay() functie aan. Zie regel 13. 13

Arduino 1k +5V A0 10bits ADC Controller Afscherming Potmeter 10K 1nF Filter 1uF GND Figuur 7: Ontstoring van de analoge ingangsspanning. 1.9 Programma 9 Program9.ino Krukassignaal simulator, simuleert een 36-1 puls. Signal output-pin 10. De loper van de 10k lineaire potmeter wordt aangesloten op analoge pin A0. Met de potmeter kan het toerental worden ingesteld. Toerental instelbaar tussen 375 en 6000 t/min. 1. # define PULSE PIN 10 2. void setup() 3. { 4. pinmode(pulse PIN, OUTPUT); // maak digitale output 5. } 6. void triggerhigh(int tijdsduur) // variabele toerental wordt var. tijdsduur 7. { 8. digitalwrite(pulse PIN, HIGH); 9. delaymicroseconds(tijdsduur); 10. digitalwrite(pulse PIN, LOW); 11. delaymicroseconds(tijdsduur); 12. } 13. // Simuleert een 36-1 krukas-pulswiel en past toerental aan 14. void loop() 15. { 14

16. int toerental=analogread(0); //lees potmeter op A0 in 17. toerental = map(toerental, 0, 1023, 135, 2500); 18. for(int i = 0; i <= 34; i++) // van 0 tot en met 34 zijn 35 pulsen 19. { 20. triggerhigh(toerental); // eindigt met puls laag 21. } 22. delaymicroseconds(toerental); // verleng de laatste laagpuls 23. } Vragen en opgaven (zie toelichting) 1. Wat is naam van de gemaakte functie die kan worden aangeroepen? 2. Meet met behulp van een oscilloscoop het signaal op pin 10. Bekijk de ontbrekende puls. 3. Bepaal het motortoerental met behup van het oscilloscoopbeeld. 4. Is het inlezen van de potmeter van invloed op het signaal? 5. Verander het signaal in een 60-2 puls en controleer dat met behulp van de oscilloscoop. Schrijf dit programma weg onder de naam Program9a. 1.9.1 Toelichting Dit programma is wat fraaier geprogrammeerd. Op de eerste regel wordt weer gebruik gemaakt van de define opdracht. Deze opdracht vervangt in het programma (pin) 10 voor PULSE PIN. Regel 4 zet de PULS PIN op OUTPUT. Verder wordt er gebruik gemaakt van een zelfgemaakte (user defined) functie. Regel 6 t/m 12. Deze functie heeft de naam gekregen van triggerhigh. Zo n functie kan worden aangeroepen en uitgevoerd vanuit de hoofdfunctie void loop(). In de loop-functie staat niets tussens de haakjes (), met andere woorden de loopfunctie verwacht geen input. De eigen functie triggerhigh heeft een variabele tijdsduur nodig om te kunnen worden uitgevoerd. Als de functie wordt uitgevoerd ontstaat er een puls met de ingevoerde tijdsduur. Zie fig. 7.8. Wanneer triggerhigh funtie (tijdsduur) In functie loop () x 35 verleng laagtijd 1x laatste Figuur 8: De puls die wordt gegenereerd door de functie triggerhigh. 15

we nu naar de hoofdfunctie void loop() kijken, regel 14 t/m 23 dan zien we dat eerst de stand van de potmeter (=simulatie toerental) wordt ingelezen. De variabele toerental is een variabele van het type integer en reserveert 4 bytes. De analoge spanning is een maat voor het toerental en is in eerste instantie 10 bits breed. Deze waarde moet omgezet worden in een tijd die een toerental van 375 tot 6000 t/min mogelijk maakt. Dit wordt gedaan door de al eerder gebruikte map functie op regel 17. In de deze regel zien we dat de gedigitaliseerde waarde van de potmeter (0 tot 1023) evenredig omgezet wordt in 135 tot 2500. Dit is proefondervindelijk bepaald. De waarden van de potmeter variëren dus tussen de 135 en 2500 en stellen dan de tijd in ms voor. Deze tijd (afhankelijk van de stand van de potmeter) wordt aan de functie triggerhigh doorgegeven met de aanroep triggerhigh (toerental) in regel 20. De variabele toerental wordt in de functie omgezet naar de variabele tijdsduur. De for-lus zorgt er voor dat de functie 35x wordt aangeroepen. Is dat gebeurd dan zitten we dus op puls 35. Door de laagtijd van de laatste puls te verlengen ontstaat de ontbrekende tand. Dit vindt plaats in regel 22. Hierna wordt de potmeter weer ingelezen en herhaald het proces zich. Wanneer we nu de oscilloscoop aansluiten op pin 10 en de GND ontstaat een puls overeenkomstig fig.7.9. Figuur 9: Het 36-1 (krukas)simulatiesignaal op de oscilloscoop 1.10 Programma 10 Program10.ino Het programma leest een hoge en/of een lage puls uit welke aangeboden wordt op pin 10. Sluit hiervoor een functiegenerator aan op pin 10 en de GND. Stel de frequentie in op 1 khz en variëer deze. De pulsein() functie leest het niveau hoog of laag van de aangewezen pin uit en de controller begint te tellen zodra het niveau verandert. Verandert het niveau weer dan stopt het tellen. Het telresultaat wordt naar het scherm geschreven. Selecteer hiervoor Seriële monitor in Hulpmiddelen in de Arduino IDE. 1. # define PWM PIN 10 16

2. unsigned int PWMValueHigh; 3. unsigned int PWMValueLow; 4. void setup() 5. { 6. pinmode(pwm PIN, INPUT); 7. Serial.begin(9600); 8. } 9. void loop() 10. { 11. PWMValueHigh = pulsein(pwm PIN, HIGH); 12. Serial.println(PWMValueHigh); 13. PWMValueLow = pulsein(pwm PIN, LOW); 14. Serial.println(PWMValueLow); 15. Serial.println(); // sla regel over 16. delay (500); 17. } Vragen en opgaven (Zie ook toelichting) 1. Bij een duty-cyle van 50% is de periodetijd 2x PWMValue. Klopt dit? 2. Worden de gemeten getallen groter of kleiner bij het oplopen van de frequentie? Verklaar het antwoord. 3. Op welke wijze kunnen we nu de duty-cycle bepalen van een puls? 4. Maak nu een programma dat de duty-cycle weergeeft en schrijf dit weg onder de naam Program10-b. 5. Maak een programma dat het motortoerental op het scherm zet. Ga uit van een 36(-1) krukas-pulswiel. Schrijf dit programma weg onder de naam Program10-c. 6. Schrijf nu het toerental naar de LCD i.p.v. het scherm. Schrijf het programma weg onder de naam Program10-d. 1.10.1 Toelichting De relatie tussen periodetijd en frequentie (toerental) is: frequentie(hz) = 1 s / periodetijd(s). We hebben deze formule nodig om de pulstijd om te rekenen naar het motortoerental. In dit programma schrijven we de variabelen naar het scherm of console. Dit gebeurt seriëel via de USB-poort. Het openen van de seriële poort en de communicatiesnelheid (baudrate) worden in regel 7 ingesteld. De baudrate is ingesteld op 9600 bits/s. De variabelen zijn van het type unsigned int. 17

Het betreft dan uitsluitend positieve getallen tot een grootte van 4294967295. Regel 2 en 3. Hebben we een groter getal nodig dan kunnnen we gebruik maken van een unsigned long int. In regel 12 en 14 worden de variabelen PWMValue- High en Low seriëel naar de console verstuurd. In regel 11 en 13 wordt met de pulsin-functie de tijdsduur van de hoge en lage puls vastgesteld en toegekend aan de twee variabelen. In regel 15 wordt voor een betere leesbaarheid één regel op het scherm overgeslagen. Een delay () in regel 16 maakt het resultaat beter leesbaar. De Seriële monitor maakt het debuggen van een programma ook gemakkelijker. We kunnen immers op deze manier elke variabele in een programma bekijken. 2 Projecten 2.1 Project1, temperatuurmeter In dit project sluiten we twee temperatuur-sensoren aan op de Arduino-UNO. We kunnen dan op twee plaatsen de temperatuur inlezen. Dit zou nuttig kunnen zijn om bijv. de oververhitting en nakoeling van een airco-installatie met elkaar te kunnen vergelijken. We maken gebruik van een LM35 temperatuursensor. De aansluiting is volgens fig. 7.10. Het vervelende is dat de LM35 + 5V Vuit GND onderzijde Figuur 10: De aansluitpinnen van de LM35 vanaf de onderzijde bekeken. LM35 een spanning levert tussen de 0 en 1V oplopend met 10 mv/ 0 C. 1V komt dan overeen met 1000mV/10mV = 100 0 C. De AD-omzetter gebruikt 5V als de hoogst mogelijke spanningswaarde. 1V komt dan overeen met 1/5 x 1024 = 205. 205 als uitkomst van de AD omzetter is dan gelijk aan 100 0 C. Elke stap is dan 100 0 /205 = 0,5 0 (afgerond). In formule vorm wordt dit dan: temp=(5.0*analogread(temppin) * 100.0) /1024 Probeer maar uit door voor temppin 205 in te vullen. De temperatuur wordt dan 100 0 C. Aan deze lage resolutie is echter wel wat te doen. Er is nl. een interne referentie-spanning van 1,1 V ingebouwd. Dat houdt dan in dat de AD-omzetter 1,1 V verdeelt in 1024 stappen. Elke stap is dan 1,1 V / 1024 = 0,001 V = 1 mv (afgerond). Dat is dan gelijk aan ongeveer 0,1 0 C. 5x zo gunstig dus. We bekijken het programma. Project1Temp.ino 18

16x2 LCD display met 16-pins interface is met de Arduino verbonden. Aangesloten zijn twee LM35 temperatuur sensoren om (bijv.) te gebruiken op een airco-installatie. 1. # include < LiquidCrystal.h > 2. # define sensorpin 0 // temp. sensor op analoge input A0 3. # define sensorpina 1 // temp.sensor op analoge input A1 4. LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Toegewezen pinnen LCD 5. void setup() 6. { 7. lcd.begin(16, 2); // Aantal kolommen en rijen LCD 8. lcd.setcursor (0,0); //zet vaste lettertekens op LCD 9. lcd.print( Temp.1 ); 10. lcd.setcursor (9,0); 11. lcd.print( Temp.2 ); 12. lcd.setcursor (5,1); 13. lcd.print ( C ); 14. lcd.setcursor (14,1); 15. lcd.print ( C ); 16. lcd.setcursor(4,1); 17. lcd.print ((char)223); //print gradensymbool 18. lcd.setcursor(13,1); 19. lcd.print((char)223); // print gradensymbool 20. analogreference(internal); 21. } 22. void loop() 23. { 24. float temp = (1.1 * analogread(sensorpin)*100.0) / 1024.0; 25. float tempa = (1.1 * analogread(sensorpina)*100.0) / 1024.0; 26. lcd.setcursor(0,1); // set the cursor to column 0, line 1 27. lcd.print (temp,1); 19

28. lcd.setcursor(9,1); 29. lcd.print (tempa,1); //rond af op 1 decimaal 30. delay (200); //wordt iets stabiler 31. } Vragen en opgaven (Zie ook de toelichting) Het betreft hier een project. Stapsgewijze: 1. Sluit de LCD zodanig aan dat deze ingebouwd kan worden. 2. Upload het programma en controleer of het correct functioneert. 3. Bekijk of het noodzakelijk is om de temperatuur-sensoren te ontstoren. 4. Bouw het geheel in een kastje en en sluit de temperatuursensoren aan op een airco-installatie en zie of het geheel werkt. 2.1.1 Toelichting De meeste zaken in het programma zijn allemaal reeds beschreven. Het graden symbool (een vierkant blokje) is een ascii-code met nummer 223. Regel 17 en 19. Regel 20 activeert softwarematig de interne AD-referentiespanning en de temperatuur wordt berekend in regel 24 en 25. We werken hier met een variabele van het type float. Datatypes van het type float hebben 6 tot zeven cijfers achter de komma. Zij worden opgeslagen als 4 bytes informatie. We kunnen hier uitrekenen dat we tot 110 0 C kunnen meten. Wanneer het noodzakelijk is om de temperatuursensor te ontstoren dan kunnen we gebruik maken van het schema in fig. 7.11. 10mV/graad C +5V LM35 100 Ohm 1uF GND Figuur 11: Ontstoring LM35 temperatuursensor. Info: datasheet LM35 2.2 Project2, PWM-generator Het tweede project is een PWM-generator. Met een potmeter op ingang A0 zal op de analoge uitgang van pin 9 een PWM-bloksignaal staan waarvan de duty-cycle tussen de 0 en 100% instelbaar is. De duty cycle wordt op de LCD in procenten weergegeven. We gaan uit dat het lage gedeelte van het signaal actief moet zijn. Het PWM-signaal loopt in 255 stappen van 0 naar 100%. Nu zal de uitgangpin 9 niet in staat zijn om veel meer dan een aantal ma te leveren. Willen we dus bijv. een stationairklep van een motor aansturen dan zal 20

pin 9 op een driver IC moeten worden aangesloten. Wel moeten we er rekening mee houden dat het signaal dan geïnverteerd wordt. Hier komt het programma. Program Project2PWMout.ino Leest de analoge input van een potmeter op pin A0 in en zet het resulaat om in een range van 0 to 255. Deze waarde wordt naar de analoge pin 9 geschreven waardoor een PWM-signaal wordt gegenereerd van 0 naar 100 % in 255 stappen. Deze PWM-waarde wordt ook naar de LCD geschreven. De loper van een 10k lineaire potentiometer wordt verbonden met de analoge pin A0. De andere twee aansluitingen van de potentiometer gaan naar +5V en de min (GND). De oscilloscoop kunnen we aansluiten tussen de PWM-pin 9 en de min (GND). De signalfrequentie is ongeveer 500 Hz. Aansluiting van de 16 x 2 LCD zoals eerder beschreven. 1. # include < LiquidCrystal.h > 2. LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Toegewezen pinnen 3. #define analoginpin A0 // Analoog input pin voor potentiometer 4. #define analogoutpin 9 // PWM output pin 5. int sensorvalue; // waarde gelezen van de potmeter 6. int outputvalue; // waarde output naar analoog uit 7. int outputpwm; // variabele om duty-cycle op LCD weer te geven 9. void setup() 10. { 11. lcd.begin(16, 2); //LCD aantal kolommen en rijen 12. lcd.setcursor (0,0); //zet vaste lettertekens op LCD 13. lcd.print( Duty-Cycle ); 14. lcd.setcursor (15,0); //zet vaste lettertekens op LCD 15. lcd.print( % ); 16. lcd.setcursor (0,1); //zet vaste lettertekens op LCD 17. lcd.print( laag actief ); 18. } 19. void loop() 20. { 21. sensorvalue = analogread(analoginpin); 22. outputvalue = map(sensorvalue, 0, 1023, 0, 255); 23. outputpwm = map(sensorvalue, 0, 1023, 0, 100); 24. analogwrite(analogoutpin, outputvalue); 25. lcd.setcursor (12,0); //wis pwm-getal 21

26. lcd.print(); aantal spaties is aantal tekens 27. lcd.setcursor (12,0); //PWM 0-100% naar LCD 28. lcd.print(outputpwm); 29. delay (50); voor stabielere uitlezing 30. } Vragen en opgaven (zie toelichting) 1. Sluit de LCD aan en compileer en upload het programma. Draai aan de potmeter en controleer de LCD aanwijzing. 2. Er wordt in het programma 2 x de map functie gebruikt. Waarom? 3. Sluit een oscilloscoop aan op pin 9 en de GND en controleer het uitgaande signaal door aan de potmeter te draaien. 4. Bepaal met de oscilloscoop de frequentie van het signaal. 5. Sluit nu een driver aan op de uitgang 9 en maak gebruik van een kastje om het geheel in te bouwen. 6. Geef een aantal autotechnische voorbeelden van het gebruik van deze tester. 2.2.1 Toelichting De aansluitingen van de componenten op de Arduino laat fig. 7.12 zien. In Duty Cycle 0 99% Laag actief oscilloscoop 13 12 11 9 8 7 6 5 4 3 2 1 0 USB GND ~ 255 stappen ARDUINO UNO 14 1 ATmega 328/P 9V 15 28 5V GND A0 A1 A2 A3 A4 A5 10k Figuur 12: De aansluiting van de potmeter op de A0-ingang en de oscilloscoop op uitgang pin 9. GND de void loop() functie wordt in regel 21 de potmeter ingelezen. Deze waarde zal van 0 tot 1023 lopen. Aangezien de variabele voor het PWM-signaal van het analogwrite statement (regel 24) van 0 tot 255 loopt wordt de range van 0-1023 teruggebracht naar 0-255 (regel 22). Nu moet de waarde op de LCD 22

variëren tussen de 0 en maximaal 100% zodat we op regel 23 opnieuw de range aanpassen en wel van 0 tot en met 100. 2.2.2 Interfacing Aanpassing van in- en uitgaande processorsignalen wordt meestal interfacing genoemd. In dit project willen het PWM-signaal gaan gebruiken om bijv. een magneetklep, een lamp of een motor aan te sturen. Het uitgaande signaal van de Arduino moet dan worden versterkt. Hiervoor kunnen we een transistor of een FET gebruiken. Onze keuze valt hier op de IRL3705N, een MOSFET IC dat een stroom van zo n 90 A aan kan. De wat lichtere 18A IRF640 voldoet echter ook prima. De spanning over de drain-source mag maximaal 200 V bedragen. Een vrijloop-diode om de inductiespanning te elimineren is in hoge mate wenselijk. Een andere eindtrap kan natuurlijk ook worden gebruikt. De ontstekingsdriver zoals de BIP373 van Bosch die voor de MegaSquirt computer wordt gebruikt voldoet ook uitstekend. Hij is wat duurder maar heeft als voordeel dat hij niet alleen rechtstreeks op de Arduino kan worden aangesloten maar ook beveiligd is tegen te hoge inductie-spanningen. Het schema van deze interfaceschakeling toont ons fig. 7.13. Op de twee zwart gekleurde connectoren kunnen we -in dit voorbeeld- de stationaire PWM-klep aansluiten. Min-aansluitingen van diverse spanningsbronnen moeten altijd worden doorverbonden. D G S IRF640 of IRL3705N voeding G D S +12V min IRF640 IRL3705N pin 9 220 100k G D S PWM klep GND interface met MOSFET driver Figuur 13: De interface-schakeling voor het uitgaande PWM-signaal. Het aanbrengen van de hier getekende vrijloopdiode over de PWM-klep moet zeker worden overwogen. 23