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