Aflați cum să controlați luminozitatea unui LED conectat la un Raspberry Pi folosind PWM.
PWM este ceva pe care toți îl folosim în fiecare zi, chiar dacă nu îl știm. Este o tehnică simplă și incredibil de utilă într-o gamă largă de aplicații. Cel mai bine, este ceva pe care Raspberry Pi-ul tău îl poate face fără a transpira. Cum? Hai să aruncăm o privire.
Ce este PWM?
După cum spune terminologia, „Pulse-Width Modulation” sună destul de elegant. Dar tot ceea ce vorbim aici este să oprim și să pornim din nou un semnal electric - extrem de rapid. De ce am putea dori să facem asta? Pur și simplu pentru că este o modalitate foarte ușoară de a simula un semnal analog variabil, fără a recurge la Raspberry Pi HAT-uri, suplimente, sau circuite suplimentare. Pentru anumite aplicații, cum ar fi încălzirea unei sobe, acționarea unui motor sau reglarea luminii unui LED, un semnal PWM nu se poate distinge literalmente de o tensiune analogică „reală”.
Cicluri de lucru
Deci, avem o serie de impulsuri care sunt introduse într-o încărcătură (lucru pe care îl conducem). Numai acest lucru nu este atât de util - până când începem să schimbăm (sau să modulăm) lățimea acelor impulsuri. Faza de „pornire” a unei anumite perioade de pornire-oprire poate ocupa oriunde de la 0 la 100% din ciclul total. Numim acest procentaj
ciclu de lucru.De exemplu, să presupunem că avem un semnal PWM de 3V cu un ciclu de lucru de 50%. Cantitatea medie de putere care trece prin LED ar fi echivalentă cu un semnal permanent de 1,5 V. Porniți ciclul de funcționare, iar LED-ul devine mai luminos; formați-l în jos și LED-ul se stinge. Putem genera audio folosind aceeași metodă - motiv pentru care ieșirea audio de pe Raspberry Pi ar putea să nu mai funcționeze dacă utilizați PWM pentru alte lucruri.
PWM pe Raspberry Pi
Puteți utiliza software-ul PWM pe fiecare pin GPIO al Raspberry Pi. Dar PWM hardware este disponibil numai pe GPIO12, GPIO13, GPIO18, și GPIO19.
Care este diferența? Ei bine, dacă veți folosi software pentru a genera semnalul, atunci veți consuma cicluri CPU. Totuși, procesorul tău ar putea avea lucruri mai bune de făcut decât să spui unui LED să se stingă și să se aprindă de câteva sute de ori pe secundă. De fapt, s-ar putea să devină distras și blocat de alte sarcini, care vă pot încurca serios cu sincronizarea PWM.
În consecință, este adesea o idee mai bună să delegați sarcina unui circuit specializat. În cazul Raspberry Pi, acest circuit trăiește în interior sistemul pe cip care adaposteste procesorul. Hardware PWM este adesea mult mai precis și convenabil și, prin urmare, este opțiunea preferată în majoritatea cazurilor. Dacă doriți o idee despre ce se întâmplă sub capotă în cipul Broadcom BCM2711 de la Raspberry Pi 4, atunci puteți să vă uitați la documentația BCM2711. Capitolul 8 acoperă chestiile PWM!
Reducerea luminozității unui LED
Pentru ca LED-ul nostru să funcționeze cu Raspberry Pi, va trebui să facem niște breadboarding. Asta înseamnă două componente: LED-ul însuși și un rezistor de limitare a curentului, pe care îl vom conecta în serie cu acesta. Fără rezistor, LED-ul dumneavoastră riscă să moară într-o pufă de fum urât mirositoare dacă trece prea mult curent prin el.
Calcularea valorii rezistenței
Nu contează la ce capăt al LED-ului conectați rezistența. Ceea ce contează este valoarea rezistenței. Raspberry Pi 4 poate furniza aproximativ 16 miliamperi per pin. Deci, putem utilizați legea lui Ohm pentru a determina valoarea rezistorului necesar.
Această lege prevede că rezistența ar trebui să fie egală cu tensiunea peste curent. Știm tensiunea care iese din pinul GPIO al lui Pi (3,3 V) și știm care ar trebui să fie curentul (16 miliamperi sau 0,016 amperi). Dacă împărțim primul cu cel din urmă, obținem 206,25. Acum, din moment ce vă veți chinui să găsiți rezistențe de această valoare, să mergem la 220 ohmi.
Conectați anodul LED-ului (picior lung) la GPIO 18 (care este pinul fizic 12 de pe Raspberry Pi). Conectați catodul (piciorul scurt) la oricare dintre pinii de împământare al lui Pi. Nu uitați de rezistență, undeva de-a lungul căii. Acum ești gata de plecare!
Implementarea PWM pe Raspberry Pi
Pentru ca hardware-ul PWM să funcționeze pe Raspberry Pi, vom folosi biblioteca rpi-hardware-pwm de la Cameron Davidson-Pilon, luat din cod de Jeremy Impson. Aceasta a fost folosită în Pioreactor (un bioreactor bazat pe Pi) — dar este suficient de simplu pentru scopurile noastre.
Mai întâi, hai editați config.txtfișier, găsit în /boot director. Trebuie doar să adăugăm o linie: dtoverlay=pwm-2chan. Dacă dorim să folosim pini GPIO alții decât 18 și 19, am putea adăuga câteva argumente suplimentare aici. Deocamdată, să păstrăm lucrurile simple.
Reporniți Pi și rulați:
lsmod | grep pwm
Această comandă listează toate modulele încărcate în partea centrală a sistemului de operare, numită kernel. Aici, le filtrăm pentru a găsi doar chestiile PWM, folosind grep (aceasta este comanda „printare expresie regulată globală”).
Dacă pwm_bcm2835 apare printre modulele listate, atunci suntem pe drumul cel bun. Aproape am terminat de pregătit! Tot ce rămâne este să instalați biblioteca propriu-zisă. Din terminal, rulați:
sudo pip3 install rpi-hardware-pwm
Acum suntem gata să începem.
Codarea circuitului LED PWM
E timpul să ne murdărim mâinile cu puțin codificare în Python. Porniți Thonny și copiați următorul cod. Apoi lovește Alerga.
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()
Toate fiind bine, veți vedea că LED-ul devine treptat mai luminos până la i variabila contor ajunge la 100. Apoi se va opri. Ce se petrece aici? Să trecem prin el.
Importăm partea relevantă a bibliotecii hardware PWM (împreună cu timp modul) și declarând o nouă variabilă. Putem seta pwm_channel la 0 sau 1, care corespund respectiv pinii GPIO 18 și 19 de pe Pi.
The hz valoare pe care o putem seta la orice frecvență ne place (deși în cele din urmă suntem limitați de viteza ceasului lui Pi). La 60 Hz, nu ar trebui să vedem nicio pâlpâire PWM. Dar ar putea fi o idee bună să începeți cu o valoare foarte mică (cum ar fi 10) și să schimbați treptat lucrurile. Fă acest lucru și vei putea de fapt să vezi pulsurile care se întâmplă. Nu ne credeți pe cuvânt!
Ne lucrăm ciclul de activitate (i) de la 0 la 100 folosind o buclă Python for. Este demn de remarcat faptul că putem seta timp.somn Argumentul atât timp cât ne place - deoarece PWM-ul este gestionat în hardware, va rula în culise, oricât de mult îi spunem programului să aștepte.
Există mai multe de învățat cu PWM
Felicitări! Ai scris primul tău program PWM. Dar, așa cum se întâmplă atât de des cu Raspberry Pi, puteți face multe cu aceste lucruri, mai ales dacă vă măriți Raspberry Pi-ul cu PWM HAT potrivit. Deci, nu vă mulțumiți cu un mic LED. Puteți folosi această nouă putere pentru a controla motoarele, a codifica mesaje și a genera tonuri de sintetizator. O lume a modulației vă așteaptă!