Servo moteur SG90

published: 19 April 2020 / updated 19 April 2020

Lire cette page en français

 

Pour contrôler l'angle d'un servo, il faut moduler le signal qui lui est transmit. Les servos présentent 3 fils : +5V (fil du milieu, rouge), ground (fil marron ou noir) modulation (jaune ou blanc) La modulation se fait par la méthode PWM qui signifie Pulse Width Modulation. Généralement les servos attendent un signal à 50Hz, c'est à dire 50 pulses/sec soit des pulses de 20ms. L'angle du servo est contrôlé en fonction du % du cycle pendant lequel le signal est ON (5V), le reste du cycle le signal est OFF (0V). Par exemple si le signal est ON pendant 0.5 ms le servo se mettra à l'angle 0. Si le signal est ON pendant 2.5ms l'angle sera de 180°. Sur le Raspberry PI, en Python, la durée du cycle est calculée en % du cycle (duty cycle). Si l'on veut que le signal ait une durée de 0.5 ms (0°) cela correspond donc à 0.5/20 * 100 = 2.5%. Pour 180° (2.5 ms) cela donne 2.5/20 * 100 = 12.5% En pratique : Connecter +5 et GND du servo au GPIO par exemple en position 4 et 6. Connecter le fil de modulation en position 11 (GPIO P17) Voici ce que ça donne en Python : #importer RPi.GPIO import RPi.GPIO as GPIO #numerotation des pins d'apres leur position physique GPIO.setmode(GPIO.BOARD) #declarer pin11 comme pin du signal GPIO.setup(11,GPIO.OUT) #declarer un objet pwm en indiquant le pin et la frequence pwm=GPIO.PWM(11,50) #initialiser l'objet PWM avec un duty cycle de 2.5% (angle 0°) pwm.start(2.5) #changer l'angle (0 à 90°) en modifiant le duty cycle à 12.5% pwm.ChangeDutyCycle(12.5) #etc.... #A la fin fermer l'objet pwm et reset du GPIO pwm.stop() GPIO.cleanup() Dans mon cas (servo Tower Pro SG90) les % de duty cycle ne correspondaient pas exactement. A 12.5 le servo est en butée alors qu'a 2.5% il y a encore de la marge. 2.0% et 11.75% semble mieux correspondre. Mais j'ai remarqué que les angles n'étaient pas très stables... ----------------------------------------------- Maintenant que nous avons branché notre servomoteur, nous allons pouvoir le piloter directement depuis la ligne de commande de la Raspberry Pi. Pour cela, nous allons commencer par activer le mode PWM sur le port 12, soit le GPIO 18 selon la numérotation processeur. gpio -o mode 18 pwm Et nous allons activer le mode Mark/Space de PWM, qui permet d’avoir un signal plus adapté à notre usage. gpio pwm-ms Enfin, nous allons configurer la durée d’un cycle, des fréquences à employer, etc. Le servomoteur est réglé pour fonctionner à une fréquence de 50 Hz soit 20 ms. Le signal de la Raspberry Pi fonctionne à une autre fréquence, 19.2 MHz. En utilisant ces deux chiffres, on peut calculer une période et un range (merci à framboise314.fr pour la formule) : 50 = 19.2 * 10^6 / 192 / 2000 Extrait de la documentation du SG90.La documentation du moteur montre un schéma de la période et du Duty Cycle d’un SG90. Nous allons donc régler la Raspberry Pi pour utiliser ces valeurs : gpio pwmc 192 gpio pwmr 2000 Enfin, nous allons pouvoir faire bouger notre moteur ! Sachez que l’on ne passe pas un angle au servomoteur, mais un chiffre qui sera converti en angle. Notre servomoteur va de 0° à 180°. Après quelques tests, il semblerait que 0° correspondant à 230, 90° à 150 et 180° à 70. Pour envoyer notre moteur à 90° nous allons donc utiliser la commande : gpio -g pwm 18 150 Et nous remplacerons 150 par 230 pour aller à 0°, 70 pour aller à 180° ou n’importe quelle valeur entre les deux selon nos besoins. À noter, ces petits moteurs supportent un angle de 180° de façon précise, mais ils ont un peu de marge qui peuvent les amener à faire du 190° ou 200° et même à faire un tour complet si vous mettez une valeur suffisamment basse. C’est spécifique à chaque modèle de moteur.