L’un des objectifs principaux de la robotique est d’articuler des objets. Pour se faire, il est très courant d’utiliser des moteurs électriques et plus particulièrement des servomoteurs. Nous allons voir dans cet article, comment programmer la carte Raspberry Pi pour pouvoir piloter un servomoteur.
Prérequis: Programmez avec Raspberry Pi
Matériel
- Écran
- HDMI câble
- Clavier
- Raspberry PI 3 (avec OS sur micro SD)
- Souris
- Chargeur micro USB B
- servomoteur
Servomoteur
Les servomoteurs sont de petits concentrés de technologie qui mêlent mécanique et électronique, largement utilisés en modélisme, en robotique et d’en d’autres applications. Ils tiennent leur nom du fait qu’ils peuvent asservir eux même leur position (ou leur vitesse).
Les servomoteurs se composent d’un moteur à courant continu, d’une boite de réduction et d’une carte électronique embarquée permettant le contrôle de la position à l’aide d’un signal de modulation de largeur d’impulsion (en anglais : PWM – Pulse Width Modulation).
Schéma de connexion
Le servomoteur s’alimente avec une tension au borne du fil noir/marron la masse (GND) et au fil rouge la tension batterie (+5V). Un signal PWM envoyé sur le fil jaune/blanc (borne 12) permet de piloter le servomoteur en vitesse ou en position. Selon le nombre et la puissance du servomoteur utilisé, il peut être alimenté par la borne 5V de la carte Raspberry Pi mais il est fortement conseillé d’utiliser une source de puissance extérieur afin de protéger la carte.
Pour rappel, voici la description des broches du Raspberry Pi 3.
Code de base pour le contrôle de servomoteur
Pour piloter le servomoteur en position, il faut donc envoyer un signal à modulation de largeur d’impulsion. Pour cela, nous devons configurer une borne GPIO du Raspberry PI en sortie PWM.
#!/usr/bin/env python # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time def AngleToDuty(ang): return float(pos)/10.+5. #Setup servoPin as PWM output of frequancy 100Hz servoPin=12 GPIO.setmode(GPIO.BOARD) GPIO.setup(servoPin,GPIO.OUT) pwm=GPIO.PWM(servoPin,100) #setup sweep parameters depart =0 arrivee=180 DELAY=0.1 incStep=5 pos=depart if __name__ == '__main__' : pwm.start(AngleToDuty(pos)) #star pwm nbRun=3 i=0 while i<nbRun: print("--------------------------run {}".format(i)) for pos in range(depart,arrivee,incStep): duty=AngleToDuty(pos) pwm.ChangeDutyCycle(duty) time.sleep(DELAY) print("position: {}° -> duty cycle : {}%".format(pos,duty)) for pos in range(arrivee,depart,-incStep): duty=AngleToDuty(pos) pwm.ChangeDutyCycle(duty) time.sleep(DELAY) print("position: {}° -> duty cycle : {}%".format(pos,duty)) i=i+1 pwm.stop() #stop sending value to output GPIO.cleanup() #release channel
N.B.: Faites attention aux indentations lorsque vous écrivez ou recopiez un code. Vous risqueriez d’avoir des erreurs de compilation.
Sources
- La THE référence https://www.raspberrypi.org/help/
- Programmez avec Raspberry Pi
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
Nice artiсle, exactly wһat I wanted to find.
Svp comment je peux commander deux servo motor sg90 Avec un raspberry ?
Je travaille sur la traitement d’images détection des objets en mouvement
Quand l’objet est en mouvement mon programme donne les coordonnées x,y. Et moi je veux programme ces deux servomotor pour fair rotatione la caméra vers l’objet
Svp pouvez vous me donner le shema de montage et le script
C’est un projet de fin d’études et je nai pas beaucoup de temps à fair
Bonjour,
Pour piloter deux servomoteurs, il faut que tu choisisses deux broches GPIO. Par exemple, servoPin1=12 et servoPin2=11.
Tu les déclares ensuite comme sorties PWM de la Raspberry.
GPIO.setup(servoPin1,GPIO.OUT)
GPIO.setup(servoPin2,GPIO.OUT)
pwm1=GPIO.PWM(servoPin1,100)
pwm2=GPIO.PWM(servoPin2,100)
Tu alimentes les deux servomoteurs avec une alimentation externe ayant une tension acceptable par le servomoteur et un courant suffisant pour piloter deux servomoteurs en même temps.
Tu peux ensuite positionner les deux servomoteurs comme tu le souhaites avec la fonction pwm1.ChangeDutyCycle(duty)
Bonne continuation
Bonjour, je dois déplacer un robot qui dessine, j’utilise un servomoteur pour lever/abaisser le stylo, aurait tu un code à me proposer pour stopper le servomoteur ?
Bonjour, pour figer la position, il suffit d’envoyer la commande une seule fois (pwm.ChangeDutyCycle(duty))
Pour arrêter d’envoyer une impulsion au servo, il suffit d’envoyer la commande stop (pwm.stop())