pwm-servo.py
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 W (RP2040 + chip radio Wi-Fi de 2,4 GHz) 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 la versión MicroPython « Pico W » (BOOTSEL + .uf2) y copia el script vía Thonny. Como el LED de usuario lo gestiona el chip de radio, los ejemplos de salida usan un LED externo.
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).