pwm-servo.py

Raspberry Pi Pico 2 W · Fichier : pwm-servo.py · Langage : Python · Usage : Faire balayer un servo-moteur avec un signal PWM

Le servo d'angle balaie 0 à 180° puis revient, piloté en PWM 50 Hz par machine.PWM. La fonction angle() convertit l'angle en impulsion de 0,5 à 2,5 ms via duty_u16, la technique standard sans bibliothèque dédiée.

Matériel requis

Une Raspberry Pi Pico 2 W (RP2350 + radio Wi-Fi 2,4 GHz) avec MicroPython installé, alimentée par USB. 1 servo d'angle type SG90 (3 fils : signal, +, -) ; alimentation externe conseillée au-delà d'un micro servo.

Câblage

Fil signal (orange) sur GP16, + (rouge) sur 5 V ou source externe 5 V, - (marron) sur GND commun.

Fonctionnement

PWM(Pin) génère un créneau 50 Hz (période 20 ms). duty_u16 fixe la largeur d'impulsion proportionnelle : 0,5 ms = 0°, 1,5 ms = 90°, 2,5 ms = 180°.

Exécution

Installer le MicroPython « Pico 2 W » (BOOTSEL + .uf2), copier le script via Thonny. Comme sur la Pico W, la LED utilisateur n'est pas sur un GPIO : utiliser une LED externe pour les sorties.

Variantes

Piloter l'angle avec un potentiomètre sur l'ADC (GP26) pour un bras suiveur, ou mémoriser des positions avec un tableau de angles.

pwm-servo.py

# Balayage 0-180 degres d'un servo d'angle avec machine.PWM.
from machine import Pin, PWM
import time

SERVO_PIN = 16
servo = PWM(Pin(SERVO_PIN))
servo.freq(50)  # periode 20 ms : standard des servos

def angle(a):
    # 0 degre = impulsion 0,5 ms ; 180 degres = 2,5 ms.
    # duty_u16 : 65535 = 100 % de la periode de 20 ms.
    ms = 0.5 + (a / 180.0) * 2.0
    servo.duty_u16(int(ms / 20.0 * 65535))

print("Balayage servo 0-180")
while True:
    for a in range(0, 181, 5):
        angle(a)
        time.sleep_ms(30)
    for a in range(180, -1, -5):
        angle(a)
        time.sleep_ms(30)

# Alimentation : pour un gros servo, utiliser une source 5 V
# externe en reliant les masses (GND commun avec la carte).

← Retour à la fiche