Leer hoe u de helderheid kunt regelen van een LED die is aangesloten op een Raspberry Pi met behulp van PWM.

PWM is iets dat we allemaal elke dag gebruiken, zelfs als we het niet weten. Het is een techniek die eenvoudig en ongelooflijk nuttig is in een reeks toepassingen. Het beste nog: het is iets dat je Raspberry Pi kan doen zonder te zweten. Hoe? Laten we kijken.

Wat is PWM?

Zoals de terminologie luidt: "Pulse-Width Modulation" klinkt behoorlijk chic. Maar het enige waar we het hier eigenlijk over hebben, is het extreem snel uit- en weer inschakelen van een elektrisch signaal. Waarom zouden we dit willen doen? Simpelweg omdat het een heel gemakkelijke manier is om een ​​variabel analoog signaal te simuleren, zonder toevlucht te nemen tot Raspberry Pi HAT's, add-onsof extra circuits. Voor bepaalde toepassingen, zoals het verwarmen van een kachel, het aandrijven van een motor of het dimmen van een LED, is een PWM-signaal letterlijk niet te onderscheiden van een "echte" analoge spanning.

Inschakelduur

We hebben dus een reeks pulsen die in een lading worden ingevoerd (het ding dat we besturen). Dit alleen is niet zo nuttig, totdat we de breedte van die pulsen gaan veranderen (of moduleren). De "aan"-fase van een bepaalde aan-uit-periode kan 0-100% van de totale cyclus in beslag nemen. Dit percentage noemen we de arbeidscyclus.

Stel dat we bijvoorbeeld een 3V PWM-signaal hebben met een inschakelduur van 50%. De gemiddelde hoeveelheid stroom die door de LED gaat, komt overeen met een altijd-aan-signaal van 1,5 V. Draai de werkcyclus omhoog en de LED wordt helderder; draai het naar beneden en de LED dimt. We kunnen op dezelfde manier audio genereren. Daarom werkt de audio-uitgang op je Raspberry Pi mogelijk niet meer als je PWM voor andere dingen gebruikt.

PWM op de Raspberry Pi

Je kunt software PWM gebruiken op elke GPIO-pin van de Raspberry Pi. Maar hardware-PWM is alleen beschikbaar op GPIO12, GPIO13, GPIO18, En GPIO19.

Wat is het verschil? Als je software gaat gebruiken om het signaal te genereren, dan verbruik je CPU-cycli. Je CPU heeft misschien wel betere dingen te doen dan een LED te vertellen dat hij honderden keren per seconde moet in- en uitschakelen. In feite kan het worden afgeleid en verzanden door andere taken, wat uw PWM-timings ernstig kan verstoren.

Daarom is het vaak een beter idee om de taak te delegeren aan gespecialiseerde circuits. In het geval van de Raspberry Pi bevindt dit circuit zich binnenin het systeem op chip waarin de CPU zit. Hardware-PWM is vaak veel nauwkeuriger en handiger en heeft daarom in de meeste gevallen de voorkeur. Als je een idee wilt van wat er onder de motorkap gebeurt in de Broadcom BCM2711-chip van de Raspberry Pi 4, dan kun je kijken naar de BCM2711-documentatie. Hoofdstuk 8 behandelt de PWM-dingen!

Een LED dimmen

Om onze LED te laten werken met onze Raspberry Pi, moeten we wat breadboarding doen. Dat betekent twee componenten: de LED zelf en een stroombegrenzende weerstand, die we er in serie mee zullen verbinden. Zonder de weerstand loopt uw ​​LED het risico om uit te sterven in een stinkende rookwolk als er te veel stroom doorheen gaat.

De weerstandswaarde uitwerken

Het maakt niet uit aan welk uiteinde van de LED u de weerstand aansluit. Waar het om gaat is de waarde van de weerstand. De Raspberry Pi 4 kan ongeveer 16 milliampère per pin leveren. Dus we kunnen gebruik de wet van Ohm om de waarde van de benodigde weerstand te berekenen.

Deze wet stelt dat de weerstand gelijk moet zijn aan de spanning over de stroom. We kennen de spanning die uit de GPIO-pin van de Pi komt (3,3 V), en we weten wat de stroom zou moeten zijn (16 milliampère, of 0,016 ampère). Als we de eerste delen door de laatste, krijgen we 206,25. Omdat je moeite zult hebben om weerstanden van deze waarde te vinden, gaan we in plaats daarvan voor 220 ohm.

Sluit de anode (lange poot) van de LED aan GPIO18 (dat is fysieke pin 12 op de Raspberry Pi). Sluit de kathode (korte poot) aan op een van de aardingspinnen van de Pi. Vergeet de weerstand niet, ergens langs het pad. Je bent nu klaar om te gaan!

PWM implementeren op Raspberry Pi

Om de hardware-PWM op Raspberry Pi te laten werken, gebruiken we de rpi-hardware-pwm-bibliotheek van Cameron Davidson-Pilon, aangepast van code van Jeremy Impson. Dit is gebruikt in de Pioreactor (een op Pi gebaseerde bioreactor) – maar het is eenvoudig genoeg voor onze doeleinden.

Laten we eerst bewerk config.txtbestand, gevonden in de /boot map. We hoeven slechts één regel toe te voegen: dtoverlay=pwm-2chan. Als we andere GPIO-pinnen dan 18 en 19 zouden willen gebruiken, zouden we hier wat extra argumenten kunnen toevoegen. Laten we het voorlopig simpel houden.

Start uw Pi opnieuw op en voer het volgende uit:

lsmod | grep pwm

Met deze opdracht worden alle modules weergegeven die in het centrale deel van het besturingssysteem zijn geladen, de kernel genaamd. Hier filteren we ze om alleen de PWM-dingen te vinden, met behulp van de grep (dat is de opdracht "global regular expression print").

Als pwm_bcm2835 tussen de vermelde modules verschijnt, dan zijn we op de goede weg. We zijn bijna klaar met de voorbereidingen! Het enige dat overblijft is het installeren van de eigenlijke bibliotheek. Voer vanaf de terminal het volgende uit:

sudo pip3 install rpi-hardware-pwm

We zijn nu klaar om aan de slag te gaan.

Codering van het PWM LED-circuit

Tijd om onze handen vuil te maken met een klein beetje coderen in Python. Start Thonny op en kopieer de volgende code. Toen sloeg Loop.

from rpi_hardware_pwm import HardwarePWM
import time
pwm = HardwarePWM(pwm_channel=0, hz=60) # here's where we initialize the PWM
pwm.start(0) # start the PWM at zero – which means the LED is off
for i in range(101):
pwm.change_duty_cycle(i)
time.sleep(.1) # by introducing a small delay, we can make the effect visible.
pwm.stop()

Als alles goed gaat, zul je zien dat de LED geleidelijk helderder wordt totdat de i tellervariabele bereikt 100. Dan wordt het uitgeschakeld. Wat is hier aan de hand? Laten we er doorheen lopen.

We importeren het relevante deel van de hardware-PWM-bibliotheek (samen met de tijd module) en het declareren van een nieuwe variabele. Wij kunnen de pwm_kanaal op 0 of 1, die respectievelijk overeenkomen met GPIO-pinnen 18 en 19 op de Pi.

De Hz waarde die we kunnen instellen op elke gewenste frequentie (hoewel we uiteindelijk beperkt worden door de kloksnelheid van de Pi). Bij 60 Hz zouden we geen PWM-flikkering moeten zien. Maar het kan een goed idee zijn om met een zeer lage waarde te beginnen (zoals 10) en de zaken geleidelijk op te schuiven. Doe dit, en je zult de pulsen daadwerkelijk kunnen zien gebeuren. Geloof ons niet alleen op ons woord!

We werken volgens onze duty-cycle (i) omhoog van 0 naar 100 met behulp van een Python for-lus. Het is vermeldenswaard dat we de tijd.slaap argument zo lang als we willen: aangezien de PWM in hardware wordt afgehandeld, zal deze achter de schermen draaien, hoe lang we het programma ook laten wachten.

Er valt meer te leren met PWM

Gefeliciteerd! Je hebt je eerste PWM-programma geschreven. Maar zoals zo vaak het geval is met de Raspberry Pi, kun je hier veel mee doen, vooral als je je Raspberry Pi uitbreidt met de juiste PWM-hoed. Wees dus niet tevreden met één kleine LED. Je kunt deze nieuwe kracht gebruiken om motoren te besturen, berichten te coderen en synthesizertonen te genereren. Er wacht een wereld van modulatie!