Lær hvordan du kontrollerer lysstyrken til en LED koblet til en Raspberry Pi ved hjelp av PWM.

PWM er noe vi alle bruker hver dag, selv om vi ikke vet det. Det er en teknikk som er enkel og utrolig nyttig i en rekke bruksområder. Best ennå, det er noe som din Raspberry Pi kan gjøre uten å svette. Hvordan? La oss ta en titt.

Hva er PWM?

Som terminologi går, "Pulse-Width Modulation" høres ganske fancy ut. Men alt vi egentlig snakker om her er å slå et elektrisk signal av og på igjen - ekstremt raskt. Hvorfor vil vi kanskje gjøre dette? Ganske enkelt fordi det er en veldig enkel måte å simulere et variabelt analogt signal på, uten å ty til Raspberry Pi-HATER, tillegg, eller ekstra kretser. For visse bruksområder, som å varme opp en komfyr, drive en motor eller dimme en LED, er et PWM-signal bokstavelig talt umulig å skille fra en "ekte" analog spenning.

Driftssykluser

Så vi har en serie pulser som mates inn i en last (det vi kjører). Dette alene er ikke så nyttig - før vi begynner å endre (eller modulere) bredden på disse pulsene. "På"-fasen av en gitt av-på-periode kan ta opp alt fra 0–100 % av den totale syklusen. Vi kaller denne prosenten for

instagram viewer
driftssyklus.

Anta for eksempel at vi har et 3V PWM-signal med en driftssyklus på 50 %. Den gjennomsnittlige mengden strøm som går gjennom LED-en vil tilsvare et alltid-på-signal på 1,5V. Skru opp driftssyklusen, og LED-en blir lysere; slå den ned, og LED dimmen. Vi kan generere lyd ved å bruke samme metode - det er grunnen til at lyden ut på Raspberry Pi kan slutte å fungere hvis du bruker PWM til andre ting.

PWM på Raspberry Pi

Du kan bruke programvare PWM på hver GPIO-pinne til Raspberry Pi. Men maskinvare PWM er kun tilgjengelig på GPIO12, GPIO13, GPIO18, og GPIO19.

Hva er forskjellen? Vel, hvis du skal bruke programvare for å generere signalet, vil du konsumere CPU-sykluser. CPU-en din kan imidlertid ha bedre ting å gjøre enn å fortelle en LED om å slå seg av og på flere hundre ganger per sekund. Faktisk kan det bli distrahert og fastlåst av andre oppgaver, noe som kan rote alvorlig med PWM-timingene dine.

Derfor er det ofte en bedre idé å delegere oppgaven til spesialiserte kretser. Når det gjelder Raspberry Pi, bor denne kretsen inni System on Chip som huser CPU. Maskinvare PWM er ofte langt mer presis og praktisk, og derfor er det det foretrukne alternativet i de fleste tilfeller. Hvis du vil ha en ide om hva som foregår under panseret i Raspberry Pi 4s Broadcom BCM2711-brikke, så kan du se på BCM2711-dokumentasjonen. Kapittel 8 dekker PWM-tingene!

Dimming av en LED

For å få LED-en vår til å fungere med Raspberry Pi, må vi gjøre litt breadboarding. Det betyr to komponenter: selve LED-en, og en strømbegrensende motstand, som vi kobler i serie med den. Uten motstanden risikerer LED-en å dø i en illeluktende røykpuff hvis det går for mye strøm gjennom den.

Å beregne motstandsverdien

Det spiller ingen rolle hvilken ende av LED-en du kobler motstanden til. Det som betyr noe er motstandens verdi. Raspberry Pi 4 kan gi rundt 16 milliampere per pinne. Det kan vi bruk Ohms lov å regne ut verdien av motstanden som trengs.

Nevnte lov sier at motstanden skal være lik spenningen over strømmen. Vi vet spenningen som kommer ut av Pis GPIO-pinne (3,3V), og vi vet hva strømmen skal være (16 milliampere eller 0,016 ampere). Hvis vi deler førstnevnte på sistnevnte, får vi 206,25. Nå, siden du vil slite med å finne motstander med denne verdien, la oss gå for 220 ohm i stedet.

Koble LEDs anode (langt ben) til GPIO 18 (som er fysisk pinne 12 på Raspberry Pi). Koble katoden (kort ben) til en av Pis jordingsstifter. Ikke glem motstanden, et sted langs stien. Du er nå klar til å gå!

Implementering av PWM på Raspberry Pi

For å få maskinvaren PWM til å fungere på Raspberry Pi, bruker vi rpi-hardware-pwm-bibliotek fra Cameron Davidson-Pilon, tilpasset fra kode av Jeremy Impson. Dette har blitt brukt i Pioreaktør (en Pi-basert bioreaktor) - men den er enkel nok for våre formål.

Først, la oss rediger config.txtfil, funnet i /boot katalog. Vi trenger bare å legge til en linje: dtoverlay=pwm-2chan. Hvis vi ønsket å bruke andre GPIO-pinner enn 18 og 19, kan vi legge til noen ekstra argumenter her. For nå, la oss holde ting enkelt.

Start Pi-en på nytt og kjør:

lsmod | grep pwm

Denne kommandoen viser alle modulene som er lastet inn i den sentrale delen av operativsystemet, kalt kjernen. Her filtrerer vi dem for å finne bare PWM-tingene, ved å bruke grep (det er "globalt regulært uttrykk print") kommando.

Hvis pwm_bcm2835 vises blant de listede modulene, så er vi på rett vei. Vi er nesten ferdige med forberedelsene! Alt som gjenstår er å installere selve biblioteket. Fra terminalen, kjør:

sudo pip3 install rpi-hardware-pwm

Vi er nå klare til å komme i gang.

Koding av PWM LED-kretsen

På tide å skitne på hendene med litt av koding i Python. Fyr opp Thonny og kopier inn følgende kode. Deretter treffer Løpe.

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()

Alt er bra, vil du se at LED-en blir gradvis lysere til den Jeg tellervariabelen når 100. Da slår den seg av. Hva foregår her? La oss gå gjennom det.

Vi importerer den relevante delen av maskinvare-PWM-biblioteket (sammen med tid modul) og erklære en ny variabel. Vi kan stille inn pwm_kanal til 0 eller 1, som tilsvarer henholdsvis GPIO-pinner 18 og 19 på Pi.

De hz verdi vi kan sette til hvilken frekvens vi vil (selv om vi til slutt er begrenset av Pi-klokkehastigheten). Ved 60Hz bør vi ikke se noe PWM-flimmer. Men det kan være en god idé å starte med en veldig lav verdi (som 10) og gradvis flytte ting opp. Gjør dette, og du vil faktisk kunne se pulsene som skjer. Ikke bare ta vårt ord for det!

Vi jobber vår pliktsyklus (Jeg) opp fra 0 til 100 ved å bruke en Python for loop. Det er verdt å merke seg at vi kan stille inn tid.søvn argument til så lenge vi vil – siden PWM håndteres i maskinvare, vil den kjøre bak kulissene, uansett hvor lenge vi ber programmet vente.

Det er mer å lære med PWM

Gratulerer! Du har skrevet ditt første PWM-program. Men som så ofte er tilfellet med Raspberry Pi, er det mye du kan gjøre med disse tingene, spesielt hvis du utvider Raspberry Pi med riktig PWM-HAT. Så ikke vær fornøyd med en liten LED. Du kan bruke denne nye kraften til å kontrollere motorer, kode meldinger og generere synthesizer-toner. En verden av modulasjon venter!