Ansteuerung eines Servos mit Raspberry Pi Pico W und Pulsweitenmodulation (PWM)
Ein Servo ist eine der grundlegendsten Möglichkeiten, um die Verwendung der Pulsweitenmodulation mit dem Raspberry Pi zu erlernen.
Wir wollen lernen, wie man das mit einem Raspberry Pi Pico W macht.
Ziele des PWM-Tutorials

- Lernen Sie, wie man mit PWM den Winkel des Servos steuert
- Einrichten eines Servers mit dem Pico W
- Server liefert Webseite mit einem Schieberegler zur Steuerung des Servos
Benötigte Teile
- Raspberry Pi Pico W mit Headern
- Schaltdraht
- Servo (wir verwenden das Micro-Servo Tower Pro SG90)
Was ist Pulsweitenmodulation?
Kinder finden es amüsant, das Licht wiederholt ein- und auszuschalten.
Für sie ist es einfach amüsant zu sehen, wie das Licht flackert, wenn sie den Lichtschalter umlegen. Die Eltern finden das vielleicht nicht so lustig, aber wir alle können dabei etwas lernen.
Wenn Sie oder Ihre Kinder das getan haben, dann haben Sie eine primitive Form der Pulsweitenmodulation erlebt.
Mit einem Raspberry Pi können Sie dies ganz einfach automatisieren. Im Wesentlichen teilt man dem Raspberry Pi mit, wie oft er in einem bestimmten Zeitraum eingeschaltet werden soll.
Damit können Sie die LEDs dimmen:

Außerdem können Sie damit den Winkel des Servoarms steuern.
Ein wichtiges PWM-Konzept: das Tastverhältnis
Die Einschaltdauer ist im Grunde die Zeit, in der der Stromkreis "high" bleibt, d. h. er ist eingeschaltet.
Nehmen wir also an, Ihr Schaltkreis ist die Hälfte der Zeit eingeschaltet. Wir können also sagen, dass das Tastverhältnis bei 50% liegt.
Wenn das Gerät die ganze Zeit eingeschaltet ist, liegt die Einschaltdauer bei 100%, und umgekehrt, wenn es die ganze Zeit ausgeschaltet ist, liegt sie bei 0

Um auf das Beispiel eines Kindes zurückzukommen, das die Lichter regelmäßig ein- und ausschaltet: Der Grund, warum die Lichter nicht vollständig aufleuchten oder gedimmt werden, liegt darin, dass wir nur für einen bestimmten Zeitraum eine Ausgangsspannung liefern.
Bei einer LED bedeutet dies, dass die LED eine Zeit lang leuchtet, dann wird der Strom abgezogen, dann wird wieder Strom geliefert und so weiter.
Die LED wird also nie hell genug, um ihre volle Helligkeit zu erreichen, und sie hat auch nicht genug Zeit, um ganz dunkel zu werden.
SG90-Servosteuerung mit PWM
Wir müssen hier vorsichtig sein, da nicht alle Servos auf die gleiche Weise funktionieren. Diese Anleitung bezieht sich speziell auf das Micro-Servo Tower Pro SG90.
Das SG90 hat eine 180-Grad-Drehung, aber einige Servos sind 120-Grad-Servos. Bei Funksteuerungs-Hobbyservos handelt es sich höchstwahrscheinlich um 120-Grad-Servos. Prüfen Sie also unbedingt das Datenblatt des Servos, das Sie manipulieren möchten, da es möglich ist, Servos zu beschädigen, wenn Sie ihm ein Signal außerhalb des Bereichs geben.
Dies ist das Datenblatt für den SG90 von Luxor Parts:

Im Datenblatt finden Sie zwei wichtige Angaben: welche Farbe dem Plus, der Masse und dem Signal entspricht und die Impulsfrequenz/Tastverhältnis.
- Braun = negativ
- Rot = positiv
- Orange = Signal
Und für Pulsfrequenz/Tastverhältnis
- Sie benötigen ein Tastverhältnis von 20ms oder 50Hz.
- Ein Signal von 1ms = Null Grad
- Ein Signal von 2ms = 180 Grad gedreht

Das bedeutet, dass das Servo alle ms nach einer Aktualisierung sucht. Wenn Sie ihm weiterhin ein 2ms-Signal senden, bleibt es bei voller Drehung (180 Grad). Wenn Sie es auf 1,5 ms ändern, wird es sich um 90 Grad drehen, und bei 1 ms wird es sich um null Grad drehen.

Anschließen des Servos an den Pico W
Um unseren Code zu verwenden, müssen Sie die Signalleitung zu GPIO 0. Das Signalkabel ist das orangefarbene Kabel am SG90.
Schließen Sie dann das rote Kabel an VBUS (was Ihnen 5V liefert). Wie Sie aus dem Datenblatt sehen können, ist die Betriebsspannung für die SG50 4.8V bis 6V, so dass die 3.3V Pin auf der Pico W wird nicht funktionieren.
Codierung der Pico W-Servosteuerung
Sie können Hier finden Sie den Code auf unserem Github.
Schauen wir uns den Code an.
Unter main.pydie eine Namenskonvention für die Datei ist, die wir beim Booten ausführen wollen, erstellen wir eine Klasse für den Servo und instanziieren sie:
class Servo:
def __init__(self, MIN_DUTY=300000, MAX_DUTY=2300000, pin=0, freq=50):
self.pwm = machine.PWM(machine.Pin(pin))
self.pwm.freq(freq)
self.MIN_DUTY = MIN_DUTY
self.MAX_DUTY = MAX_DUTY
def rotateDeg(self, deg):
if deg < 0:
deg = 0
elif deg > 180:
deg = 180
duty_ns = int(self.MAX_DUTY - deg * (self.MAX_DUTY-self.MIN_DUTY)/180)
self.pwm.duty_ns(duty_ns)
servo = Servo()
Die Servoklasse verwendet die in MicroPython verfügbare Klasse machine.PWM. Siehe Dokumentation hier.
In diesem Beispiel verwenden wir den Pico W als Zugangspunkt. Hier ist der Code, um das zu ermöglichen:
ssid = 'Servo-Control'
password = 'PicoW-Servo'
ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)
while ap.active() == False:
pass
print('Connection successful')
print(ap.ifconfig())
Wie Sie in den ersten beiden Zeilen sehen können, lautet die gesuchte SSID Servo-Steuerung und das Passwort lautet PicoW-Servo.
Sobald Sie sich im WiFi-Netzwerk angemeldet haben, können Sie die IP-Adresse des Pico W aufrufen, die standardmäßig 192.168.4.1 lautet. Alternativ können Sie auch im Protokoll von Thonny nachsehen, wie die IP-Adresse Ihres Pico lautet.
Wie kommuniziert die Webseite mit dem Servo?

Wenn Sie sich an der IP-Adresse des Pico W anmelden, erhalten Sie die Datei index.html, die Sie im Github-Repositorium finden können.
Die Datei index.html enthält diese wichtigen Zeilen:
<form id="form">
<input type="range" class="slider" min="0" max="180" value="slider_value" name="servo" id="servo">
<output></output>
</form>
Wie Sie sehen können, gibt es ein -Objekt, das der Schieberegler ist.
Es gibt auch eine , die den Grad der Drehung anzeigt.
Der JavaScript-Teil aktualisiert die sowie die URL, damit der Pico W die Daten erfassen und den Servo drehen kann.
Die Elemente und haben ein übergeordnetes .
Hier ist das Skript auf der Vorderseite,
<script>
let i = document.getElementById('servo'),
o = document.querySelector('output');
o.innerHTML = i.value;
i.addEventListener('input', function () {
o.innerHTML = i.value;
}, false);
i.addEventListener('change', function () {
document.getElementById("form").submit();
}, false);
</script>
Sie werden hier zwei EventListener bemerken. Wenn Sie mit dem Schieberegler interagieren, wird eine Aktualisierung des -Feldes ausgelöst und das wird übermittelt.
Wenn das abgeschickt wird, wird die URL mit dem Parameter "servo=[Grad]" versehen. Wenn Sie zum Beispiel den Schieberegler auf 180 gestellt haben, lautet die URL "index.html?servo=180".
Dieser Parameter wird vom Backend des Pico W (main.py) erfasst, verarbeitet, um die vom Benutzer angegebenen Grade zu finden, und dann die rotateDeg Methode aufgerufen wird.
index = request.find('servo=') + len('servo=')
if request[index].isdigit():
offset = 1
if request[index+1].isdigit():
offset = 2
if request[index+2].isdigit():
offset = 3
deg = int(request[index:index+offset])
print(deg)
servo.rotateDeg(deg)
Praktische Anwendungen
Ein Servo ist ein sehr wichtiges mechanisches Werkzeug, das man kennen sollte, weil es in vielen Bereichen eingesetzt werden kann. Selbst komplizierte Projekte wie Roboterarme bestehen aus vielen Servos, die gemeinsam arbeiten.
Du kannst jetzt ein Projekt bauen, das die Beleuchtung in deinem Schlafzimmer ausschaltet:

Andererseits kann man auch Getreidesortierer bauen, wie dieser Tiny Sorter, hergestellt mit Hilfe von KI und einem Mikrocontroller.

Wenn man genau hinsieht, sieht man oben, wo die Kulleraugen sind, ein SG90-Servo dahinter.