servo_pwm.py
Un micro-servo (SG90, MG90) sur D5 balaie 0 à 180° : PWM 50 Hz, impulsions 0,5-2,5 ms calculées sur l’échelle 16 bits de pulseio. La consigne classique du balayage radar, prête à recevoir n’importe quelle position.
Matériel requis
Une Adafruit Feather nRF52840 Express (SoC nRF52840 Cortex-M4F, BLE 5 / 802.15.4) avec NeoPixel embarqué, LED rouge, 2 Mo de flash QSPI pour le système de fichiers CircuitPython et connecteur batterie LiPo. Un micro-servo 5 V ; alimenter par VOUT (5 V si USB) ou une batterie séparée — le régulateur 3V3 de la carte est trop juste pour le pic de démarrage.
Câblage
Signal (fil orange/jaune) sur D5, + servo sur VOUT, masse servo sur GND — masse commune obligatoire avec la Feather.
Fonctionnement
pulseio.PWMOut génère le 50 Hz matériel ; la fonction angle mappe 0-180° entre les devoirs 2,5 % et 12,5 % (0,5-2,5 ms sur 20 ms). Les boucles for balaient à ~1,4 s par aller.
Exécution
CircuitPython (build feather_nrf52840_express) installé via le bootloader UF2 (double reset) ; éditer code.py sur le lecteur CIRCUITPY, console dans Mu/Thonny.
Variantes
Piloter l’angle depuis BLE ou un capteur, ajouter un second servo pour un bras à deux axes, ou lisser le mouvement avec une interpolation.
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)