17. Digitale I/O

17. Digitale I/O

Doel van deze Experience

Na deze experience zul je begrijpen wat je met de digitale ingangen en uitgangen kunt. We gaan nu de volgende instructies gebruiken:

• pinMode (pinnumber, INPUT of OUTPUT);
• digitalRead (Pin);
• digitalWrite (Pin);

Ook gaan we experimenteren met een RGB LED en leer je hoe je deze van kleur kunt laten veranderen met behulp van PWM.

Wat heb je nodig ?

  • Arduino
  • RGB LED
  • 2 LED’s
  • 2 x weerstand van 220Ω

Theorie

 

Arduino bouwstenen

De Digitale in- en uitgangen gangen zitten in blok 3 op deze foto. Digitaal wil zeggen dat we dus maar twee waardes kunnen sturen of meten namelijk 0 V (LOW) of 5 V (HIGH).
De Arduino computer biedt veel flexibiliteit. Tijdens de setup van het programma kun je bepalen of je een bepaalde PIN (connector) als ingang of als uitgang wil gebruiken. sommige uitgangen hebben een ~ symbool voor het nummer staan. (3,5,6,9,10 en 11). Deze uitgangen ondersteunen PWM, dit gaan we straks nog verder uitleggen.

De pinnen van de Arduino zijn standaard ingesteld als inputs. Je hoeft ze dus niet persé te declareren als inputs. Pinnen die zijn gedeclareerd als output kunnen maximaal 40 mA stroom leveren, dit is voldoende stroom om bijvoorbeeld een LED aan te sturen maar niet voldoende om een motor aan te sturen.

Het commando pinMode ziet er als volgt uit.

pinMode (pin, mode)

Voorbeelden:

pinMode (12, INPUT);

 of via de naam van een variabele;

const int relayPin = 12;
pinMode (relayPin,OUTPUT);

Om te voorkomen dat de digitale ingangen te zwaar worden belast (stroom hoger dan 40 mA) kun je een weerstand in serie zetten met de uitgang. Kun je met de wet van Ohm berekenen wat de waarde van deze weerstand moet zijn als je weet dat er 5 V spanning op de uitgang staat?

Digitale uitgang;

Als de digitale poort goed staat ingesteld als ingang of uitgang, kunnen we deze in het programma gebruiken.

We kunnen de uitgang sturen met het commando:

digitalWrite (pinNumber, HIGH); // hiermee komt er 5 V op de pin te staan
digitalWrite (pinNumber, LOW); //  hiermee komt er 0 V op de pin te staan

Digitale ingang;

We kunnen de waarde op de digitale ingang uitlezen met de instructie;

waarde = digitalRead(pinNumber);

De variabele waarde krijgt dan de waarde HIGH of LOW. Als er 5 Volt op de ingang staat krijgt hij de waarde HIGH, als er 0 Volt op de ingang staat krijgt hij de waarde LOW.

Opdracht 1

We maken een schakeling om twee verschillende kleuren LED’s te laten knipperen. We sluiten via een weerstand van 220 Ω de twee LED’s aan op digitale pin 3 en 8. Dit is willekeurig gekozen, het kunnen ook andere pinnen zijn.

Bedenk nu zelf een stuk code waarmee je deze schakeling kunt aansturen. Er moet in ieder geval een delay() commando in, hiermee ga je bepalen hoe snel de LED’s knipperen. Tevens willen we er zeker van zijn dat als de ene LED brandt, de andere LED niet brandt.

De volgende sketch is een voorbeeld van hoe je dit kunt doen.Het kan best zijn dat je zelf een andere sketch hebt gemaakt die ook werkt.

Experience17_1

 

Puls Breedte Modulatie, van digitaal toch analoog maken

De Arduino heeft iets heel moois dat je kunt gebruiken. We noemen dit PWM, een afkorting voor het Engelse woord Pulse With Modulation. In de verschillende Experiences hebben we gezien dat we de lichtsterkte van een LED kunnen regelen met een weerstand. Als we de waarde van de weerstand aanpassen, verandert de stroom en zal de LED feller of minder fel gaan branden. Je hebt ook gezien in deze Experience dat we de LED’s alleen aan of uit kunnen schakelen. Stel dat we een LED langzaam van uit tot volledig aan willen laten gaan, dan lukt dat niet. De Arduino kan dit wel met de PWM oplossing. Hiermee zetten we heel snel de LED aan en uit, zo snel dat ons oog dit niet ziet maar dit wel het beoogde resultaat geeft.

We hebben hiervoor een 6 tal poorten ter beschikking die allemaal deze functionaliteit hebben, namelijk: 3, 5, 6, 9, 10 en 11. Dit is een 8 bits conversie en heeft dus 256 waardes (2 tot de macht 8 is 256). Onderstaand plaatje geeft aan dat we op basis van de waarde die we uitsturen, meer of minder licht uit de LED kunnen laten komen. De lengte van de puls, in het Engels “duty cycle” bepaalt hoelang de LED aangaat. Op deze manier maak je dus van een digitale uitgang een analoge uitgang.

dutycyles

Via het commando analogWrite(waarde) kunnen we de hoeveelheid licht bepalen. Hoe hoger het getal dat je gebruikt hoe meer licht er uit de LED zal komen. We gaan dit nu zelf bouwen en er mee experimenteren. We sluiten een LED aan op digital 9 en maken de volgende sketch;

.Experience17_2

Je ziet nu dat de LED bij lightStrength 0 begint en oploopt tot 255, hiermee gaat de LED dus steeds feller branden.

 

 

Opdracht 1

Pas de sketch nu zo aan dat hij als hij op volle sterkte is geweest weer langzaam uitgaat naar 0.

RGB LED
In de Experimenteer kist zit een LED die bestaat uit drie kleuren LED’s, namelijk Rood Groen en Blauw. Dit heet een RGB LED. Deze LED heeft vier aansluitingen, elke LED is aan te sturen.

RGB LED

Er zijn twee types, met een gemeenschappelijke Kathode en met een gemeenschappelijke Anode. In de Experimenteer-kist vind je een RGB LED met een gemeenschappelijke kathode. Vergeet niet een weerstand te gebruiken ter bescherming!
De drie kleuren Rood, Groen en Blauw kunnen samen alle kleuren maken die je maar kunt bedenken. Elke kleur is een combinatie van deze drie kleuren, waarbij de helderheid en intensiteit bepalen welke nieuwe kleur wordt gevormd.
Op de website http://rapidtables.com/web/color/RGB_Color.htm zie je hoe een kleur is samengesteld uit deze drie basiskleuren. Als je met de muis over de kleuren heen gaat dan zie je de RGB waardes veranderen.

RGB colorpicker
Stel dat we een LED deze kleur geel willen laten branden, dan kunnen we dit dus aansturen door voor Rood de waarde 209, voor Groen de waarde 228 en voor Blauw de waarde 42 te gebruiken.

We sluiten de RGB LED aan via drie weerstanden op pin 9, 10 en 11 (Blauw op 9, Groen op 10 en Rood op 11).
Met de volgende sketch kunnen we de drie LED’s in de RGB LED onafhankelijk van elkaar aansturen.

rgbledsketch

 

Opdracht 2
Je ziet steeds vaker dat kleuren LED’s gebruikt worden in winkels maar ook thuis om via een andere kleur licht een bepaalde sfeer te creëren.
Maak voor jezelf een sketch die het volgende doet:

  • De LED begint bij de kleuren (0,0,0). Alle waardes zijn dus 0.
  • Om te beginnen loopt de rode LED van 0 tot 255,
  • Als de rode LED 255 heeft bereikt begint de groene LED, de rode LED blijft op 255 staan.
  • Als de groene LED hierna op 255 staat, stuur je de blauwe LED aan.
  • Als je dit in een loop zet zie je dus continu het licht in één kleur sterker worden, en bij volle sterkte overschakelen naar de volgende kleur.

Opdracht 3

We hebben een functie die willekeurig (random) een getal kan genereren. Deze functie ziet er als volgt uit;

 random(min,max)

Deze functie genereert dus een willekeurig getal tussen de waardes min en max. Meer informatie kun je hier vinden, bestudeer dit en pas de voorbeelden toe.

Je kunt deze functie dus als volgt toepassen;

redLedValue=random(0,255);
analogWrite(redLED,redLedValue);

Gebruik deze functie in een sketch om de RGB willekeurig in alle kleuren te laten schijnen.

Wat heb je geleerd?

Je weet nu wat je kunt doen met digitale in- en uitgangen. Ook heb je geleerd hoe je met een mengeling van de kleuren rood, groen en blauw alle kleuren kunt maken.

TestenStatus

Een reactie plaatsen