Bekijk de 38 andere Arduino lessen

3 · Fade een LED via pulse width modulation


Introductie

Je weet nu hoe je een LED moet laten knipperen. We gaan nu een stapje verder: de LED vloeiend van aan naar uit laten gaan (het zogenaamde faden). Hiervoor gaan we een techniek gebruiken die PWM (Pulse Width Modulation) wordt genoemd. Nieuwsgierig geworden? Dan gaan we aan de slag! 😃

Lesmateriaal

Onderaan op deze pagina vind je de knop lesmateriaal waarmee je het lesmateriaal kunt downloaden. Dit materiaal bestaat uit de code, schakelschema en andere bestanden die in de les worden gebruikt.

PWM - Pulse Width Modulation

Als je een gloeilamp minder stroom geeft, zal deze minder fel gaan branden. Bij een LED werkt dit anders, deze heeft eigenlijk maar twee standen: aan of uit. Hoe kunnen we er nu voor zorgen dat deze minder fel kan gaan branden? De oplossing is de LED heel snel te laten knipperen, zo snel dat ons oog het niet meer kan zien. Deze techniek heet Pulse Width Modulation en wordt vaak afgekort als PWM.

In ons geval is de pulse width, de tijd dat de LED brandt. Door deze tijd langer te maken gaat de LED feller branden. In de afbeelding hieronder wordt dit schematisch weergegeven.

PWM - Pulse Width Modulation
Schematisch weergave PWM

Voor elke Duty Cycle zijn vier herhalingen achter elkaar getekend. De lengte van elk deel is voor nu niet belangrijk.

Bovenaan zie je de 0% Duty Cycle op 0 Volt. In deze situatie gaat er dus geen stroom door de LED en staat deze uit. Onderop staat de 100% Duty Cycle op 5 Volt. In deze situatie brandt de LED.

De drie middelste stappen zijn nieuw. In de 25% Duty Cycle zie je dat 25% van de tijd, de LED 5 Volt krijgt. Dit houdt dus in de 25% van de tijd de LED zal branden. In de middelste stap zie je 50% van de tijd stroom naar de LED gaan. Hierbij brandt de LED dus 50% van de tijd.

Stel dat we de totale duur van één herhaling heel klein gaan maken, bijvoorbeeld 10ms. Ons oog kan dan het knipperen niet meer waarnemen en lijkt de LED minder fel te branden.

Eerder vertelde ik al dat deze techniek Pulse Width Modulation heet. Vrij vertaald: Het aanpassen van de pulsbreedte. Als je naar het schema kijkt zie je dat bij elke Duty Cycle de breedte van elke puls groter wordt. Hoe je dit op je Arduino kunt doen ga ik je nu laten zien.

🎓 We nemen de 75% Duty Cycle, elke herhaling duurt 4 seconden. Kun jij bedenken hoeveel seconden de LED aan en uit staat?

De schakeling

Niet alle pins op de Arduino ondersteunen PWM. Dit geldt alleen voor de pins die zijn gemarkeerd met een ~. Meer informatie over welke pins PWM ondersteunen vind je op de Arduino website.

Arduino PWM pins
Pin 11, 10 en 9 ondersteunen PWM (Pulse Width Modulation)

In deze schakeling zien we dat de anode van de LED via een weerstand verbonden is met pin 11 op de Arduino. Vervolgens is de kathode van de LED verbonden met de aarde (GND) op de Arduino

Arduino met LED
De schakeling voor PWM op breadboard

Arduino Code

De eerste regels van de code spreken voor zich. We stellen de juiste LED pin in, en geven aan dat we deze als OUTPUT willen gebruiken.

1 // Geef aan welke PWM pin er gebruikt wordt
2 int ledPin = 11;
3 
4 // Voer uit bij de start van programma
5 void setup() {
6     // Initialiseer digitale pin ledPin als een uitvoer
7     pinMode(ledPin, OUTPUT);
8 }

loop()

1 // Herhaal oneindig
2 void loop() {
3 
4     // Fade in
5     for(int ledVal = 0; ledVal <= 255; ledVal +=1) {
6         analogWrite(ledPin, ledVal);
7         delay(15);
8     }  
9 
10     // Fade uit
11     for(int ledVal = 255; ledVal >= 0; ledVal -=1) {
12         analogWrite(ledPin, ledVal);
13         delay(15);
14     } 
15     
16     // Pauzeer voor 1 seconde
17     delay(1000);
18 
19 }

De loop() functie bestaat uit 3 delen:

  • Infaden
  • Uitfaden
  • Pauzeren

For-loop

1 // Fade in
2 for(int ledVal = 0; ledVal <= 255; ledVal +=1) {
3     analogWrite(ledPin, ledVal);
4     delay(15);
5 }  

Om de LED steeds feller te laten branden gaan we elke 15ms de waarde van pin 11 verhogen totdat 255 is bereikt. We doen dit met een for-loop.

De for functie bestaat uit drie parameters:

  • startwaarde
  • conditie
  • stapgrootte

In bovenstaande code definiëren we een variabele ledVal van het type integer (dus een geheel getal) en zetten de startwaarde op 0.

Als conditie om nog een herhaling te mogen doen geven we dat de waarde kleiner of gelijk aan 255 moet zijn: ledVal <= 255.

We willen elke stap ledVal met 1 verhogen wat we schrijven als ledVal +=1.

💡 Een kortere schrijfwijze hiervoor is ledVal++

analogWrite()

In de vorige les maakte we gebruik van digitalWrite deze kon slechts twee waarden naar een pin sturen: HIGH of LOW. Voor PWM gaan we gebruik maken van analogWrite.

We schrijven de analoge waarde van ledVal met de analogWrite functie naar de ledPin. Deze PWM waarde ligt tussen de 0 (altijd uit) en 255 (altijd aan).

Vervolgens wachten we 15 milliseconden totdat de volgende stap mag worden uitgevoerd.

For-loop voor fade-out

1 for(int ledVal = 255; ledVal >= 0; ledVal -=1) {
2     analogWrite(ledPin, ledVal);
3     delay(15);
4 }

De code voor het uitfaden is nagenoeg hetzelfde. Het enige verschil is dat we nu van 255 terug gaan naar 0.

🎓 Zie je het verschil tussen de fade-in en fade-out code?

1 delay(1000);

Vervolgens wachten we 1000 milliseconden (1 seconde) voordat we weer overnieuw beginnen.

Code uploaden naar Arduino

Ons programma is nu klaar om naar de Arduino te worden gestuurd. Om dit te doen koppel je de Arduino via de USB kabel aan je computer. Controleer in het menu of je het goede Arduino board hebt geselecteerd:

Hulpmiddelen ▸ Board ▸ Arduino/Genuino UNO

en daarnaast of je ook de goede poort hebt gekozen. Dit vind je in het menu:

Hulpmiddelen ▸ Poort

Als je hier niet weet welke poort je nodig hebt is het een kwestie van ze allemaal proberen.

Linksboven zie je een ronde knop met een vinkje erop. Als je hierop drukt kijkt de IDE of je code in orde is. De IDE kijkt hier alleen of hij de code kan lezen. Hij weet dus niet of je de juiste code voor jouw programma hebt geschreven.

Als alles goed is gegaan staat er onderaan de tekst Compileren voltooid. Uploaden doe je met de ronde knop met het pijltje naar rechts. Als er onderaan Avrdude done. Thank you. staat weet je dat de code naar de Arduino is gestuurd. Na het uploaden start het programma meteen. In ons geval zie je de LED faden met pauzes van 1000ms.

3 &middot; Fade een LED via pulse width modulation schakelschema

Bas van Dijk

Over Bas on Tech


Mijn naam is Bas van Dijk, ondernemer, freelance frontend developer en maker. Onder de naam "Bas on Tech" bied ik op YouTube videolessen aan over technische onderwerpen zoals Arduino en 3D-printen.

De video’s zijn in het Nederlands met ondertiteling, zodat mensen met een gehoorbeperking ze ook kunnen volgen.

Jaren geleden toen ik mijn eerste Arduino kocht had ik maar één doel: zo snel mogelijk een LCD schermpje aansluiten en er een tekst op laten zien. Na allerlei bronnen te hebben geraadpleegd kwam ik er na veel puzzelen eindelijk uit. Ik was als een kind zo blij met die paar letters op een geel schermpje.

Met Bas on Tech wil ik mijn kennis delen zodat ook anderen deze blijheid kunnen ervaren. Ik heb gekozen voor kort en krachtige YouTube video’s, met een duidelijke vaste opbouw en één onderwerp per video. Daarnaast staan onder elke video links naar de broncode en webshops waar de onderdelen te koop zijn.