Deux servomoteurs à rotation continue serviront au déplacement, une bille appelée ball-caster servira à la stabilité de l'ensemble.
Un ou deux servomoteurs à rotation fixes, c'est à dire capables de garder une position fixe, serviront au contrôle de la caméra montée sur une tourelle.
Le contrôle du servomoteur se fait par un câble à trois fils, un pour la masse, un pour l'alimentation 5V et un pour le contrôle. Celui-ci se fait à l'aide d'un signal PWM, Modulation de Largeur d'Impulsion en français.
On génère un signal rectangulaire à fréquence fixe mais dont on modifie le rapport cyclique (duty cycle), c'est à dire le temps pendant lequel le signal reste à l'état haut.
Il n'existe qu'une sortie PWM implantée dans le GPIO du Raspberry Pi.
Pour avoir plus de sorties PWM, il est possible de générer ces signaux de manière logicielle avec le raspberry pi en contrôlant le temps pendant lequel une sortie reste à l'état haut. C'est une solution de dépannage mais elle n'est pas idéale car elle manque de précision du fait que l'on n'a pas un contrôle précis du timing, en effet un OS multitache tourne derrière et peut modifier le déroulement du programme.
Il vaut donc mieux un circuit externe qui génère ces impulsions. On peut utiliser un arduino par exemple. La solution que j'ai retenue est un contrôleur développé par Adafruit (http://www.adafruit.com/products/815) piloté par l'interface I2C (http://fr.wikipedia.org/wiki/I2C) et permettant de contrôler jusqu'à 16 sorties PWM.
Adafruit fournit une documentation complète ainsi qu'une library python rendant l'utilisation très simple.(http://learn.adafruit.com/adafruit-16-channel-servo-driver-with-raspberry-pi). (Si un jour j'ai le temps, je ferai une documentation en français).
Voici un exemple:
from Adafruit_PWM_Servo_Driver import PWM
import time
pwm = PWM(0x40, debug=True)
def avance():
pwm.setPWM(0, 0, 500)
pwm.setPWM(1, 0, 300)
def stop():
pwm.setPWM(0, 0, 410)
pwm.setPWM(1, 0, 410)
def gauche():
pwm.setPWM(0, 0, 500)
pwm.setPWM(1, 0, 500)
def droite():
pwm.setPWM(0, 0, 300)
pwm.setPWM(1, 0, 300)
def recule():
pwm.setPWM(0, 0, 300)
pwm.setPWM(1, 0, 500)
def tourelle_gauche():
pwm.setPWM(3, 0, 500)
def tourelle_droite():
pwm.setPWM(3,0,300)
def tourelle_haut():
pwm.setPWM(2,0,500)
def tourelle_bas():
pwm.setPWM(2,0,300)
pwm.setPWMFreq(60)
stop()
tourelle_gauche()
tourelle_bas()
time.sleep(1)
tourelle_droite()
tourelle_haut()
time.sleep(1)
tourelle_bas()
tourelle_gauche()
avance()
time.sleep(5)
stop()
Aucun commentaire:
Enregistrer un commentaire