Étiquettes : , , ,

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 sont composés 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 est alimenté par une tension au borne du fil noir/marron la masse (GND) et au fil rouge la tension batterie (+5V) ; et est piloté par un le signal PWM envoyé sur le fil jaune/blanc (borne 12). 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: latin-1-*-
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
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