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

of 21/21
Arduino C.F.J. Pols [email protected]
  • date post

    15-Aug-2020
  • Category

    Documents

  • view

    1
  • download

    0

Embed Size (px)

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

  • ArduinoC.F.J. Pols

    [email protected]

  • 2

  • 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 

  • 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.

  • 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

  • 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.

  • 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.

    Alleswattussendeaccolades{}vandeloopstaatwordtcontinuherhaald.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); }

  • 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…

  • 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);}

  • 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.

  • 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!

  • 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.

  • 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

  • 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.

  • 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.

  • 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?

  • 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 mijnServo;int pos = 0;void setup(){ mijnServo.attach(9)}

  • 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.

  • 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.

  • 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

  • 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.