3.7 Schwingender Servo

In diesem Bausatz befinden sich neben LEDs und passivem Summer auch ein durch PWM-Signale gesteuertes Gerät, nämlich der Servo.

Der Servo ist ein Positions- (Winkel-) Servo, ideal geeignet für Steuerungssysteme, die konstante Winkeländerungen erfordern und aufrechterhalten können. Er findet häufig Anwendung in hochwertigen ferngesteuerten Spielzeugen, wie etwa Flugzeug-, U-Boot-Modellen und ferngesteuerten Robotern.

Versuchen wir nun, den Servo zum Schwingen zu bringen!

Benötigte Bauteile

Für dieses Projekt benötigen wir folgende Komponenten.

Es ist definitiv praktisch, das gesamte Set zu kaufen. Hier ist der Link:

Bezeichnung

BAUTEILE IM SET

LINK

Kepler Kit

450+

Kepler Kit

Die Bauteile können auch einzeln über die nachstehenden Links erworben werden.

SN

KOMPONENTE

MENGE

LINK

1

Raspberry Pi Pico W

1

BUY

2

Micro-USB-Kabel

1

3

Steckbrett

1

BUY

4

Jumperkabel

Mehrere

BUY

5

Servo

1

BUY

Schaltplan

sch_servo

Verdrahtung

wiring_servo

  • Das orangefarbene Kabel ist das Signal- und wird an GP15 angeschlossen.

  • Das rote Kabel ist VCC und wird an VBUS(5V) angeschlossen.

  • Das braune Kabel ist GND und wird an GND angeschlossen.

Code

Bemerkung

  • Öffnen Sie die Datei 3.7_swinging_servo.py im Verzeichnis kepler-kit-main/micropython oder kopieren Sie den Code in Thonny und klicken Sie auf „Aktuelles Skript ausführen“ oder drücken Sie einfach F5.

  • Vergessen Sie nicht, im unteren rechten Eck auf den Interpreter „MicroPython (Raspberry Pi Pico)“ zu klicken.

  • Für detaillierte Anleitungen siehe Code direkt öffnen und ausführen.

import machine
import utime

servo = machine.PWM(machine.Pin(15))
servo.freq(50)

def interval_mapping(x, in_min, in_max, out_min, out_max):
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

def servo_write(pin,angle):
    pulse_width=interval_mapping(angle, 0, 180, 0.5,2.5)
    duty=int(interval_mapping(pulse_width, 0, 20, 0,65535))
    pin.duty_u16(duty)

while True:
    for angle in range(180):
        servo_write(servo,angle)
        utime.sleep_ms(20)
    for angle in range(180,-1,-1):
        servo_write(servo,angle)
        utime.sleep_ms(20)

Während das Programm läuft, sehen wir den Servoarm, der zwischen 0° und 180° hin- und herschwingt.

Das Programm wird durch die Schleife while True ständig ausgeführt, daher müssen wir den Stopp-Button drücken, um es zu beenden.

Wie funktioniert es?

Wir haben die Funktion servo_write() definiert, um den Servo zu steuern.

Diese Funktion hat zwei Parameter:

  • pin, der GPIO-Pin, der den Servo steuert.

  • Angle, der Ausgangswinkel der Welle.

In dieser Funktion wird interval_mapping() aufgerufen, um den Winkelbereich von 0 ~ 180 Grad auf die Pulsdauer von 0,5 ~ 2,5 ms abzubilden.

pulse_width=interval_mapping(angle, 0, 180, 0.5,2.5)

Warum genau 0,5 ~ 2,5 ms? Das ist durch den Arbeitsmodus des Servos bestimmt.

Servo

Anschließend wird die Pulsdauer von der Periode in die Tastverhältnis umgewandelt. Da duty_u16() keine Dezimalstellen akzeptiert, verwenden wir int(), um das Tastverhältnis in einen Ganzzahltyp umzuwandeln.

duty=int(interval_mapping(pulse_width, 0, 20, 0,65535))

Schließlich wird der Tastverhältniswert in duty_u16() geschrieben.