pwm-servo.py

Raspberry Pi Pico · Archivo : pwm-servo.py · Lenguaje : Python · Uso : Faire balayer un servo-moteur avec un signal PWM

El servo de ángulo barre de 0 a 180° y vuelve, controlado por PWM a 50 Hz con machine.PWM. La función angle() convierte los grados en un impulso de 0,5 a 2,5 ms mediante duty_u16, la técnica estándar sin librería dedicada.

Hardware

Una Raspberry Pi Pico (RP2040 doble Cortex-M0+ @ 133 MHz) con MicroPython instalado, alimentada por USB. 1 servo de ángulo tipo SG90 (3 hilos: señal, +, -); alimentación externa aconsejada por encima de un micro servo.

Cableado

Hilo de señal (naranja) a GP16, + (rojo) a 5 V o fuente externa de 5 V, - (marrón) a GND común.

Funcionamiento

PWM(Pin) genera una señal cuadrada de 50 Hz (periodo 20 ms). duty_u16 fija el ancho de impulso proporcional: 0,5 ms = 0°, 1,5 ms = 90°, 2,5 ms = 180°.

Ejecución

Instala MicroPython si hace falta (mantén BOOTSEL, conecta el USB, suelta el archivo .uf2) y copia el script en la unidad de la placa o vía Thonny. El script arranca solo si se llama main.py.

Variantes

Controla el ángulo con un potenciómetro en el ADC (GP26) para un brazo seguidor, o memoriza posiciones en una tabla de ángulos.

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).

← Volver a la ficha