Erfahren Sie, wie Sie die Helligkeit einer an einen Raspberry Pi angeschlossenen LED mithilfe von PWM steuern.
PWM ist etwas, das wir alle täglich nutzen, auch wenn wir es nicht wissen. Es handelt sich um eine Technik, die unkompliziert und in einer Reihe von Anwendungen unglaublich nützlich ist. Und das Beste: Ihr Raspberry Pi kann das, ohne ins Schwitzen zu geraten. Wie? Lass uns einen Blick darauf werfen.
Was ist PWM?
Wie es in der Terminologie heißt, klingt „Pulsweitenmodulation“ ziemlich ausgefallen. Aber eigentlich geht es hier nur darum, ein elektrisches Signal extrem schnell aus- und wieder einzuschalten. Warum sollten wir das tun? Ganz einfach, weil es eine sehr einfache Möglichkeit ist, ein variables analoges Signal zu simulieren, ohne darauf zurückgreifen zu müssen Raspberry Pi HATs, Add-onsoder zusätzliche Schaltkreise. Bei bestimmten Anwendungen, wie dem Heizen eines Ofens, dem Antreiben eines Motors oder dem Dimmen einer LED, ist ein PWM-Signal buchstäblich nicht von einer „echten“ analogen Spannung zu unterscheiden.
Arbeitszyklen
Wir haben also eine Reihe von Impulsen, die in eine Last eingespeist werden (das Ding, das wir antreiben). Dies allein ist nicht allzu nützlich – bis wir beginnen, die Breite dieser Impulse zu ändern (oder zu modulieren). Die „Ein“-Phase einer bestimmten Ein-Aus-Periode kann zwischen 0 und 100 % des Gesamtzyklus ausmachen. Wir nennen diesen Prozentsatz den Auslastungsgrad.
Angenommen, wir haben ein 3-V-PWM-Signal mit einem Arbeitszyklus von 50 %. Die durchschnittliche Strommenge, die durch die LED fließt, entspricht einem ständig eingeschalteten Signal von 1,5 V. Erhöhen Sie den Arbeitszyklus und die LED wird heller; Reduzieren Sie den Wert und die LED wird dunkler. Mit der gleichen Methode können wir Audio erzeugen – weshalb der Audioausgang Ihres Raspberry Pi möglicherweise nicht mehr funktioniert, wenn Sie PWM für andere Zwecke verwenden.
PWM auf dem Raspberry Pi
Sie können Software-PWM an jedem GPIO-Pin des Raspberry Pi nutzen. Aber Hardware-PWM ist nur verfügbar GPIO12, GPIO13, GPIO18, Und GPIO19.
Was ist der Unterschied? Nun, wenn Sie Software zum Generieren des Signals verwenden, verbrauchen Sie CPU-Zyklen. Ihre CPU hat jedoch möglicherweise Besseres zu tun, als einer LED zu sagen, dass sie sich mehrere hundert Mal pro Sekunde aus- und wieder einschalten soll. Tatsächlich könnte es durch andere Aufgaben abgelenkt und blockiert werden, was Ihre PWM-Timings ernsthaft durcheinander bringen kann.
Daher ist es oft eine bessere Idee, die Aufgabe an spezialisierte Schaltkreise zu delegieren. Im Fall des Raspberry Pi befindet sich dieser Schaltkreis im Inneren das System on Chip das die CPU beherbergt. Hardware-PWM ist oft weitaus präziser und praktischer und daher in den meisten Fällen die bevorzugte Option. Wenn Sie eine Vorstellung davon haben möchten, was unter der Haube im Broadcom BCM2711-Chip des Raspberry Pi 4 vor sich geht, dann können Sie einen Blick darauf werfen die BCM2711-Dokumentation. Kapitel 8 behandelt die PWM-Sachen!
Dimmen einer LED
Damit unsere LED mit unserem Raspberry Pi funktioniert, müssen wir ein paar Steckbretter bauen. Das bedeutet zwei Komponenten: die LED selbst und einen strombegrenzenden Widerstand, den wir in Reihe mit ihr schalten. Ohne den Widerstand besteht die Gefahr, dass Ihre LED in einer übelriechenden Rauchwolke stirbt, wenn zu viel Strom durch sie fließt.
Ermitteln des Widerstandswerts
Es spielt keine Rolle, an welches Ende der LED Sie den Widerstand anschließen. Was zählt, ist der Wert des Widerstands. Der Raspberry Pi 4 kann rund 16 Milliampere pro Pin liefern. Also können wir Verwenden Sie das Ohmsche Gesetz um den Wert des benötigten Widerstands zu ermitteln.
Dieses Gesetz besagt, dass der Widerstand gleich der Spannung über dem Strom sein sollte. Wir kennen die Spannung, die vom GPIO-Pin des Pi kommt (3,3 V), und wir wissen, wie hoch der Strom sein sollte (16 Milliampere oder 0,016 Ampere). Wenn wir Ersteres durch Letzteres dividieren, erhalten wir 206,25. Da es schwierig sein wird, Widerstände mit diesem Wert zu finden, wählen wir stattdessen 220 Ohm.
Verbinden Sie die Anode (langes Bein) der LED mit GPIO 18 (das ist der physische Pin 12 auf dem Raspberry Pi). Verbinden Sie die Kathode (kurzes Bein) mit einem der Erdungsstifte des Pi. Vergessen Sie nicht den Widerstand irgendwo auf dem Weg. Jetzt kann es losgehen!
Implementierung von PWM auf Raspberry Pi
Um das Hardware-PWM auf dem Raspberry Pi zum Laufen zu bringen, verwenden wir das rpi-hardware-pwm-Bibliothek von Cameron Davidson-Pilon, angepasst von Code von Jeremy Impson. Dies wurde in der verwendet Pioreaktor (ein Pi-basierter Bioreaktor) – aber für unsere Zwecke ist er einfach genug.
Lassen Sie uns zunächst einmal Bearbeiten Sie die config.txtDatei, gefunden in der /boot Verzeichnis. Wir müssen nur eine Zeile hinzufügen: dtoverlay=pwm-2chan. Wenn wir andere GPIO-Pins als 18 und 19 verwenden möchten, könnten wir hier einige zusätzliche Argumente hinzufügen. Lassen Sie uns die Dinge zunächst einfach halten.
Starten Sie Ihren Pi neu und führen Sie Folgendes aus:
lsmod | grep pwm
Dieser Befehl listet alle Module auf, die in den zentralen Teil des Betriebssystems, den sogenannten Kernel, geladen werden. Hier filtern wir sie mithilfe von, um nur das PWM-Material zu finden grep (das ist der Befehl „globaler regulärer Ausdruck drucken“).
Wenn pwm_bcm2835 Unter den aufgelisteten Modulen auftaucht, dann sind wir auf dem richtigen Weg. Wir sind fast mit der Vorbereitung fertig! Jetzt muss nur noch die eigentliche Bibliothek installiert werden. Führen Sie vom Terminal aus Folgendes aus:
sudo pip3 install rpi-hardware-pwm
Jetzt können wir loslegen.
Codierung der PWM-LED-Schaltung
Zeit, uns mit ein bisschen die Hände schmutzig zu machen Codierung in Python. Starten Sie Thonny und kopieren Sie den folgenden Code. Dann zuschlagen Laufen.
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()
Wenn alles in Ordnung ist, werden Sie sehen, wie die LED allmählich heller wird, bis das ich Zählervariable erreicht 100. Dann wird es ausgeschaltet. Was ist denn hier los? Gehen wir es durch.
Wir importieren den relevanten Teil der Hardware-PWM-Bibliothek (zusammen mit Zeit Modul) und Deklarieren einer neuen Variablen. Wir können das einstellen pwm_channel auf 0 oder 1, was den GPIO-Pins 18 und 19 auf dem Pi entspricht.
Der Hz Wir können den Wert auf eine beliebige Frequenz einstellen (obwohl wir letztendlich durch die Taktrate des Pi begrenzt sind). Bei 60 Hz sollten wir kein PWM-Flimmern sehen. Es könnte jedoch eine gute Idee sein, mit einem sehr niedrigen Wert (z. B. 10) zu beginnen und die Werte schrittweise zu erhöhen. Wenn Sie dies tun, können Sie die Impulse tatsächlich sehen. Verlassen Sie sich nicht nur auf unser Wort!
Wir arbeiten an unserem Arbeitszyklus (ich) von 0 auf 100 Verwenden einer Python-for-Schleife. Es ist erwähnenswert, dass wir das festlegen können Zeit.Schlaf Argument so lange, wie wir möchten – da die PWM in der Hardware gehandhabt wird, läuft sie hinter den Kulissen, egal wie lange wir dem Programm sagen, dass es warten soll.
Mit PWM gibt es noch mehr zu lernen
Glückwunsch! Sie haben Ihr erstes PWM-Programm geschrieben. Aber wie so oft beim Raspberry Pi können Sie damit eine Menge machen, insbesondere wenn Sie Ihren Raspberry Pi mit dem richtigen PWM-HAT erweitern. Geben Sie sich also nicht mit einer kleinen LED zufrieden. Mit dieser neuen Kraft können Sie Motoren steuern, Nachrichten kodieren und Synthesizertöne erzeugen. Eine Welt voller Modulation erwartet Sie!