pwm-servo.py

Raspberry Pi Pico 2 · 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 (RP2350 double Cortex-M33 @ 150 MHz) 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 » (maintenir BOOTSEL, brancher l'USB, déposer le .uf2), puis copier le script via Thonny. Démarrage automatique avec le nom main.py.

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