Lær, hvordan du styrer lysstyrken af ​​en LED tilsluttet en Raspberry Pi ved hjælp af PWM.

PWM er noget, som vi alle bruger hver dag, selvom vi ikke ved det. Det er en teknik, der er ligetil og utrolig nyttig i en række applikationer. Bedst endnu, det er noget, din Raspberry Pi kan gøre uden at svede. Hvordan? Lad os se.

Hvad er PWM?

Som terminologi lyder, lyder "Pulse-Width Modulation" ret fancy. Men alt, hvad vi egentlig taler om her, er at slukke og tænde for et elektrisk signal igen - ekstremt hurtigt. Hvorfor vil vi måske gøre dette? Simpelthen fordi det er en meget nem måde at simulere et variabelt analogt signal på uden at ty til Raspberry Pi HAT'er, tilføjelsereller ekstra kredsløb. Til visse applikationer, såsom opvarmning af et komfur, kørsel af en motor eller dæmpning af en LED, kan et PWM-signal bogstaveligt talt ikke skelnes fra en "rigtig" analog spænding.

Duty Cycles

Så vi har en række pulser, der føres ind i en last (den ting, vi kører). Dette alene er ikke så nyttigt - indtil vi begynder at ændre (eller modulere) bredden af ​​disse impulser. "Tændt"-fasen af ​​en given on-off-periode kan fylde alt fra 0-100 % af den samlede cyklus. Vi kalder denne procentdel for

instagram viewer
arbejdscyklus.

Antag for eksempel, at vi har et 3V PWM-signal med en arbejdscyklus på 50 %. Den gennemsnitlige mængde strøm, der går gennem LED'en, svarer til et altid tændt signal på 1,5V. Drej arbejdscyklussen op, og LED'en bliver lysere; ring det ned, og LED'en dæmpes. Vi kan generere lyd ved hjælp af den samme metode - hvilket er grunden til, at lyden på din Raspberry Pi muligvis holder op med at fungere, hvis du bruger PWM til andre ting.

PWM på Raspberry Pi

Du kan bruge software PWM på hver GPIO-pin på Raspberry Pi. Men hardware PWM er kun tilgængelig på GPIO12, GPIO13, GPIO18, og GPIO19.

Hvad er forskellen? Nå, hvis du vil bruge software til at generere signalet, så vil du forbruge CPU-cyklusser. Din CPU kan dog have bedre ting at gøre end at bede en LED om at slukke og tænde flere hundrede gange i sekundet. Faktisk kan det blive distraheret og fastlåst af andre opgaver, som alvorligt kan rode med dine PWM-timinger.

Derfor er det ofte en bedre idé at uddelegere opgaven til specialiserede kredsløb. I tilfældet med Raspberry Pi bor dette kredsløb indeni systemet på chip der huser CPU'en. Hardware PWM er ofte langt mere præcis og bekvem, og derfor er det den foretrukne mulighed i de fleste tilfælde. Hvis du vil have en idé om, hvad der foregår under motorhjelmen i Raspberry Pi 4's Broadcom BCM2711-chip, så kan du se på BCM2711-dokumentationen. Kapitel 8 dækker PWM-tingene!

Dæmpning af en LED

For at få vores LED til at fungere med vores Raspberry Pi, bliver vi nødt til at lave noget breadboarding. Det betyder to komponenter: selve LED'en og en strømbegrænsende modstand, som vi forbinder i serie med den. Uden modstanden risikerer din LED at dø i en ildelugtende røg, hvis der går for meget strøm igennem den.

Udregning af modstandsværdien

Det er lige meget, hvilken ende af LED'en du tilslutter modstanden til. Det afgørende er modstandens værdi. Raspberry Pi 4 kan levere omkring 16 milliampere pr. pin. Så vi kan bruge Ohms lov at beregne værdien af ​​den nødvendige modstand.

Den nævnte lov siger, at modstanden skal svare til spændingen over strømmen. Vi kender spændingen, der kommer ud af Pi's GPIO-pin (3,3V), og vi ved, hvad strømmen skal være (16 milliampere eller 0,016 ampere). Hvis vi dividerer førstnævnte med sidstnævnte, får vi 206,25. Nu, da du vil kæmpe for at finde modstande af denne værdi, lad os gå efter 220 ohm i stedet.

Tilslut LED's anode (langt ben) til GPIO 18 (som er fysisk pin 12 på Raspberry Pi). Tilslut katoden (kort ben) til en af ​​Pi'ens jordstifter. Glem ikke modstanden, et sted langs stien. Du er nu klar til at gå!

Implementering af PWM på Raspberry Pi

For at få hardwaren PWM til at fungere på Raspberry Pi, bruger vi rpi-hardware-pwm-bibliotek fra Cameron Davidson-Pilon, tilpasset fra kode af Jeremy Impson. Dette er blevet brugt i Pioreaktør (en Pi-baseret bioreaktor) - men det er simpelt nok til vores formål.

Først, lad os rediger config.txtfil, fundet i /boot vejviser. Vi skal blot tilføje en linje: dtoverlay=pwm-2chan. Hvis vi ville bruge andre GPIO-pins end 18 og 19, kunne vi tilføje nogle yderligere argumenter her. Lad os indtil videre holde tingene enkle.

Genstart din Pi og kør:

lsmod | grep pwm

Denne kommando viser alle de moduler, der er indlæst på den centrale del af OS, kaldet kernen. Her filtrerer vi dem for kun at finde PWM-tingene ved hjælp af grep (det er "globalt regulært udtryk print") kommando.

Hvis pwm_bcm2835 dukker op blandt de anførte moduler, så er vi på rette vej. Vi er næsten færdige med at forberede os! Tilbage er blot at installere det faktiske bibliotek. Kør fra terminalen:

sudo pip3 install rpi-hardware-pwm

Vi er nu klar til at komme i gang.

Kodning af PWM LED-kredsløbet

Tid til at få vores hænder beskidte med en lille smule af kodning i Python. Tænd Thonny og kopier den følgende kode ind. Så slå Løb.

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 i orden, vil du se, at LED'en gradvist bliver lysere, indtil den jeg tællervariabel når 100. Så slukker den. Hvad sker der her? Lad os gå igennem det.

Vi importerer den relevante del af hardware-PWM-biblioteket (sammen med tid modul) og erklære en ny variabel. Vi kan indstille pwm_kanal til 0 eller 1, hvilket svarer til henholdsvis GPIO-ben 18 og 19 på Pi.

Det hz værdi, vi kan indstille til den frekvens, vi kan lide (selvom vi i sidste ende er begrænset af Pi'ens klokkehastighed). Ved 60Hz burde vi ikke se nogen PWM-flimmer. Men det kan være en god idé at starte med en meget lav værdi (som 10) og gradvist flytte tingene op. Gør dette, og du vil faktisk være i stand til at se pulserne ske. Tag ikke bare vores ord for det!

Vi arbejder vores arbejdscyklus (jeg) op fra 0 til 100 ved hjælp af en Python for loop. Det er værd at bemærke, at vi kan indstille tid.søvn argument til så længe vi vil – da PWM håndteres i hardware, kører det bag kulisserne, uanset hvor længe vi beder programmet vente.

Der er mere at lære med PWM

Tillykke! Du har skrevet dit første PWM-program. Men som det så ofte er tilfældet med Raspberry Pi, er der meget du kan gøre med disse ting, især hvis du udvider din Raspberry Pi med den rigtige PWM HAT. Så nøj dig ikke med en lille LED. Du kan bruge denne nye kraft til at styre motorer, kode beskeder og generere synthesizer-toner. En verden af ​​modulering venter!