Im vierten Teil der Programmierreihe geht es darum die Raspberry Pi GPIO PWM Funktionalität näher kennen zu lernen. Wie wir generell die GPIOs nutzen um einfache Schaltungen zu erstellen, haben wir in vorherigen Teilen bereits gesehen. Allerdings können die GPIOs noch viel mehr als nur an- und ausgeschaltet werden bzw. die anliegende Spannung auslesen. Mit PWM können die GPIOs des Raspberry Pi’s nämlich auch dimmen und Servomotoren steuern.
Daher wird in diesem Artikel erklärt, was PWM eigentlich ist und wie man es mit den GPIOs des Raspberry Pi’s nutzen kann. Damit lassen sich zum Beispiel Servo Motoren oder mehrfarbige bunte RGB LEDs mit dem Raspberry Pi steuern.
Raspberry Pi GPIO PWM Zubehör
Für dieses Tutorial nutzen die folgenden Teile:
- Raspberry Pi
- LEDs (mindestens eine)
- Vorwiderstände
- Breadboard
- Jumper Kabel
Übrigens: Mit diesem Tutorial ist es auch möglich RGB LEDs zu steuern und somit mit einer LED jede beliebige Farbe nachzustellen.
All diese Komponenten sind auch in einem Raspberry Pi Starter Kit vorhanden.
Ebenfalls kannst du mit PWM einen Servomotor (oder gleich mehrere?) steuern und so z.B. deinen eigenen Roboterarm fernsteuern. Dazu ist es hilfreich PWM im Allgemeinen zu verstehen.
Was ist PWM?
PWM steht für Pulsweitenmodulation (Englisch: Pulse-width modulation) und beschreibt den Vorgang, bei dem ein Signal zwischen zwei Spannungen wechselt. In digitalen Schaltungen gibt es meist nur zwei Pegel – die Raspberry Pi GPIOs können bspw. nur entweder 3.3V oder 0V anliegen haben. Somit ist es bspw. nicht möglich ohne weiteres eine Spannung dazwischen zu generieren.
Nutzt man PWM hat man jedoch eine Alternative: Es gibt nämlich hierbei zwei Parameter: Zum einen die Periodendauer (im Bild ist dies T) und die Impulsdauer (im Bild t1). Teilt man t1 durch T erhält man den sogenannten Tastgrad (englisch: duty cycle). Ein Tastgrad von 1 bzw. 100% wäre somit das selbe, wie wenn man die ganze Zeit die obere Spannung (bspw. 3.3V) anliegen hätte, ebenso würden 0% heißen, dass die ganze Zeit keine Spannung anliegt.
Ist die Periode kurz genug, kann man so auch analoge Spannungen quasi nachstellen, da die Reaktionszeit nicht all zu schnell ist. Normalerweise befindet sich die Periodendauer im Bereich von ~100ms, abhängig vom zu verwendeten Modul. Wichtig ist also der Durchschnitt. Ist in 25% der Zeit die Spannung auf 3.3V und 75% auf 0V, so ergibt sich eine durchschnittliche Spannung von 0,825V.
Bei Servomotoren und dessen Treiberboards wird die Angabe der Periode und des Tastgrads meist im Datenblatt gemacht. Im Beispiel eines MG996R haben wir folgendes vorliegen: Die Periode ist 20ms lang. Außerdem wird ein Tasgrad von zwischen 5% und 10% der Periode erwartet. Somit die die Impulsdauer zwischen 1ms und 2ms. Üblicherweise können Servos zwischen 0 und 180° rotieren. Daher müssen wir die Impulslänge dazwischen anpassen. Eine Länge von 1,5ms (7,5%) ergibt somit einen Winkel von 90°. Und das ganze eben 50x pro Sekunde (50Hz).
Wie kann man Raspberry Pi PWM über GPIOs nutzen?
Nachdem wir nun wissen was die Pulsweitenmodulation / PWM ist, wollen wir diese auch nutzen. Dafür schalten wir in diesem Tutorial zunächst eine LED. Allerdings soll diese nicht wie zuvor einfach nur an- und wieder ausgeschaltet werden, sondern gedimmt werden. Dazu soll sie sich von „Dunkel“ langsam zu komplett „Hell“ ändern.
Starten wir also mit der Verkabelung. Die LED hat zwei unterschiedlich lange Seiten. Das längere Ende kommt an die positive Spannungsquelle (in dem Fall den GPIO) und das kürzere Ende GND (Eselsbrücke: Plus hat zwei Striche -> längeres Ende). Damit die LED geschont wird nehmen wir einen 100Ω Vorwiderstand. Hast du gerade keinen zur Hand, kannst du ggf. auch die Spannung per PWM niedriger regeln. Du kannst jeden beliebigen, programmierbaren GPIO nehmen, der frei ist. Falls du von meinem Aufbau abweichst, musst du das kommende Skript allerdings auch umschreiben. Ich nutze GPIO 23:
PWM Programmierung der GPIOs
Öffne nun deine Python Konsole oder erstelle ein Skript, welches wir ausführen mit folgendem Inhalt:
sudo nano gpio_pwm_test.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(23, GPIO.OUT) p = GPIO.PWM(23, 50) # frequency=50Hz p.start(0) try: while 1: for dc in range(0, 101, 5): p.ChangeDutyCycle(dc) time.sleep(0.1) for dc in range(100, -1, -5): p.ChangeDutyCycle(dc) time.sleep(0.1) except KeyboardInterrupt: pass p.stop() GPIO.cleanup() |
Nach dem Speichern (STRG+O, STRG+X), führe es hiermit aus:
sudo python gpio_pwm_test.py
Um das Skript abzubrechen, kannst du einfach STRG+C drücken.
Vielleicht fragst du dich, wie man nun bunte RGB LEDs damit einstellt: Diese haben vier Anschlüsse, wobei an drei davon jeweils ein GPIO kommt. Der vierte Pin ist GND / Masse und kommt ebenfalls an GND. Die drei Pins stehen für Rot, Grün, Blau. Sobald man die Intensität der drei Kanäle variiert, ändert sich auch die Farbe (weitere Infos).
Weitere Raspberry Pi PWM Möglichkeiten
Wie schon erwähnt ist mit PWM noch viel mehr anzustellen, als nur einfache LEDs zu steuern. Eine davon ist eben Servos zu steuern. Damit lassen sich dann Projekte wie der Roboter Arm mit mehreren Servos umsetzen (mit dem PCA9685). Außerdem können Servos auch mit Controllern gesteuert werden, wie ich in dem Video gezeigt habe:
Zum Schluss noch die Frage: Welches Thema soll in der „Programmieren für Anfänger“ Reihe im Bezug auf den Raspberry Pi als nächstes behandelt werden?
23 Kommentare
Hey Felix.
Erstmal, wie immer ein tolles Tutorial.
Zweitens verstehe ich nicht nicht wo dies „sudo nano gpio_pwm_test.py“ zum einsatz kommt, wenn ich das in die Python Konsole eintrage kommt das danei herraus:
>>> sudo nano gpio_pwm_test.py
File „“, line 1
sudo nano gpio_pwm_test.py
^
SyntaxError: invalid syntax
>>>
Ich weiß nich tob das so richtig ist.
Außerdem schreibe ich gerade meine Facharbeit in Informatik und habe mir dazu das Theama deiner Tutorials zum Roboter bau und Programmierung rausgesucht und da verstehe ich auch nicht wie und wo beispielweise das:
sudo mkdir RaspberryPi-Robot
cd RaspberryPi-Robot
sudo nano l293d.py
zum einsatz kommt (das ist aus dem ersten Teil des Tutorials), deswegen würde ich mich sehr freuen wenn du mir da helfen könntest.
Liebe Grüße
Max
mojn max
um dir ma etwas zu helfen :
mkdir = make dir .. bedeutet soviel wie erstelle einen Ordner dahinter steht der name des Orners, in diesem fall RaspberryPi-Robot
cd = change directory … wechel in den ordner …. dahinter den Namen oder Pfad zum Ordner
nano = text editor …. damit rufst du einen reinen texteditor auf in dem du dein Code oder sonstiges schreiben kannst
ich sag ma einfa linux kenntnisse sollten da schon reichen da ein bischen einlesen denn ist das selbst erklärend.
zu dem oberen fehler kann ich dir leider nichst sagen da du eigentlich nur den editor aufrufst vondaher weiss ich nicht wirklich woher der fehler stammen könnte
das sieht meiner seits ehr so aus als ab du da gerade nano mit python verwechselt hast und wenn es doch python ist liegt da ein syntaxfehler in zeile 1 vor.
lg
Hallo, dieses Sudo band muss du im Terminal eingeben, darin kannst du dann den Videos der datei von der Website schreiben
Du musst das ganze in der normalen Konsole / Terminal eingeben, nicht in der Python Konsole (daher der Fehler) 🙂
Hallo Felix, tolles Tutorial. Ich möchte eine Led Lampe mit 24 v und 4 A dimmen (Apuarium) Was für einen Hardware Treiber würdest Du empfehlen und gibt es da Beispiele ? Vielen Dank.
Liebe Grüße
Renne
Du könntest so etwas mit Sonoff Wifi Devices machen. Dazu sind bereits Tutorials geplant. Wie hoch muss der PWM Pegel denn sein? Bei 5V Motoren reicht nämlich auch ein 3.3V Signal (und 5V Spannung).
Danke an euch drei und mit normalen Konsole ist die Windows cmd Zeile gemeint oder ?
Nein, die Konsole auf dem Raspberry Pi (z.B. per SSH) Im ersten Teil ist das noch genauer beschrieben.
Ist mir gerade auch augefallen das das mit Windows garnicht geht.
Muss ich mir erst dran gewöhnen mit zwei systemen zu Arbeiten.
Trotzdem nochmal vielen Dank björn, Nico und Felix
Und ich hoffe du machst weiterhin so interessante Tutorials
LG Max
Hallo Felix…
Ich meine ein Servo dreht um 360grad (da Kreisbewegung) nicht 180, hat sich da ein Fehler eingeschlichen?
Oder verwendest du besondere Bauformen?
Gruß Skipper
Welchen Servo nutzt du? Die üblichen sind für 180° ausgelegt.
Hey Felix ich bin nochmal,
wie würdest du den Aufbau des Raspberrys beschreiben den du benutzt (ich bräuchte da mal ein paar anregungen für meine Facharbeit), ich würde mich sehr freuen wenn du mir ein paar Ideen zukommenlassen würdest. Natürlich dann wenn du Zeit und Lust hast.
LG Max
Was meinst du mit dem Aufbau des Raspberry Pis? Irgendeinen bestimmten Aufbau in einem Tutorial?
Ja das auch aber dazu später was, ich meine aus welchen komponenten er besteht, ich ahbe dazu zwar schon ein bisschen was wäre aber trotzdem sehr nett von dir wenn du mir da helfen könntest.
Und dann noch was in diesem Tutorial:
raspberry-pi-roboter-bausatz-zusammenbau Teil 1, da blick ich auch noch nicht ganz so mit der verkabelung durch, ich bin da noch ziemlich noobig was das verkabeln angeht.
Deswegen würde ich mich sehr freuen wenn du mir auch da helfen würdest und es tut mir leid falls ich in letzter zeit durch meine viele fragerei deine Nerven strapaziere.
LG Max
Aus was der Raspberry Pi besteht? CPU+GPU, Arbeitsspeicher, Widerstände, Transistorem, Kondensatoren, Anschlüssen, etc. nur eben alles auf einer Platine verbaut.
Die Verkabelung im Roboter Tutorial ist doch schematisch gezeigt, am besteh du beschreibst dein Problem im dortigen Tutorial etwas genauer.
Ok mache ich.
Danke für deine Hilfe
Endgeile Tutorials hier, aber du solltest nicht so mit den „SUDO’s“ um dich schmeißen.
Weiter so
Hi,
ich habe eine Frage. Was bedeuten die Zahlen in der Klammer in dem Befehl: “ for dc in range(0, 101, 5): „.
Das habe ich nicht ganz verstanden.
Danke & Gruß,
André
Hallo,
beim Aufruf aus dem Terminal bekomme ich den Fehler, dass er rpi nicht finden kann. In der Auflistung der Module sehe ich es aber. Auch eine Nachinstallation sagt, dass es schon vorhanden ist.
Viele Grüße
Katrin
Hallo,
ich weiß das dieses Tutorial etwas älter ist , daher mache ich mir nicht so große Hoffnung, dass jemand mir antwortet. Es würde mich jedoch freuen, denn ich brauche dringend Hilfe. Ich versuche gerade mit Hilfe von PWM mehrer Leds anzusteuern, jedoch leuchtet immer nur eine und nicht wie geplant 8.
Ich verstehe den Code dafür nicht, kann ich einfach den selben Code wie oben unten einfügen nur mit anderen GPIO Werten?
Viele Grüße
Yasin
Ja, das geht. Ansonsten kannst du auch ein PWM Board nutzen, falls du mehrere steuern willst.
Moin Felix,
leider findet man auch in den englischsprachigen Weiten des Internets nicht wirklich, was man braucht: bis zu welcher PWM-Frequenz funktioniert das in deinem Artikel beschriebene Verfahren denn?
Ich möchte 12V PWM Lüfter steuern (laut der Intel PWM Spezifikation reichen die 3.3VDC des Raspberry definitiv aus (Logic LOW < 0.8VDC; I max. ist < 5mA). Die Spezifikation sieht 25 kHz als PWM Frequenz vor. Kann der Raspi das?
VG – stay safe
Yannik
Gibt es einen Adapterfür den IObroker um ein GPIO als PWM zu nutzen. Tasmota hat für den ESP so was. Damit konnte ich ein blocky im IObroker erzeugen und die Einstellung dort vornehmen bzw. Durch einen ESP der am Zähler sitzt Steuer.
Gruß
Freddy