É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).

towerpro-servo-sg90 Pilotez un servomoteur avec Raspberry Pi

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.

raspberry-pi3-servomotor_bb Pilotez un servomoteur avec Raspberry Pi

Pour rappel, voici la description des broches du Raspberry Pi 3.

rp2_pinout Pilotez un servomoteur avec Raspberry Pi

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

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie