Skip to content

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)