Dimma en lysdiod och mer: PWM på Raspberry Pi
PWM är något som vi alla använder varje dag, även om vi inte vet om det. Det är en enkel teknik som är otroligt användbar i en rad olika tillämpningar. Och det bästa av allt är att din Raspberry Pi kan göra det utan att bli svettig. Men hur? Låt oss ta en titt.
Vad är PWM?
Termen “Pulsbreddsmodulering” är till synes komplex, men syftar på att snabbt växla en elektrisk signal mellan till- och frånläge. Denna teknik erbjuder ett enkelt sätt att generera varierande analoga signaler utan att kräva ytterligare hårdvara som Raspberry Pi HATs eller externa komponenter. För uppgifter som att styra en spisbrännare, snurra en motor eller justera ljusstyrkan på en lysdiod, efterliknar en PWM-signal effektivt en äkta analog spänning.
Driftcykler
Processen innebär att en sekvens av pulser matas in i en last, vilket är det objekt som drivs. Även om denna åtgärd i sig kan verka rudimentär, blir den betydligt mer meningsfull när pulsernas varaktighet ändras. Genom att ändra pulsernas bredd kan vi ändra den tid under vilken de förblir aktiva eller “på”. Den andel av tiden inom varje cykel som pulsen förblir aktiv kallas för arbetscykeln.
Tänk dig en PWM-signal (Pulse Width Modulated) på tre volt som har en arbetscykel på femtio procent. I detta scenario skulle den genomsnittliga spänning som appliceras över lysdioden (LED) motsvara en oavbruten signal på en och en halv volt. Genom att öka arbetscykeln kommer lysdiodens ljusstyrka att öka, medan en minskning av den kommer att leda till en motsvarande minskning av ljusstyrkan. På samma sätt kan ljudsignaler genereras med hjälp av PWM, vilket kan leda till störningar i ljudutgången från Raspberry Pi om andra PWM-applikationer används samtidigt.
PWM på Raspberry Pi
Att använda PWM (Pulse Width Modulation) i programvara är ett bra alternativ för alla GPIO-stift på Raspberry Pi. Tillgången till PWM-funktionalitet för hårdvara är dock begränsad till vissa stift, nämligen GPIO12, GPIO13, GPIO18 och GPIO19.
Att använda datorprogram för att producera en signal kan leda till ökad förbrukning av CPU-resurser. Medan processorn (CPU) arbetar med denna uppgift kan den bli upptagen med andra uppgifter som kan ha en negativ inverkan på tidpunkten för pulsbreddsmoduleringen (PWM).
Därför är det ofta en bättre idé att delegera uppgiften till en specialiserad krets. I fallet med Raspberry Pi finns denna krets inuti System on Chip som innehåller processorn.Hårdvaru-PWM är ofta mycket mer exakt och bekvämt, och därför är det det bästa alternativet i de flesta fall. Om du vill ha en uppfattning om vad som händer under huven i Raspberry Pi 4:s Broadcom BCM2711-chip, kan du titta på BCM2711-dokumentationen . Kapitel 8 täcker PWM-grejerna!
Dimma en LED
För att vår LED ska fungera korrekt tillsammans med vår Raspberry Pi, kommer vi att behöva utföra en del breadboarding. Denna process innebär att både lysdioden och ett strömreglerande motstånd ansluts i seriekonfiguration. Det är mycket viktigt att detta motstånd ingår eftersom det förhindrar att lysdioden utsätts för överdriven ström och därmed skyddar den från en olycklig död som kännetecknas av en skadlig lukt som härrör från en rökig upplösning.
Beräkning av resistorns värde
Den position där ett motstånd ansluts till en lysdiod har ingen effekt på dess prestanda; det är snarare resistorns värde som avgör strömflödet genom enheten. Eftersom Raspberry Pi 4 kan leverera ca 16 milliampere (mA) per stift, kan man använda Ohms lag för att beräkna det nödvändiga resistansvärdet för korrekt funktion.
Den ovannämnda principen föreskriver att impedansen måste motsvara potentialskillnaden över ledaren med avseende på den ström som flödar genom den. Den spänning som levereras av Raspberry Pis GPIO-stift är känd som 3,3 volt, medan den föreskrivna strömmen är 16 milliampere, eller 0,016 ampere. När dessa värden divideras blir resultatet 206. Det kan dock vara svårt att hitta resistorer med så exakta specifikationer, så därför används istället 220 ohm.
Anslut den positiva polen (anoden) på LED-listen till GPIO 18, vilket motsvarar det fysiska stiftet 12 på Raspberry Pi. Anslut även den negativa polen (katoden) på lysdiodremsan till något av enhetens jordstift. Kom ihåg att inkludera ett motstånd i kretsen och placera det var som helst längs vägen efter behov. När du har slutfört dessa förberedelser är du redo att fortsätta med ditt projekt.
Implementering av PWM på Raspberry Pi
För att få PWM att fungera på Raspberry Pi använder vi biblioteket rpi-hardware-pwm från Cameron Davidson-Pilon , anpassat från kod av Jeremy Impson . Detta har använts i Pioreactor (en Pi-baserad bioreaktor) - men det är tillräckligt enkelt för våra syften.
Vi börjar med att öppna konfigurationsfilen som finns i mappen “/boot”.För att fortsätta med vår uppgift är det nödvändigt att lägga till en enda textrad, nämligen “dtoverlay=pwm-2chan”. Om vi skulle behöva använda GPIO-stift utöver de som tilldelats 18 och 19, kan vi inkludera ytterligare parametrar efter behov. I det här fallet kommer vi dock att behålla enkelheten.
Starta om din Pi och kör:
lsmod | grep pwm
Det här kommandot ger en omfattande inventering av alla moduler som har fästs på operativsystemets viktigaste kärnkomponent, kallad kärnan. För att uteslutande hitta de komponenter som rör pulsbreddsmodulering använder vi oss av funktionen grep, som står för “global applied regular expression printer”.
Om förekomsten av “pwm\_bcm2835” i de katalogiserade modulerna indikerar en lyckad installation, närmar vi oss slutförandet av vår preliminära installationsprocess. Det sista steget innebär att installera det faktiska biblioteket via ett kommando från terminalen:
sudo pip3 install rpi-hardware-pwm
Vi är nu redo att sätta igång.
Kodning av PWM LED-krets
Det är verkligen dags att fördjupa sig i programmeringsvärlden genom att använda Python-språket i Thonny-miljön. För att börja måste man initiera Thonny-plattformen och sedan replikera det medföljande kodavsnittet inom dess gränssnitt. När koden har matats in trycker du på knappen “Kör” för att köra programmet.
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()
Under normala omständigheter bör man observera att lysdioden gradvis blir mer lysande tills räknevariabeln uppnår ett värde på 100. Vid denna tidpunkt skall den upphöra att lysa. En detaljerad undersökning av detta fenomen är motiverad.
Vi importerar den relevanta delen av hårdvarans PWM-bibliotek, tillsammans med dess tillhörande tidsmodul, och definierar en ny variabel. Kanalen pwm\_channel kan tilldelas antingen 0 eller 1, där 0 motsvarar GPIO-stift 18 på Raspberry Pi, medan 1 är mappat till GPIO-stift 19.
Man kan godtyckligt tilldela ett hertz-värde (hz) till en önskad frekvens, även om praktiska begränsningar som Raspberry Pi:s bearbetningshastighet måste beaktas. Ett hz-värde på 60 bör inte uppvisa märkbart PWM-flimmer (pulse-width modulation). Det är lämpligt att börja med ett extremt lågt hz-värde, t.ex. 10, och öka det stegvis tills urskiljbara pulser blir synliga. Detta tillvägagångssätt möjliggör direkt observation av fenomenet snarare än att förlita sig på enbart accepterande av påståenden.
Vår nuvarande uppgift innebär att stegvis öka arbetscykeln för pulsbreddsmoduleringssignalen (PWM), från noll till hundra procent, med hjälp av en Python for loop.Parametern “time.sleep” kan justeras efter personliga preferenser eller specifika krav, eftersom PWM bearbetas av hårdvara och fungerar oberoende av eventuella programfördröjningar.
Det finns mer att lära med PWM
Det är verkligen lovvärt att du har lyckats exekvera ett PWM-program på din Raspberry Pi. Det är dock viktigt att notera att de potentiella tillämpningarna för pulsbreddsmodulering är mycket omfattande när man använder lämplig kringutrustning, t.ex. en dedikerad PWM HAT. Det vore därför klokt att inte begränsa sig till enkel belysning av en enda LED, utan snarare utforska möjligheterna att styra motorer, koda information och generera ljudsignaler genom olika typer av modulering. Möjligheterna är verkligen många och väntar på att utforskas.