Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar....

21
Arduino C.F.J. Pols [email protected]

Transcript of Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar....

Page 1: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

ArduinoC.F.J. Pols

[email protected]

Page 2: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

2

Page 3: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

3

Inhoudsopgave

Introductie 4

Programmerendeel1 7

Programmerendeel2 9

Elektronicadeel1 11

Programmerendeel3 13

Elektronicadeel2 16

Programmerendeel4 17

Functies 20

Benodigdheden voor deze moduleArduinoBreadboardJumperkabelsWeerstanden(220Ω;330Ω;1,0kΩ;10kΩ)Potmeter(1kΩ;10kΩ)Diode2xLDRLED(rood,geel,groen)RGBLEDServomotorDCMotor5xDrukknop2N2222transistorLCDActievepiëzoelement

Benodigde voorkennisWetvanOhm(R=U:I)Serieschakeling(stroomsterktegelijk)Parallelschakeling(spanninggelijk)Vermogen(P=UxI=I2·R)Werkingdynamo/elektromotor 

Page 4: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

4

Introductie

LeukdatjeaandeslaggaatmetArduino!WellichthebjenoggeenideewateenArduinoisenwatjeermeekunt.EenArduinoiseensoortmicrocomputer.DeArduinosluitjeaanopeencomputerwaarbij jeeenprogramma (inArduinonoemenzedateensketch) stuurtnaardeArduino.DeArduino voert vervolgens je geschreven script uiten zorgt voor de uitvoer. Zo kun je een koelkast opeen bepaalde temperatuur houden, een zelfrijdenderobotaansturen,lichtsensorenmaken,eenlcdschermop je shirt aansturenen ga zomaardoor.Ook is hetmogelijk om geen software te gebruiken en alleenmet de elektronica te spelen. De Arduino is dan despanningsbron.

IndezemodulegaanweaanhetwerkmetdeArduinoen lerenwedebasismogelijkhedenvaneenArduino.BijhetwerkenmeteenArduinohebjetweebelangrijkeonderdelen:DeArduinoeneenbreadboard.DeArduinoisdecomputer,metinvoerenuitvoermogelijkheden.Op het breadboard sluit je de elektronica aan dieaangestuurdwordtdoordeArduino.

Breadboard

Hetbreadboardheeftaanbeidezijdestweekolommendieverbondenwordenmetdevoeding(+en-).De+kantsluitjeaanopde5VuitgangofopeenuitvoerpoortvandeArduino.De–kantsluit jeaanopdeGND(ground)vandeArduino. Alhoewel je de constanteoutput nietaltijdgebruikt, ishetwelverstandigomdezealtijdaantesluiten.Hetbreadboardheeftrijenenkolommen,ziehiernaasten hieronder voor een opgewerkte breadboard. Depuntenineenrijzijnmetelkaarverbonden.Maarlatenwehierniettelangbijstilstaan…wegaanaandeslag!

NB:VaakmoetjeevenaangeveninwelkeUSB-PoortjeArduinozit.Ditdoejedoorinhetprogrammategaan naar: Hulpmiddelen/Poort. Daar kun je dejuisteUSBpoortaanklikken.

Page 5: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

5

Opdracht 1 Het aansluiten van een LED

Een LED is een diode die licht uitzendt als er stroomdoordeLEDgaat.DeLEDlaatstroommaardoorinéénrichting.De langepootvandeLEDmoetaltijdopde+kantaangeslotenworden,dekortepootopde–kant,zieonderstaandfiguur.

De stroom door een LED magmeestal maar 20 mA zijn. Despanning over de LED is danongeveer 2,0V, deze waardesverschillen een beetje per soortLED, zie onderstaande tabel.De Arduino levert een 5,0 Vspanning. De LED moet dus inserie geschakeld worden meteen weerstand. De weerstandmoet dus minimaal 150 Ω zijn(R=U/ I=3,0/0,020=150Ω).

a)Erisgeenweerstandaanwezigvan150Ωmaarweleenvan220Ω.Zoekdeweerstandopmetbehulpvandekleurcode:deeersteringmoetroodzijn,detweederingookendederderingbruin(22·10).Eenanderemogelijkheidisrood,rood,zwart,zwart.

b)Sluitnude5VuitgangvandeArduinoaanopde+kolomendeGND(ground)uitgangvandeArduinoaanopde–kolom.

c)SluitdeLEDendeweerstandinserieaan,ziedetekening.

d)VerbinddeArduinoviadeusbmetdecomputer.AlsjehetgoedhebtgedaanbrandtdeLED!

Doordatderodeledbijlagerespanninglichtuitzendtdanbijvoorbeeldeengroeneled,kunjeeenkleinereweerstand bij groene en blauwe led’s gebruiken. Zobrandenzeuiteindelijktochnogevenfel!

Kleur Drempelspanning (V)Blauw2,3Groen2,0Rood 1,5

Page 6: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

6

Opdracht 2 Een knipperende LED

Nukun je je ledwel latenbranden,maardaarhebje nog niet veel aan… Een volgende stap is de LEDaansturenmetbehulpvaneen stukje code.OmdeLEDaantesturenmetbehulpvancodemoetjeeenuitvoerpoort (bijvoorbeeld pin 13) van de Arduinoverbindenmet jeLED.De5Voutputheb jenunietnodig,pin13 levertnudespanning. Indetekeningziejedatdezewelverbondenis,bijgrotereprojectenvergeetjesnelde5V,vandaar!

a)BouwdeopstellingdiejezietindetekeningensluitdeArduinoaanopdecomputer.

WewillendeArduinoaansturen,daarvoorgebruikenwehetArduinoprogramma.

b)Openhetprogrammaenopenhetscriptblinkvia:bestand/voorbeelden/basis/blink.

c)Controleerhetscriptmethetvinkje.Mochthetprogrammanietwerken,dangeefthetonderaaneenfoutmeldingweer(hetkanzijndatjedeCOM-poortmoettoewijzen,ditdoejeviahulpmiddelen/poort).

d)UploadhetscriptnaarjeArduinomethettekentje .(snelcode:ctrl+u)

e)Beschrijfkortwatjeziet.Probeerwatjezietteverklarenmetbehulpvandecode.

f)VeranderhetscriptzodatdeLEDsnellerknippert.

g)SluitdrieverschillendeLEDlampjesaan,veranderhetscriptzodatzeomdebeurtaanstaan.

h)Veranderhetscriptenmaakeenverkeerslichtwaarbijoranjemaarevenaanstaat.

Page 7: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

7

Programmeren deel 1

Arduinoheefteeneigenprogrammadat gebaseerd is op C++. Heb je alervaring met programmeren en/of met C++ (of java), dan is hetprogrammeren heelmakkelijk. Hebjegeenervaringmetprogrammeren?Het is veel minder moeilijk dan jemisschienweldenkt!

Bovenaan het script Blink staat/* dit betekent dat alles na ditbegintekenenvoorhetafsluitteken*/ commentaar is. Hier zet je neerhoe het programma heet, wat hetdoet, wie het gemaakt heeft enwanneerjehetvoorhetlaatsthebtveranderd.

Eentweedemogelijkheidomcommentaartoetevoegenismetbehulpvan//.Allesopdezelfderegelna//iscommentaar.Zokunjebijhoudenwatdecodeopdieregeldoet.Metbehulpvandesnelcodectrl/kunjecodesnelomzettennaarcommentaar.

Voordatdebelangrijkstecodewordtuitgevoerdmoetjezeggenwaterpreciesaangestuurdwordt.Wegevenaandatinpin13ietszitendatdeArduinodaareenoutput(spanning)geeftalsjijdatwilt.Ietsnetterzouzijnomnogvoordesetupaantegevenhoepin13heet:jegeeftdepineennaam(intLEDrood=13;).Wiljepin13vervolgensaansturen,dankanjedatdoenmetdenaamLEDrood.

Alleswattussendeaccoladesvandeloopstaatwordtcontinuherhaald.Eerstwordtpin13hoog(5,0V)gemaaktmetbehulpvandecodedigitalWrite(digitalWritekanalleenaanofuit).Daarnamoethetprogramma1000mswachten(delay)voordatdevolgenderegelcodewordtuitgevoerd.Devolgenderegelcodemaaktpin13weerlaag(0,0V).

Depinwordtaangestuurdmeteenhoogofmeteenlaagsignaal.Zitdaarnogietstussen?Jaennee…Deoutputisaltijd0,0Vof5,0V.MaarjekuntdeLEDweldimmendoormaareenbepaaldetijddeLEDaantezetten.AlsdeLEDsnelgenoegknippertziejenietdatdeLEDknippert,hetlijkteralleenopdatdeLEDminderfelbrandt.WanneerjeeenLEDwiltdimmengebruik jeeenoutputmethetsymbool~.DitiseenPulsWidthModulation(PWM).DewaardevandePWMzittussende0(geheeluit)en255(geheelaan).

void setup() pinMode(13,OUTPUT);

void loop() digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000);

Page 8: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

8

Opdracht 3 Een LED dimmen

a)Bouwdeopstellingdiehiernaaststaat.GebruikbijdeoutputeenPWMpin,bijvoorbeeldPin9(letop,deLEDhoeftnietaangeslotentewordenaandeconstantespanning,despanningwordtnugeleverddoorpin9).

b)OpenhetscriptFadeindevoorbeelden/basisenuploadhetscript.

c)Beschrijfwatjezietenprobeermetbehulpvandecodeeenteverklarenwatergebeurt.

d)VeranderdecodezodatdeLEDsnellervolledigbrandtensnelleruitis.Letop,erzijntweemanieren!Probeerzeallebeiuit.

e)IndecodestaatanalogWrite.VoorheenhebbenwedigitalWritegebruikt.Leguitwaaromdatnunietkan.

Opdracht 4 Een aan en uit knop voor de LED

WekunnennudeLEDmetbehulpvandecodeaanenuitzettenenzelfsdimmen.Maarvaakwiljeookeenschakelinghandmatigaanenuitkunnenzetten.Daarvoorhebbenweeendrukknopnodig.

a)Bouwdeschakelingdiehiernaaststaat.Letopdatjeeengroteweerstandgebruiktzodatdeteleverenstroomniettegrootis,eenArduinoisnamelijkslechtinhetleverenvangrotestroomsterktes.

Het idee isnudatwepin2gebruikenals INPUT.Pin2meetdespanning op dat punt (vergelijkt deze met 0,0 V). Dit gebeurtmetdecodedigitalRead().Dezekannueenhoog(5,0V)oflaag(0,0V)signaalmeten(meteenanalogepin,A0t/mA5,kunnenook tussen gelegen waardes (10 bits) gemeten worden). Pin 2meetalleeneenspanningalsdeknop(button)ingedruktwordt.

b)OpenhetscriptButtonviaexamples/digitalenuploadhetscript.

c)DrukopdeknopencontroleerwanneerdeLEDuitisenwanneerdezeaanis.

d)Pashetscriptaanzodatdefunctievandeknoppreciesomgedraaidwordt.

NB:Met de button is er iets bijzonders aan de hand. Dezeheeft namelijk een zogenaamde Bounce. Dit betekent datde spanning niet direct van 0 naar 5V gaat maar, nog eenkeer op en neer gaat. Dit komt omdat er in de button eenveerzitdieopenneergaat.Bijhetgebruikenuitlezenvande button is het dus handig om een delay in te bouwen…

Page 9: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

9

Programmeren deel 2

HetscriptButtonisuitgebreiderdanwevoorheenhebbengezien.Welopenstapvoorstapdoorhetscript.

Wehebbentemakenmettweepoortenwaarietsmoetgebeuren.Pin2iseeninvoerenpin13moeteenuitvoerzijn.Depinverandertniet,dit iseenconstante (const).Het iseengehelewaarde,een integer(int).Wegevenpin2eenherkenbarenaam,pin2heetnubuttonPin.Pin13heeftdenaamledPingekregen.

We willen straks weten wat de ‘staat’ van de knop is (ingedruktof niet). Deze kan 1 of 0 zijn. We moeten even vertellen dat

we de staat van de knop willen weten (aanmaken van een variabele) en deze strakswillen vergelijken. Voordat we het script laten draaien is de buttonState gelijk aan 0.

Zoalsgezegd,wemoetenevenvertellendatde ledPineenOUTPUTisendebuttonPineenINPUT.Zo,datwetenzenudanook…

Ermoet iets gebeuren als de knopwordt ingedrukt.Aanhetbeginvandeloopwordtdeknopuitgelezen(eigenlijk wordt er alleen gecontroleerd of er een5,0 V spanning over de weerstand staat). Daarnavolgt een if-statement. Als (if) de knop is ingedrukt(buttonState==HIGH)danmoetdeLEDgaanbranden(digitalWrite(ledPin, HIGH);). In alle andere gevallen(else),moetdeLEDnietbranden(digitalWrite(ledPin,LOW);).

Het is een makkelijk if-statement. Je kuntook meerdere voorwaarden stellen. Alsje twee knoppen tegelijk in moet drukkenvoordat de LED gaat branden zet je &&tussen de tekens (if buttonState1 == HIGH&& buttonState 2 == HIGH)). Je kuntook het teken || gebruiken. Dan moet ofde ene voorwaarde gelden of de andere.

Helaasblijfthetlampjenunognietbrandenalsjedeknophebtingedrukt.Jekunterwelzelf voor zorgen dat je met één knop hetlampjeaanenuitkanzetten.Vergeet niet de nieuwe variabele (int) tedefiniërenaanhetbegin!

const int buttonPin = 2; const int ledPin = 13;

int buttonState = 0;

void setup() pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT);

void loop() buttonState = digitalRead(buttonPin); if (buttonState == HIGH) digitalWrite(ledPin, HIGH); else digitalWrite(ledPin, LOW);

void loop() buttonState = digitalRead(buttonPin); if (buttonState == HIGH && state == LOW) state2 = HIGH; if (buttonState == HIGH && state == HIGH) state2 = LOW; state = state2; digitalWrite(ledPin,state); delay (100);

Page 10: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

10

Opdracht 5 Het beveiligen van een kluis

Dekluisvandebankisbeveiligd.Dekluisgaatpasopen(deLEDbrandtpas)alsertweesleutelswordenomgedraaid(knoppeningedrukt).Eensleutelgatbevindtzichopdekamervandedirecteur,deanderezitnaastdekluis.

Bouwdebijbehorendeschakelingenprogrammeerhetscriptzodanigdatdekluispasopengaatalsbeidesleutelstegelijkwordenomgedraaid.

Opdracht 6 Een wisselschakeling

Alsjeonderaandetrapstaatwiljehetlichtbovenaandetrapaanzetten.Bovenaandetrapzitnogeenlichtknop.Daarmeekanjehetlichtweeruitofaanzetten.Bouwdeschakelingmettweeknoppenenschrijfhetprogrammazodat jeeenwerkendewisselschakelinghebt. Luktditnietmeteen?Probeerhetdaneerstmeteenenkeleknop. Opdracht 7 Een voetgangersoversteekplaats

Voor voetgangers is een speciale overgangsplek gemaakt. Deze plek ligt aan een drukkeweg.Alsergeenvoetgangerszijn,staathetverkeerslichtvoordeauto’soprood.Ophetmomentdateenvoetgangeroverwil steken,druktdezeopdeknop.Het verkeerslicht voordeauto’s gaatdanvangroennaargeelnaarrood.Voetgangershebbendan15secondeomovertesteken.Hetverkeerslichtvoorhenstaatopgroen!Dangaathetgroenelampjevijfkeerknipperenenspringtoprood.Eensecondelaterspringthetverkeerslichtvoordeauto’sweeropgroen.

Maakditsysteem.

Page 11: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

11

Elektronica deel 1

Wanneer je alleen een knop en een LED gebruikt ben je sneluitgekeken en heb je nog nauwelijks iets gedaan… We willenrobots aansturen, racemachines niet tegenmuren laten botsen,kassenautomatischaansturenengazomaardoor.Daarhebbenwesensorenvoornodig.Vrijwelalle sensorenwerkenhetzelfde,de weerstandswaarde verandert bij eenveranderendeinput(bijvoorbeeldlichtofkracht).Wegaanbeginnenmeteenlichtsensor.VooreenlichtsensorhebbenweeenLDRnodig,ziedefoto.LDR staat voor Light Dependent Resistor (lichtafhankelijke weerstand). De weerstandswaardeverandert met veranderende lichtintensiteit, ziedegrafiek.

We sluiten de LDR in serie aan met een Ohmse weerstand (eenweerstandmeteenconstanteweerstandswaarde).Zohebbenweeenspanningsdelergemaakt.EendeelvandespanningstaatoverdeLDReneendeelvandespanningstaatoverdeweerstand.HetenigewatwemoetendoenisdespanningoverdeLDRuitlezenenwewetenhoelichthetis!

Het isbelangrijkomietsmeertewetenoverhoeeenspanningsdelerwerkt: bij het uitlezen van een sensor maken we gebruik van eenspanningsdeler.DeLDRendeOhmseweerstandstaaninseriezodatergeldt:Rtotaal=RLDR+RΩ.De bronspanning is 5,0 Volt en omdat de weerstanden in serie geschakeld zijn geldt dat destroomsterkte overal gelijk is. De stroomsterkte bereken jemet: I =Ubron :Rtotaal. De spanningwordtnetjesverdeeldendegrootsteweerstandkrijgtdemeestespanning.Alsjedezeinformatiecombineertziejedatdeverhoudingtussendespanningengelijkisaandeverhoudingtussendeweerstanden:ULDR:UΩ=RLDR:RΩ.

Alshetlichteris,wordtdeweerstandswaardevandeLDRkleinerwaardoorerminderspanningoverdeLDRstaatmaarmeerspanningoverdeOhmseweerstand.DespanningoverdeLDR(ULDR=5,0·RLDR/(RLDR+RΩ))kunjemetenmetbehulpvandeANALOGINvandeArduino.Despanningisdaneenmaatvoordegemetenlichtintensiteit.

InwelkgebiedjesensorgevoeligmoetzijnbepaaltdekeuzevooreenOhmseweerstand.Ziedetweedegrafiek.DeLDRheefteenwaardetussende10kΩen20kΩ:duskieseengroteweerstand!

Page 12: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

12

Opdracht 8 Een lichtsensor

Deschakelinglijktergopdeschakelingvanopdracht4.AlleennugebruikenweeenLDReneenANALOGIN.

a)Bouwdeschakeling.

b)OpeninhetscriptanalogReadSerial:examples/basics/Analogreadserial.

Debelangrijkstecodevindjehieronder.

void loop() int sensorValue = analogRead(A0); Serial.println(sensorValue); delay(10);

DeArduinokrijgtdeopdrachtomdeanalogepoortuittelezen(analogRead(A0)).Dezewaardewordt gehangen aan de variabele sensorValue. Vervolgenswillenwe dezewaardeweten. Dewaardewordtdanookgeprintvoorons(Serial.println(sensorValue);),dezeistelezenmetbehulpvandeseriëlemonitor(hetloepjerechtsbovenin).Voordestabiliteitishetgoedomeendelayintebouwen.

c)UploadhetscriptnaardeArduinoenleesdewaardenuitmetbehulpvandeSerial Monitor.

d)BedekmetjehanddeLDR.Verandertdegegevenwaarde?

e)Combineeropdracht3endezeopdracht.ZorgervoordatdeLEDfellergaatbrandenalshetdonkerderwordt.

f)Breiddeschakelingverderuitzodatjedeheleschakelingookmeteenknopaanenuitkanzetten.

g)Legmetbehulpvangrafiek2uitdateengrotewaardevanRΩervoorzorgtdatdeLDRinhethelebereikvrijwelevengevoeligis.

h)Bedenkeenmanieromdesensorzelftelatenijken.Duslaatdesensorzelfdeminimaleenmaximalewaardebepalen.

Opdracht 9 Reactietijd meten

Bouweenreactietijdmeterwaarbij iemandzosnelmogelijkopdeknopmoetdrukkenalseenrodeLEDuitgaateneengroeneLEDaangaat.Omditlastigertemakenvoordepersoondiemoetdrukkenkunjegebruikmakenvanfunctierandom(a,b).Waarbijaenbgetallenzijn,zokanjeeenwillekeurigedelay inbouwen.De functiemillis() geeftaanhoeveelmillisecondeervoor bij zijngegaan.

Page 13: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

13

Programmeren deel 3

De Arduino kan niet alle waardenuitlezen. De ANALOG IN heeft een 10bitschip.Ditbetekentdater210=1024waarden doorgegeven kunnen worden.Hetisalsofjede5,0Vin1024-1kleineblokjes verdeelt. De waarde die jeuitleestbijopdracht8isdusooknietdespanningzelf,maarhetgetaldatbijeenspanninghoort.Hetgetal223hoortdusbij:223/1023·5,0=1,09V.DePWM(~)iseen8bitssysteemenkandus28=256waardengeven.

Oei… zie je het probleem?We kunnenlezen met 1023 verschillende waardesmaar schrijven kan maar met 255waardes…. Gelukkig is er een code diezorgtvoorautomatischeschalen (map).

De functiemap wil 5 getallen hebben. Heteerste getal is de waarde die de analogepoortuitleest.Hettweedegetalishetlaagstegetal datuitgelezen kanworden,hetderdegetaldegrootstewaardedieuitgelezenkanworden.Dithoevennietperse0en1023tezijn,dewaardeverkrijgjebijhetijkenvanjesensor.Degevoeligheidvanjesensorkandusookzitten tussen500en900, ziewederomgrafiek2uitprogrammerendeel3.Hetvierde

envijfdegetalgevenhetbereikvandeoutputweer.Inhetvoorbeeldmoeteeninputwaardevan500eenoutputwaardewordenvan255.Eeninputwaardevan900moeteenoutputwaardevan0worden.

Eenfunctiedieookhandigis, isdefunctie++.Elkekeeralsdeloopdevolgendecyclus ingaat,wordtdewaardemet1verhoogd.Zokunjebijvoorbeeldeenvoudig bijhouden hoeveel loops (iteraties) er al zijngeweest.Ookishetmogelijkomopdiemanierelkekeereen andere pin aan te sturen of later een frequentie teveranderen.Als++bestaat,danzal --ookwelbestaan.Endatklopt.--zorgtervoordatdewaardemet1wordtverlaagd.Beidecodes kunnen in een for-loop geplaatst worden. Dit iseen loop binnen de loop. Kijk eens naar het voorbeeldwaarbijereensoortaftelmechanismeinzitvoordathetprogrammazelfbegint…(letop,devariabeleimoetjenogwelevendeclarerenvoordesetup!

void loop() sensorValue = analogRead(sensorPin); brightness = map(sensorValue,500,900,255,0); Serial.println(sensorValue); delay(10); analogWrite(ledPin,brightness);

void loop()for(i<5;i++;) digitalWrite(LEDPin,HIGH); delay(100-i); digitalWrite(LEDPin,LOW); delay(100);[…]

Page 14: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

14

Opdracht 10 Sneller programmeren

Herschrijfopdracht2hmetdefunctie++.

Opdracht 11 Alarmschakelaar

Onderdekassavaneenwinkelziteenschakelaar(drukknop),alsdezewordtingedruktdanmoetereenpulserendalarmbel(ditmaalnogeenLED)gaan.Maakditsysteem.

Opdracht 12 Een RGB LED

EenRGBLEDheeftvierpootjes.IndeLEDzitteneigenlijkdrieLED’sverwerkt.DoordedrieLED’smetbehulpvaneenPWM(~)aantesturenkunjekleurenmengenenzotussenliggendekleuren krijgen. Nu kunnen we via de software de sterktevanelke kleurbepalen,maarhet zou leuk zijnwanneerweook handmatig de kleuren kunnen instellen.We gebruikenhiervoorvariabeleweerstandenookwelpotmetersgenaamd.

De potmeter heeft drie poten. Eentje voor de 5,0 Vin,eentjevoordeaarde (0,0V)eneenpootvoorhetuitlezenvandemetermetbehulpvaneenanalogepin,zieookdefiguurhiernaast.Als jededraaiknopvandepotmeterdraait,verandertdeweerstand,ditverandertdusookdewaardevandespanningdiejeuit leest.Eenpotmeterisduseigenlijkeenspanningsdeler.

a)Bouwdeschakeling.

b)Schrijfdebijbehorendecodewaarbijjeeerstdewaardevandepotmeteruitleesten vervolgensdeRGBLEDaanstuurt.

c)ProbeerdeverschillendestandenvandeRGBLedencontroleerofhetplaatjehierondergoedovereenkomtmetdekleurenvandeLED.

Page 15: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

15

Opdracht 13 De snelheid van een elektromotor

Eenelektromotor zorgtervoordat vanelektrischeenergie bewegingsenergie gemaakt wordt. Eenelektromotorvindjeinalleapparatendiebewegenen werken op elektriciteit. De snelheid van eenelektromotor is afhankelijk van de spanning overdemotor.WewerkenindezelesdusmetdePWMpin (~). We kunnen natuurlijk direct de snelheidvandeelektromotorinonsscriptzetten,maarhetzouhandiger zijnwanneerwede snelheid vandeelektromotorkunnenaanpassen,bijvoorbeeldmetbehulpvaneendraaiknop.Wegaangebruikmakenvaneenvariabeleweerstand,ookweleenpotmetergenoemd.

a)Bouwderechterzijdevandeschakelingmetdepotmeter.Deelektromotorhoefjenognietaantesluiten.

b)LeguitwaaromdesignaloutvandepotmeternaareenANALOGINmoet.

c)Leguitwaaromdediodeisopgenomenindeschakeling.

d)Programmeerhetbijbehorendescriptzodatdesnelheidvandraaienvandeelektromotoringesteldkanwordenmetbehulpvandepotmeter.Gebruikdaarbijdemapfunctie.

Page 16: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

16

Elektronica deel 2

Eenelektromotorkanveel stroomvragen.DeArduino is slecht inhetleverenvanveelstroom.Omtochgrotestroomvragerstevoorzienvandebenodigdestroomkunjegebruikmakenvaneenexternespanningsbronzoalseenbatterij.Danhebjenogweleentransistornodigzodatjedegroottevandestroomkuntregelenenjedesnelheidvandraaienvandeelektromotorkuntaanpassen.

Detransistor(hiergebruikenwealleeneenzogenaamdeNPN-transistor)heeftdriepootjes,ziedefoto.Linkszitdeemitter,inhetmiddendebaseenaanderechterzijdedecollector.(LETOP!Bijverschillendetransistorswordtdevolgendeomgedraaid,wijhebbende2N222transistor).Tenalletijdenwordtaandecollectordeexternevoeding(+zijde)verbonden.Spanningoverdebasebepaaltoferstroomgaatlopennaardeemitter.Daarmeeiseentransistoreensoortvankraan:dehoeveelheidspanningbijdebasebepaaltdehoeveelheiddoorgelatenstroom.DebasemoetdaaromaangestuurdwordenmeteenPWMpinalsjedesnelheidwiltregelen.

Bijerggrotestroomsterktesmoetjeeengroteretransistorgebruikenofeentjemeteenkoelelementzodatdetransistorz’nwarmtekwijtkan.

Opdracht 14 De snelheid van een elektromotor deel 2

Deschakelingvanopdracht13isteeenvoudigenhetkangoedzijndatdeArduinoteweinigstroomlevert. Zeker wanneer je de DC motor snel wiltlatendraaien.

a)Bouwdeschakelingzoalshiernaastweergegeven.

b)Gebruikhetscriptvanopdracht12enuploadhetprogramma.Kandeelektromotordaadwerkelijkharderdraaien?

Page 17: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

17

Programmeren deel 4

Voor het aansturen van sommige apparaten zijn al scripts geschrevenwaardoor het aansturen van de apparaten eenvoudiger gaat. Een van dieapparateniseenservomotor.Eenservomotoriseensoortelektromotordie180okandraaien.Derotatiehoekkannauwkeurigingesteldwordendoordatdezewerktmeteen ingebouwdepotmeter.Omgebruik temakenvaneenservohebbenwehetvolgendescriptnodig.

Eerstwordthetscriptuitdebibliotheekopgehaald.Daarna noemen we de servo mijnServo en krijgtdezedebeginpositie0.

MetmijnServo.attach(9)zeggenwedatdeservoverbondenismetpin9.UiteraardisditweereenPWMpoort.

Nuishetmogelijkdeservotesturen.Waarbijposstaatvoordepositie,diekantussen0en180zitten.Decodevoorhetsturenvandezeservowordtdan:mijnServo.write(pos);Eenservomotorkanniethelemaalronddraaienzoalseengewoneelektromotormaarwekunnenwelheelgoedrichtenmeteenservomotor.DitkomtomdaterindeServoeenpotmeterzit,desturinggaatdusviahetuitlezenvandespanning!

#include <Servo.h>Servo mijnServo;int pos = 0;void setup() mijnServo.attach(9)

Page 18: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

18

Opdracht 15 Een lichtwijzer

Gebruikopdracht8alsbasis.VervangdaarindeLEDdoordeservomotor.Jekuntopdeservoeenwijzerplakkeneneenschaalverdelingmakenzodatdewijzeraangeefthoelicht/donkerhetis.

Opdracht 16 Zo veel mogelijk zonlicht

Zonnepanelen worden neer gezet om stralingsenergie,afkomstigvandezon,omtezetteninelektrischeenergie.Depanelenvangenhetmeestelichtopalszeloodrechtopdezonstaan.Deaardedraaitenwezoudendepanelenmeemoetenlatendraaienomzoveelmogelijkenergieoptevangen.Datgaanweindezeopdrachtdoen.

Op een groot veld staan alle zonnepanelen opgesteld zoalszonnepaneel1.Zonnepaneel2en3staanbeideeenbeetjegedraaidtenopzichtevanpaneel1.Jekuntnugoedziendatdezonnepanelendemeesteelektrischeenergieproducerenals zonnepaneel2en3evenveelelektrischeenergieproduceren.Paneel2vangtnumeerlichtstralenopdanpaneel3.Hethelesysteemzouduslinksomgedraaidmoetenworden.

InplaatsvaneenzonnecelbeginnenwemeteenLDR.

a)Bouwdeschakelingenprogrammeerheteerstestuk waarbijjedewaardenvandeLDRkanuitlezen.

b)ZetdeflitservanjetelefoonaanenleesmetbehulpvanSerial.println(LDR1);dewaardenvanLDR1enLDR2uit.Beweegjetelefoonvanlinksnaarrechtsenbekijkhoedewaardenvariëren.

c)Schrijfnuhetstukjecodevoordeservo.LaatdeservonaarlinksdraaienalsLDR1meerlichtontvangtdanLDR2enandersom.Denkeraandatdeservogebruikmaaktvaneenpotmeterenjedusookgebruikkanmakenvandemapfunctie.

d)Leguitdatalaardigindebuurtkomtvanhetdraaienvandezonnepanelen.

Page 19: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

19

Opdracht 17 LCD

MeteenLCDscherm(liquidcristaldisplay)ishetmogelijkominformatieteprintenopeenkleinscherm.Daardoor ishetnietmeernodigomgebruiktemakenvandeseriëlemonitor(endecomputer)omgegevensuittelezen.

a)Maakdeopstellingdiehierstaat.

b)OpenhetprogrammaHelloWorld,dezestaatbijFile/examples/LiquidCrystalenuploadhetprogramma.(letop!BijHelloWorldstaatjebacklightnognietaan,dezestuurjemetpin7(zethetstukjecodeerin).Jekuntookdebacklightaltijdaanhebben,verbinddannietmetpin7maarmetde+.

c)ProbeerhetscripttelezenenkijkofjesnaptwatdeLCDlaatzien.

Het scriptmaaktgebruikvaneen library.Een library iseen stukcodedatgeschreven isdooranderen, hierdoorwordt het programmeren je een stukmakkelijker gemaakt. Van heel veelverschillende sensoren zijn al libraries gemaakt, het is dus alleen zaak deze te vinden. Vaakluktdatwelviabijvoorbeeld instructables.comofarduino.cc.Demogelijkefunctiesstaandanaangegeven. Alle mogelijke functies voor deze library staan op: https://www.arduino.cc/en/Reference/LiquidCrystal

Evenkijkennaarhetscript:Nahetinlezenvandelibrarywijzenwedepinnenaandiegebruiktworden. In de setup wordt aangegeven dat de lcd 16 kolommen en twee rijen heeft (lcd.begin(16,2);). Ookwordtermeteende teksthello,worldgeprint (alles indesetupwordt1xgedaan!).IndeloopwordtdetijddatdeArduinoaanis(millis();)geprintnaardeLCD,enwelnaarregel2.

d)Breidjeschakelinguitmeteendrukknopenveranderdecodezodathetlcdschermlaatzienhoevaakjeopdeknophebtgedrukt.

Page 20: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

20

Functies

Eriseengigantischelijstmetfuncties.HierdeveelgebruiktefunctiesinArduino.

int waardetussen-32768en32767(215)long waardetussen-2.147.483.648en2.147.483.647(231)unsignedlong/unsignedint waardeszijnalleenpositiefchar karaktersopgeslagenviahetASCIIsysteemfloat zijndecimalewaardes,maarwordtzoveelmogelijkomzeildin Arduinoprogrammeertaal

digitalWrite(pin,waarde); schrijftgeenspanning(LOW)ofeenspanningvan5Vnaardepin.analogWrite(pin,waarde) schrijftmeteen8bitoutputwaardestussen0en5V.De aangegevenwaardemoettussen0en255liggen.digitalRead(pin) leestofereenspanningopdepinstaat,geefteen0of1terug.analogRead(pin) leesthoeveelspanningopdepinstaat,geefteenwaardetussen0 en1023terug.map(W,Min1,Max1,Min2,Max2) Iseenschaalfunctie.Converteerteenwaarde(W)dieligt tussenMin1enMax1naareenwaardedieligttussenMin2 enMax2.

if(voorwaarde) Alservoldaanwordtaandegesteldevoorwaarde,wordtdecode tussendeaccoladesuitgevoerd.while(voorwaarde) Zolangeraandevoorwaardevoldaanwordt,wordtdecodetussen deaccoladesuitgevoerd.for(SW;EW;VF) Eenfor-loopvoertdecodetussendeaccoladeseenaantalkeeruit. SWisdestartwaarde,EWdeeindwaardeenVFde verhogingsfactor.Vb:for(inti=0;i<20;i++)delay(100);switchcase switchcaseiseensoortkeuzemenuwaarbijeenstukjecode uitgevoerdkanworden.Alsdevariabelewaardeeenheeftdan voertdezedecodeuitbehorendebijcase1.&& Beidevoorwaardesmoetengelden|| Eenvandetweevoorwaardesmoet gelden!= Isongelijkaan.

Tone(pin,f,t); Kanspecifiekefrequentie produceren.Indetoonmoet aangegevenwordenopwelkepin deluidsprekerzit,welkefrequentie gemaaktmoetwordeneneventueel hoelangdetoonaangehoudenmoet worden.Hetisnietnoodzakelijk aantegevenhoelangdetoon aangehoudenmoetworden.

noTone(pin); Stoptdetoondiegeproduceerdwerd.

switch (var) case 1: //doe iets als var is 1 break; case 2: //doe iets als var is 2 break; default: // als geen van bovenstaande waar is, doe het volgende (optioneel) break;

Page 21: Arduino - LATO · 2020-07-06 · snel code ctrl / kun je code snel omzetten naar commentaar. Voordat de belangrijkste code wordt uitgevoerd moet je zeggen wat er precies aangestuurd

21

Eind workshop deel 1

millis(); Ditkandienenalseentimer.millis();geefthetaantalmilliseconde datdeArduinoaanstaatweer.micros(); GeefthetaantalmicrosecondeweerdatdeArduinoaanstaat.De resolutieis4µs.delay(); Wachteenaantalmillisecondevoorhetuitvoerenvanhetvolgendestukje code.

random(LW,HW) Randomgeefteengetalterugtussendelaagstewaarde(LW)enhoogste waarde(HW).Eennadeelvanrandomisdatbijhetopnieuwstartenvan deArduinodezelfdesequentiewordtafgespeeld.Randomisdusniet random…Ditprobleemkanwelopgelostwordendooreerstgebruikte makenvandefunctierandomSeed(A0);DezeleestpinA0uit.Alsdaar nietsisverbondenwordthierruisgemeten.randomSeedschudtalshet waredevastesequentievanRandomdoorelkaar.