Bemerkung

Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Spezialrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [hier] und treten Sie heute bei!

Lektion 33: Servomotor (SG90)

In dieser Lektion lernen Sie, wie Sie einen Servomotor (SG90) mit dem Raspberry Pi Pico W steuern können. Sie werden mit den Konzepten der Pulsweitenmodulation (PWM) zur Steuerung des Winkels des Servomotors vertraut gemacht. Die Lektion beinhaltet das Schreiben eines MicroPython-Skripts, um den Servo sanft durch seinen gesamten Bewegungsbereich von 0 bis 180 Grad und zurück zu bewegen.

Erforderliche Komponenten

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

Es ist definitiv praktisch, ein ganzes Kit zu kaufen, hier ist der Link:

Name

ITEMS IN THIS KIT

LINK

Universal Maker Sensor Kit

94

Universal Maker Sensor Kit

Sie können sie auch separat über die folgenden Links kaufen.

Component Introduction

Purchase Link

Raspberry Pi Pico W

KAUFEN

Servomotor (SG90)

KAUFEN

Steckbrett

KAUFEN

Verkabelung

../_images/Lesson_33_Servo_pico_bb.png

Code

import machine
import time

# Initialize PWM on pin 16 for servo control
servo = machine.PWM(machine.Pin(16))
servo.freq(50)  # Set PWM frequency to 50Hz, common for servo motors


def interval_mapping(x, in_min, in_max, out_min, out_max):
    """
    Maps a value from one range to another.
    This function is useful for converting servo angle to pulse width.
    """
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min


def servo_write(pin, angle):
    """
    Moves the servo to a specific angle.
    The angle is converted to a suitable duty cycle for the PWM signal.
    """
    pulse_width = interval_mapping(
        angle, 0, 180, 0.5, 2.5
    )  # Map angle to pulse width in ms
    duty = int(
        interval_mapping(pulse_width, 0, 20, 0, 65535)
    )  # Map pulse width to duty cycle
    pin.duty_u16(duty)  # Set PWM duty cycle


# Main loop to continuously move the servo
while True:
    # Sweep the servo from 0 to 180 degrees
    for angle in range(180):
        servo_write(servo, angle)
        time.sleep_ms(20)  # Short delay for smooth movement

    # Sweep the servo back from 180 to 0 degrees
    for angle in range(180, -1, -1):
        servo_write(servo, angle)
        time.sleep_ms(20)  # Short delay for smooth movement

Code-Analyse

  1. Importieren von Modulen und Initialisierung des Servos:

    Das Modul machine ist entscheidend für den Zugriff auf die PWM-Funktionalität, die zur Steuerung des Servos benötigt wird, und time wird für die Implementierung von Verzögerungen verwendet. Der Servo wird an Pin 16 des Raspberry Pi Pico W initialisiert und seine Frequenz auf 50 Hz eingestellt, ein typischer Wert für die Servosteuerung.

    import machine
    import time
    servo = machine.PWM(machine.Pin(16))
    servo.freq(50)
    
  2. Funktionen für Zuordnung und Servosteuerung:

    Die Funktion interval_mapping übersetzt den gewünschten Servowinkel in eine PWM-Pulsbreite. Die Funktion servo_write wandelt diese Pulsbreite dann in einen Tastgrad um, der verwendet wird, um die Position des Servos festzulegen. Diese Funktionen sind entscheidend, um die Winkelposition in ein geeignetes PWM-Signal umzuwandeln.

    Bitte beachten Sie Work Pulse für Informationen über den Arbeitspuls des Servos.

    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)
    
  3. Hauptschleife für kontinuierliche Bewegung:

    Die Hauptschleife ist der Ort, an dem der Servo gesteuert wird, um von 0 bis 180 Grad und zurück zu schwenken. Dies wird erreicht, indem der Bereich der Winkel durchlaufen wird und für jeden Winkel servo_write aufgerufen wird, mit einer kurzen Verzögerung, um eine reibungslose Bewegung zu gewährleisten.

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