Une grande partie de l’API (liste de fonctions) utilisée sur Arduino a été convertie en Python pour les cartes embarquées Raspberry Pi et pcDuino par Xavier Hinault pour ses projets décrits sur Mon-Club-Elec, un très bon site.
Il a bien étendu ces fonctions en ajoutant une dimension multimédia propre à ces cartes puissantes qui peuvent faire du traitement d’image (SimpleCV), de la synthèse vocale (SVOX Pico) et même de la reconnaissance vocale (non testée).
Pour notre robot suiveur, nous avons utilisé cette bibliothèque Pyduino et ajouté la commande d’un servomoteur.
Voici le résultat :
C’est un fonctionnement très simple que nous avons mis en œuvre : la fonction envoie plusieurs fois le signal au servomoteur, considérant que ce temps suffit pour atteindre toutes les positions souhaitées pour la tourelle pan-tilt de notre robot.
Code source
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Merci X. HINAULT - www.mon-club-elec.fr
#
# www.pobot.org
#
# Novembre 2013 - GPL v3
# Démonstration Pobot de la tourelle pan-tilt sur pcduino
#
from pyduino import * # importe les fonctions Arduino pour Python
PAN=10 # déclare la broche a utiliser
TILT=11
#--- setup ---
def setup():
pinMode(PAN,OUTPUT) # met la broche en sortie
pinMode(TILT,OUTPUT) # met la broche en sortie
Serial.println("La broche " + str(PAN)+ " est en sortie !")
Serial.println("La broche " + str(TILT)+ " est en sortie !")
# -- fin setup --
# -- loop --
def loop():
servo(TILT,500)
delay(1500)
servo(TILT,2500)
delay(1500)
# -- fin loop --
def servo(PIN,US):
digitalWrite(PIN,HIGH)
delayMicroseconds(US)
digitalWrite(PIN,LOW)
delay(20)
digitalWrite(PIN,HIGH)
delayMicroseconds(US)
digitalWrite(PIN,LOW)
delay(20)
digitalWrite(PIN,HIGH)
delayMicroseconds(US)
digitalWrite(PIN,LOW)
delay(20)
digitalWrite(PIN,HIGH)
delayMicroseconds(US)
digitalWrite(PIN,LOW)
delay(20)
#--- obligatoire pour lancement du code --
if __name__=="__main__": # pour rendre le code executable
setup() # appelle la fonction setup
while(1): loop() # appelle fonction loop sans fin
Précautions
La logique interne d’un servo normal le fait passer en désactivation (disable) et met le moteur en roue libre en l’absence de signal (pulse) reçu dans le créneau de 20 ms. Ce qui veut dire qu’il ne va plus tenir la position, et le maintien ne va résulter que de la résistance mécanique opposée par le train d’engrenage. Le pilotage d’un servo nécessite en principe une génération permanente des pulses de commande respectant la périodicité de 20ms (à quelques variantes près).
Cela peut fonctionner tant que la charge mécanique est faible, ce qui est le cas avec la tourelle pan-tilt pour webcam d’Arobose, mais selon la disposition de votre propre montage, cela aboutira à un "piqué du nez" peut être trop important.
Dans l’exemple inclus, le signal revient au bout d’un délai de 1.5s donc la perte est temporaire, mais prenez-bien soin à votre programme surtout si vous êtes novice : le bon fonctionnement en test seul pourrait changer gravement sur le programme final.