PWM-Signal auf dem Raspberry PI PINs läst sich nicht ansteuern
Beim Prüfen der PWM-Ausgänge musste ich feststellen, dass sich die Pins nicht ansprechen ließen.
Hierfür habe ich ein C#-Projekt mit .NET erstellt, das auf die GPIOs zugreift und ein PWM-Signal zur Steuerung von zwei Servos einrichtet.
Selbst mit direkten Shell-Kommandos ließen sich die PWM Pins auf dem Raspberry Pi nicht einstellen.
Verwendete Hardware
- Raspberry Pi 4
- Raspbian OS
- Mini-Servo
Ziel
Einen GPIO-Pin für PWM-Signale korrekt einrichten, sodass ein Servo zuverlässig gesteuert werden kann.
- GPIO12 auf PWM festlegen
- GPIO13 auf PWM festlegen
Welche Version von Raspbian OS ist installiert?
Mit folgendem Befehl werden mehrere Zeilen ausgegeben, die Informationen über die aktuell verwendete Linux-Version liefern:
hostnamectl PWM zunächst einrichten
Über die config.txt kann der PWM-Eintrag gesetzt werden.
In älteren Raspbian-Versionen befand sich diese Datei unter /boot/config, der Pfad hat sich jedoch geändert zu:
/boot/firmware/config.txt Bearbeiten der Datei:
sudo nano /boot/firmware/config.txt Ganz nach unten scrollen und folgenden Eintrag setzen:
dtoverlay=pwm-chan HINWEIS: Dieser Eintrag ist Teil des Problems. Die korrekte Lösung wird im letzten Abschnitt unter „Dauerhaft einstellen“ beschrieben.
Speichern mit STRG + O, bestätigen mit ENTER.
Nano mit STRG + X verlassen.
Anschließend muss das Betriebssystem neu gestartet werden:
sudo reboot Servo anschließen
Der Servo kann nun am Raspberry Pi angeschlossen werden.
Die Stromversorgung sollte jedoch nicht über die GPIO-Pins des Raspberry Pi erfolgen. Eine Ausnahme gilt nur für Mini-Servos ohne nennenswerte Last und mit sehr geringem Stromverbrauch.
Zwar kann die USB-C-Stromversorgung bis zu 3 A liefern, dennoch empfiehlt es sich, unter 500 mA zu bleiben und die Stromaufnahme nicht auszureizen.
Einrichtung über die Shell
Zunächst ein einfacher Test, um einen Servo direkt über die Shell anzusteuern.
Prüfen, ob der PWM-Chip verfügbar ist
ls /sys/class/pwm Das erwartete Ergebnis ist pwmchip0.
Andernfalls muss der Chip über die config.txt korrekt eingerichtet werden.
Prüfen, ob pwm0 vorhanden ist
ls /sys/class/pwm/pwmchip0 In meinem Fall wurde nur pwm1 angezeigt.
PWM-Kanal exportieren
echo 0 | sudo tee /sys/class/pwm/pwmchip0/export Danach sollte auch pwm0 verfügbar sein.
PWM für Servo einstellen
Periode: 20 ms
echo 20000000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/period Pulsweite für Mittelstellung (1,5 ms)
echo 1500000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/duty_cycle PWM aktivieren
echo 1 | sudo tee /sys/class/pwm/pwmchip0/pwm0/enable An dieser Stelle sollte der Servo in die Mittelstellung fahren.
Servo nach links bewegen (Pulsweite 1 ms)
echo 1000000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/duty_cycle Servo bewegt sich weiterhin nicht
Wenn sich der Servo trotz dieser Einstellungen nicht bewegt, liegt die Ursache sehr wahrscheinlich an der Pin-Konfiguration.
Als Nächstes wird der Status des GPIO-Pins geprüft:
raspi-gpio get 12 In meinem Fall erschien die Meldung „command not found“.
Alternative Prüfung
pinctrl get 12 Damit lässt sich ebenfalls die aktuelle Konfiguration von GPIO12 auslesen.
In meinem Fall ergab sich folgendes Ergebnis:
raspi-gpio-Paket installieren?
In aktuellen Versionen von Raspbian OS ist das Paket raspi-gpio nicht mehr standardmäßig installiert.
Ein Nachinstallieren ist grundsätzlich möglich:
sudo apt update
sudo apt install raspi-gpio In meinem Fall trat dabei jedoch ein Fehler auf.
Offenbar ist hier entweder eine Anpassung seitens der Distribution erforderlich – oder das Paket wird nicht mehr vorgesehen.
Pin umstellen (Pin-Multiplexing)
In meinem Fall war GPIO12 als INPUT konfiguriert und musste über Pin-Multiplexing umgestellt werden.
GPIO12 auf PWM0 setzen:
sudo pinctrl set 12 a0 Die Änderung sollte ohne Neustart wirksam sein.
Bei mir bewegte sich der Servo danach endlich wie erwartet.
Dauerhaft einstellen
Rückblickend hätte ich diese Konfiguration direkt zu Beginn vollständig setzen sollen.
Hätte ich das früher gewusst, hätte ich mir viele Zwischenschritte erspart, da sich die meisten Lösungsansätze nur auf kurzfristige Workarounds beziehen.
Für eine dauerhafte PWM-Konfiguration muss folgender Eintrag in der Datei
/boot/firmware/config.txt gesetzt werden:
dtoverlay=pwm-2chan,pin=12,func=4,pin2=13,func2=4 Danach speichern mit STRG + O, bestätigen mit ENTER, Nano mit STRG + X beenden und anschließend neu starten:
sudo reboot Fazit
Offensichtlich wurde mit der neuen Betriebssystemversion deutlich aufgeräumt. Viele Funktionen scheinen heute durch unterschiedliche Bibliotheken mehrfach vorhanden zu sein oder wurden neu strukturiert.
Erst mit Unterstützung von Microsoft Copilot und ChatGPT bin ich – nach zahlreichen Fragen und Fehlversuchen – auf diese Lösung gestoßen.
Über die klassische Google-Suche bzw. Gemini führte der Weg ebenfalls nicht direkt zum Ziel.
Ein möglicher Grund dafür ist der Wechsel des Raspbian OS von Bookworm auf Trixie, der intern offenbar einige Änderungen an der GPIO- und PWM-Konfiguration mit sich gebracht hat.
Kommentare