Servomoteurs

Note :

  • solution 1 : utiliser la classe Servo micropython... mais cela n'est possible que sur 4 broches.

  • solution 2 : utiliser la PWM :
    • sachant que la période de "porteuse" de l'impulsion servo est de 17ms, on l'obtient en fixant une fréquence PWM de 1/0,017=58,8Hz soit ~60Hz
    • ensuite, le niveau HAUT fixe l'angle avec une résolution de 17/255 = 66µs
    • soit angle~0 pour 500µs soit pwm =500/66~8µs
    • soit angle~90 pour 1000µs soit pwm =1500/66~22µs
    • et angle ~180 pour 2350µs soit pwm=2350/66~35µs

La "résolution" n'est pas "extraordinaire"... mais c'est déjà çà. Ceci étant, en passant par la définition de la période du timer, on peut être beaucoup plus précis à priori... Le duty-cycle 100% est obtenu pour une durée exprimée durée de la période, celle-ci étant à 100% si duty=periode...

Voir : http://docs.micropython.org/en/latest/pyboard/library/pyb.Timer.html#pyb-timer

AUtre point intéressant : un même timer peut être utilisé pour 4 channels configurables différemment pour le dutycyle...


import pyb

timer = pyb.Timer(5, freq=50)
#timer=pyb.Timer(2, prescaler=0, period=20) 
# period est le nombre de pulse utilisés
# period [0-0xffff] for timers 1, 3, 4, and 6-15. [0-0x3fffffff] for timers 2 & 5
ch1 = timer.channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.X1, pulse_width=210000) # T2C1 sur X1

# à 50 hz = 20ms de période = impulsion servomoteurs : le pulse 100% est à 1 680 000 sur timer 2 ou 5, 50% à 840000
# 20ms = 20000µs du coup, le pulse 500µs(0°) est à 42000, le pulse de 2500(180°) est à 210000