Skip to content

Position du servo fixée par résistance variable

Ce que l'on va faire ici

Dans ce programme Micropython, nous allons fixer la position d'un servomoteur en fonction de la valeur d'une résistance variable.

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 résistance variable

  • 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

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 à une fréquence suffisamment élevée pour reléter instantanément la valeur de la résistance variable.

  • la valeur du duty cyle en µs est calculée à partir de la mesure de la résistance variable et ré-échelonnée de 0-65635 (16 bits) vers 500-2500µs (limite position du servo)

# code Micropython - www.micropython.fr - CC-BY-SA
from machine import Pin, Timer,PWM, ADC # 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

sensor=ADC(0) # capteur connecté sur ADC0

# fonction pour changement d'échelle
def rescale(valeur, in_min, in_max, out_min, out_max):
    return (valeur - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

def loop(timer): # fonction de clignotement


        # la fonction pwm.duty_ns() fixe largeur en ns... utile pour servo
        duty_us=rescale(sensor.read_u16(),0,65535,500,2500)
        pwm.duty_ns(int(duty_us*1000)) # doit être un int 

# rappel fonction loop à fréquence voulue
timer.init(freq=20, callback=loop) 

Résultat

Le servomoteur prend une position fonction de la position de la résistance variable.

Info

N'hésitez pas à modifier la valeur de la fréquence de clignotement pour voir la LED clignoter à des fréquences différentes.