servo_pwm.py
Un micro-servo (SG90, MG90) en D5 barre de 0 a 180°: PWM 50 Hz, pulsos de 0,5-2,5 ms calculados sobre la escala de 16 bits de pulseio. La orden clásica del barrido radar, lista para recibir cualquier posición.
Hardware
Una Adafruit Feather nRF52840 Express (nRF52840, BLE 5) con NeoPixel, LED rojo, 2 MB de flash QSPI para CircuitPython y conector LiPo. Un micro-servo de 5 V; alimentar por VOUT (5 V si USB) o batería aparte: el regulador 3V3 de la placa no aguanta el pico de arranque.
Cableado
Señal (hilo naranja/amarillo) a D5, + servo a VOUT, masa del servo a GND: masa común con la Feather, obligatorio.
Funcionamiento
pulseio.PWMOut genera el 50 Hz por hardware; la función angle mapea 0-180° entre duty 2,5 % y 12,5 % (0,5-2,5 ms en 20 ms). Los bucles for barren en ~1,4 s por pasada.
Ejecución
CircuitPython (build feather_nrf52840_express) vía bootloader UF2 (doble reset); editar code.py en la unidad CIRCUITPY.
Variantes
Pilotar el ángulo desde BLE o un sensor, añadir un segundo servo para un brazo de dos ejes, o suavizar el movimiento con interpolación.
servo_pwm.py
# Micro-servo sur D5 : balaie 0 -> 180 -> 0 degrés.
# Alimentation servo : broche VOUT (USB) ou batterie, pas le 3V3 seul.
import time
import board
import pulseio
servo = pulseio.PWMOut(board.D5, frequency=50, duty_cycle=0)
def angle(a):
# 20 ms de période : 0,5 ms = 0°, 2,5 ms = 180°
# duty_cycle 16 bits : 65535 = 20 ms
mini = int(65535 * 0.5 / 20)
maxi = int(65535 * 2.5 / 20)
servo.duty_cycle = mini + (maxi - mini) * a // 180
while True:
for a in range(0, 181, 5):
angle(a)
time.sleep(0.02)
for a in range(180, -1, -5):
angle(a)
time.sleep(0.02)