Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Ordinateurs embarqués (SBC) > PCduino : une double solution > Contrôle de servomoteur sur pcDuino

Contrôle de servomoteur sur pcDuino

mardi 19 novembre 2013, par Julien H.

Grâce à la bibliothèque "Pyduino" de Xavier Hinault, nous pouvons très facilement contrôler les entrées-sorties de la carte embarquée sous Linux pcDuino.

Il ne manquait que quelques lignes pour pouvoir également contrôler les servomoteurs. C’est chose faite !

Attention, l’algorithme utilisé ne se prête pas à tous les montages à base de servomoteur, notamment en ce qui concerne le couple de maintien qui est très faible avec cette solution

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.

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.