Raccordement : 


Pour le servomoteur Feetech FS5115M

    • 0 à 180 ° -->  Période 20 ms et temps à l'état haut de 500 us à 2500 us
    • 4,8 à 6V
    • Datasheet 

Pilotage : il faut générer un signal MLI (Modulation de Largeur d'Implusion, PWM Pulse Width Modulation en anglais) de période 20ms (= 50Hz). 

Les valeurs peuvent varier en fonction du servomoteur. Exmple :


Programme permettant de piloter un servomoteur en position

Programme permettant de piloter un servomoteur en position et vitesse

Programme permettant de piloter un de piloter un servomoteur avec 2 boutons-poussoirs 

Programme permettant de piloter un servomoteur à partir d'un potentiomètre




 Programme permettant de piloter un servomoteur en position 


La commande  s'effectue à l'aide de l'instruction suivante :       servo( Angle voulu)      avec Angle voulu en °  (exemple : 0 à 180°)


from microbit import *

def servo(angle):
    pin2.set_analog_period(20)                        # MLI période 20 ms
    temps_haut = (2000/180) * angle + 500             # temps état haut en us, coefs en fonction du servomoteur utilisé
    rp_cyclique = int((temps_haut / 20000) * 1023)    # rapport cyclique de 0 à 1023
    pin2.write_analog(rp_cyclique)
   
while True:
    servo(0)            
    sleep(2000)
    servo(180)
    sleep(2000)




 Programme permettant de piloter un servomoteur en position et vitesse


La commande  s'effectue à l'aide de l'instruction suivante :       servo_deplacement( Angle départ, Angle voulu, Temps déplacement )      avec :


Angle départ

en °

exemple 0 à 180°

Angle voulu

en °

exemple : 0 à 180°

Temps déplacement


en ms



# pour servomoteur Feetech FS5115M
from microbit import *
angle = 90

def rp_cy(angle):
    temps_haut = (2000/180) * angle + 500
    rp_cyclique = (temps_haut / 20000) * 100
    return int((rp_cyclique / 100) * 1023)

def servo_deplacement(angle_depart, angle_voulu, temps_deplacement_ms):
    delta = angle_voulu - angle_depart
    nb_iteration = int(temps_deplacement_ms / 10)
    print('delta=', delta, ' nb_iteration=', nb_iteration)

    for i in range(nb_iteration):
        angle_depart = angle_depart + (delta / nb_iteration)
        print('angle=', angle_depart, ' i=', i)

        pin1.set_analog_period_microseconds(20000)              # MLI période 20ms
        pin1.write_analog(rp_cy(angle_depart))
        sleep(10)


while True:
    servo_deplacement(0, 180, 500)            # Déplacement de la position 0° à la position 180° en 500ms
    sleep(2000)
    servo_deplacement(180, 0, 500)
    sleep(1000)



Programme permettant de piloter un servomoteur avec  BPA et BPB



#pour servomoteur Feetech FS5115M ou autre
from microbit import *
impulsion = 1500

def set_servo(impulsion):
    alpha = (impulsion / 20000) * 100                                   # rapport cyclique de 0 à 100 %
    duty = (alpha / 100 ) * 1023                                        # rapport cyclique de 0 à 1023

    pin1.set_analog_period_microseconds(20000)                          # MLI période 20ms
    pin1.write_analog(duty)                                             # écriture sur la broche P1 du rapport cyclique (MLI)
    print('impulsion=',impulsion, ' alpha=', alpha, ' duty=', duty)     # affichage sur la console REPL

while True:
    if button_a.was_pressed() and impulsion>500 :
        impulsion = impulsion - 100
        display.show('-', delay=90, clear=True)

    if button_b.was_pressed() and impulsion<2500:
        impulsion = impulsion + 100
        display.show('+', delay=90, clear=True)

    set_servo(impulsion)
    sleep(500)




Programme permettant de piloter un servomoteur à partir d'un potentiomètre


Pour piloter un servomoteur, il faut générer une impulsion comprise entre 0.2 et 2.3 ms (par exemple) avec une période de 20ms.

  • pour 0.2 ms le rapport cyclique est de 0.2 / 20 = 0.01 (1%) soit write.analog( )  0.01 x 1023 = 10
  • pour 2.16 ms le rapport cyclique est de 2.3 / 20 = 0.115 (11.5%) soit write.analog( )  0.115 x 1023 = 118



from microbit import *

def servo(angle):
    rapport_cyclique = ((118-10)/180) * angle + 10  # calcul du rapport cyclique entre 0 et 1023 (0-100%)
    pin1.set_analog_period(20)                      # MLI avec période de 20ms
    pin1.write_analog(rapport_cyclique)             # écriture du rapport cyclique sur la broche P1

while True:
    pot = pin0.read_analog()                    
    angle = pot /1023 * 180
    print ('angle = ',angle , 'deg')
    servo(angle)                                    # appel de la fonction angle
    sleep(500)

































Créé avec HelpNDoc Personal Edition: Environnement de création d'aide complet