Contrôler un servo en Python avec un RaspberryPI
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%
- 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)
#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...