servo.py

micro:bit V2 (BBC micro:bit v2) · Fichier : servo.py · Langage : MicroPython · Usage : Piloter un servo d'angle avec le potentiomètre ou les boutons

Le servo d'angle suit un potentiomètre lu sur l'entrée analogique pin0 : la période 20 ms et l'impulsion 500-2500 µs sont générées nativement par MicroPython. Un appui sur A impose 90°, l'angle s'affiche sur la matrice.

Matériel requis

Une BBC micro:bit V2 (nRF52833, matrice 5×5 LED, boutons A/B, accéléromètre + boussole, microphone et haut-parleur) alimentée par USB ou pile. 1 servo d'angle SG90 + 1 potentiomètre 10 kΩ ; alimentation externe 5 V conseillée pour le servo.

Câblage

Potentiomètre : curseur sur pin0, pistes sur 3V3 et GND. Servo : signal sur pin1, + sur 5 V externe, masses communes.

Fonctionnement

read_analog() renvoie 0-1023 converti en 0-180° ; set_analog_pulse_us applique l'impulsion standard. Le filtre de 3° évite le tremblement du servo autour de la valeur.

Exécution

Ouvrez python.microbit.org, collez le programme MicroPython et envoyez-le vers la carte (la micro:bit apparaît comme lecteur MICROBIT). Appuyez sur reset pour relancer.

Variantes

Remplacez le potentiomètre par l'inclinaison (accelerometer.get_x) pour un bras sans pièce, ou mémorisez des positions sur appui long.

servo.py

# Servo d'angle sur pin1 : angle suivi depuis l'entree analogique pin0.
from microbit import *

# MicroPython micro:bit : pulse servo via pin1.set_analog_period(20ms)
# puis set_analog_pulse_us(500..2500).
pin1.set_analog_period(20)

def angle_vers_pulse(a):
    # 0 degre = 500 us ; 180 degres = 2500 us (standard servo).
    return 500 + int(a * 2000 / 180)

dernier_angle = -1
while True:
    brut = pin0.read_analog()        # 0..1023 (potentiometre)
    angle = brut * 180 // 1023
    if abs(angle - dernier_angle) > 3:   # filtre anti-bruit
        dernier_angle = angle
        pin1.set_analog_pulse_us(angle_vers_pulse(angle))
        display.show(str(angle))
    # Bouton A : position 90 degres ; bouton B : balayage auto.
    if button_a.was_pressed():
        pin1.set_analog_pulse_us(angle_vers_pulse(90))
        display.show(Image.TARGET)
    sleep(20)

# Potentiometre : curseur sur pin0, 3V3 d'un cote, GND de l'autre.
# Servo : signal sur pin1, VCC externe 5V, GND commun.

← Retour à la fiche