servo_pwm.py

Adafruit Feather nRF52840 Express · Archivo : servo_pwm.py · Lenguaje : Python · Uso : Animer un micro-servo sur une broche PWM

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)

← Volver a la ficha