Test position servomoteur¶
Ce que l'on va faire ici¶
Dans ce programme Micropython, nous allons tester un servomoteur.
Matériel¶
- une carte Pi Pico flashée avec MicroPython et préparée pour utilisation en vertical sur plaque d'essai
- un (mini)servomoteur
- une petite plaque d'essai
- quelques jumpers
Le schéma théorique¶
- Le V+ du servomteur est connecté au 5V
- le 0V à la masse GND de la carte
- la broche de commande à une broche en sortie de la carte à micro-controleur
Le montage à réaliser¶
On connecte :
- Le V+ du servomteur est connecté au 5V
- le 0V à la masse GND de la carte
- la broche de commande à une broche en sortie de la carte à micro-controleur, par exemple la GP18
Débrouillage dans l'interpréteur¶
Il peut être intéressant de chercher dans l'interpréteur les valeurs limites du servomoteur dont on dispose.
>>> from machine import Pin, ,PWM # importe les classes
>>> pwm=PWM(Pin(18)) # crée un objet PWM sur la broche
>>> pwm.freq(50) # fixe la fréquence de l'onde PWM pour servomoteurs - 50 Hz
>>> pwm.duty_u16(1638) # valeur minimale théorique
>>> pwm.duty_u16(8192) # valeur maximale réelle
>>> pwm.duty_ns(2450*1000)
>>> pwm.duty_ns(2500*1000)
>>> pwm.duty_ns(2600*1000)
>>> pwm.duty_ns(2500*1000)
>>> pwm.duty_ns(550*1000)
>>> pwm.duty_ns(500*1000)
>>> pwm.duty_ns(450*1000)
>>> pwm.duty_ns(500*1000)
>>> pwm.duty_ns(1500*1000)
>>> for i in range(500,2500,10):
... pwm.duty_ns(i*1000)
... utime.sleep_ms(50)
Le code¶
- un objet PWM est créé basé sur la broche utilisée
-
on configure la fréquence PWM à 50Hz
-
un Timer pour assure le rappel de la fonction loop
# code Micropython - www.micropython.fr - CC-BY-SA
from machine import Pin, Timer,PWM # importe les classes Pin et Timer
pwm=PWM(Pin(18)) # crée un objet PWM sur la broche
pwm.freq(50) # fixe la fréquence de l'onde PWM pour servomoteurs - 50 Hz
timer=Timer() # création objet timer
compt=0
def loop(timer): # fonction de clignotement
global compt
compt=compt+1
#print(compt)
if compt%3==0:
#print("min")
# pwm.duty_u16(1638) # fixe largeur cycle HAUT PWM en 16 bits (max=65535)
# la mesure est aussi en 16 bits
# la fonction pwm.duty_ns() fixe largeur en ns... utile pour servo
pwm.duty_ns(2500*1000) # min
if compt%3==1:
#print("max")
#pwm.duty_u16(8192) # fixe largeur cycle HAUT PWM en 16 bits (max=65535)
# la fonction pwm.duty_ns() fixe largeur en ns... utile pour servo
pwm.duty_ns(1500*1000) # neutre
if compt%3==2:
#print("max")
#pwm.duty_u16(8192) # fixe largeur cycle HAUT PWM en 16 bits (max=65535)
# la fonction pwm.duty_ns() fixe largeur en ns... utile pour servo
pwm.duty_ns(500*1000) # max
# rappel fonction loop à fréquence voulue
timer.init(freq=1, callback=loop)
# à 50 hz = 20ms de période = impulsion servomoteurs : le pulse 100% est à 65536, 50% à 32767
# 20ms = 20000µs du coup, le pulse 500µs est à 1638 de duty cycle(0°) est à , le pulse de 2500 µs(180°) est à 8192
# d'une manière générale : le pulse servo pour duree_µs est 65536*duree_µs/20000
Résultat¶
Le servomoteur prend les positions successives.
Info
N'hésitez pas à modifier la valeur de la fréquence de clignotement pour voir la LED clignoter à des fréquences différentes.
Variante "plus propre"¶
Voici une variante du même code qui se base sur un list
de positions à prendre, exprimées en µs :
# code Micropython - www.micropython.fr - CC-BY-SA
from machine import Pin, Timer,PWM # importe les classes Pin et Timer
pwm=PWM(Pin(18)) # crée un objet PWM sur la broche
pwm.freq(50) # fixe la fréquence de l'onde PWM pour servomoteurs - 50 Hz
timer=Timer() # création objet timer
compt=0
pos=[500, 1500, 2500, 2000, 1000, 500]
def loop(timer): # fonction de clignotement
global compt
compt=compt+1
#print(compt)
print(compt%len(pos)) # debug
print(pos[compt%len(pos)]) # debug
# la fonction pwm.duty_ns() fixe largeur en ns... utile pour servo
pwm.duty_ns(pos[compt%len(pos)]*1000) # max
# rappel fonction loop à fréquence voulue
timer.init(freq=1, callback=loop)