ACCUEIL | ARDUINO > S'INSTALLER > DEBUTER > APPROFONDIR | PROCESSING | MECATRONIQUE | MATERIEL | OUTILS | TESTS | Plus...|
ATELIERS Python + Qt | Mes Robots | RepRap | Mes lib'Arduino | Mes shields Arduino | Mes distros | RaspberryPi |
ATELIERS ARDUINO| VIDEOS | COMPRENDRE | REFERENCES | CODER | TECHNIQUE | GNU/LINUX | LIENS | Rien à voir |
Contrôler la position d'un servomoteur depuis la fenêtre Terminal du logiciel ArduinoARDUINO - EXPERT - SERIE - SERVO ![]() PrésentationCe programme bien pratique permet de saisir directement dans la fenêtre Terminal de l'IDE Arduino une valeur précise en microsecondes comprise entre 400 et 2600 pour déclencher le positionnement du servomoteur à la position correspondante. Bien pratique pour pouvoir tester notamment la largeur d'impulsion du servomoteur à 0°, à 90° et à 180°, largeur d'impulsion qui peut-être variable d'un servomoteur à l'autre... L'utilisation des servomoteurs avec une carte Arduino est assez simple, basée sur la librairie dédiée aux servomoteurs : http://arduino.cc/en/Reference/Servo Ce programme utilise les fonctionnalités suivantes :
Information TechniqueQu'est-ce qu'un servomoteur ?Un servomoteur est un moteur qui est utilisé pour maintenir un axe de rotation dans certaines positions bien précises. C'est un moteur électrique associé à une électronique de commande pilotée par une impulsion de durée variable qui va déterminer la position fixe de l'axe de sortie. Sur un servomoteur classique, l'axe peut prendre une position comprise entre 0° et 180° selon la durée de l'impulsion reçue (1000µs pour 0°, 1500µs pour 90° et 2000µs pour 180°, ces valeurs pouvant varier d'un servomoteur à l'autre. Dans le cas précis d'un Futaba S3003, on retrouve empiriquement 550µs pour la position extrême 0° et 2300µs pour la position 180°, le 90° étant aux alentours de 1400µs. Brochage d'un servomoteurTypiquement, un servomoteur présente 3 broches :
On peut utiliser un servomoteur directement en +5V et avec une entrée numérique, ce que nous ferons ici sans aucun problème. Ceci étant, une adaptation en tension et en intensité est parfois nécessaire, voire même un découplage des masses par optocoupleur pour éviter tout problème de reset intempestif de la carte numérique de commande. Voir rubrique MATERIEL > Interfaces » ou « COMPRENDRE » pour plus de détails sur ces sujets. Matériel NécessaireL'espace de développement Arduino
![]() Le matériel suivant pour réaliser le montage associé
![]()
![]() Instructions de montage
Pour plus de détails, voir : Principes d'utilisation des alimentations avec une carte Arduino et des servomoteurs Le schéma théorique du montage![]() Le schéma théorique du montage Le circuit du montage![]() Le schéma du montage à réaliser Explication du programmeStructure globale du programmeCe programme simple comprend :
Déroulement du programmeLe programme se déroule de la façon suivante :
![]() Le déroulement du programme Au niveau de la partie déclarative :Inclusion des librairies utilisées
#include <Servo.h> // librairie pour servomoteur Déclaration de constantes utiles
const int POS_MIN=550; // largeur impulsion pour position 0° servomoteur // POS_MIN=550 pour futaba S3003 const int POS_MAX=2330; // largeur impulsion pour position 180° servomoteur // POS_MAS=2330 pour futaba s3003 Déclaration des constantes de broches
const int SERVO=2; //declaration constante de broche Déclaration des variables globales
int ReceptionOctet=0; // variable de stockage des octets reçus par port série int ReceptionNombre=0; // variable de calcul du nombre reçu par port série
int impulsion=1500; // variable pour impulsion - valeur médiane initiale Déclarations des objets utiles pour les fonctionnalités utilisées
Servo mon_servo; // crée un objet servo pour contrôler le servomoteur Au niveau de la fonction d'initialisation setup( ) :Initialisation des fonctionnalités utilisées :
mon_servo.attach(broche_servo, POS_MIN, POS_MAX); // attache l'objet servo à la broche de commande du servomoteur configuration des broches utilisées :
pinMode(SERVO, OUTPUT); //met la broche en sortie Au niveau de la boucle principale, la fonction loop ( ) :
//--- lecture d'un nombre reçu par le Terminal et positionnement du servomoteur --- if (Serial.available()>0) { // si caractère dans la file d'attente //---- lecture du nombre reçu while (Serial.available()>0) { // tant que buffer pas vide pour lire d'une traite tous les caractères reçus ReceptionOctet= Serial.read(); // renvoie le 1er octet présent dans la file attente série (-1 si aucun) ReceptionOctet=ReceptionOctet-48; // transfo valeur ASCII en valeur décimale if ((ReceptionOctet>=0)&&(ReceptionOctet<=9)) ReceptionNombre = (ReceptionNombre*10)+ReceptionOctet; // si valeur reçue correspond à un chiffre on calcule nombre delay(1); // pause pour laisser le temps au Serial.available de recevoir les caractères } // fin while Serial.print ("Nombre recu= "); Serial.println(ReceptionNombre); // affiche valeur numerique entière ou à virgule au format décimal
//----- positionnement du servomoteur en fonction de la largeur d'impulsion demandée impulsion=ReceptionNombre; if (impulsion>2600)impulsion=2600; // pour éviter valeur supérieure à 2600 = position maxi possible servomoteur if (impulsion<300)impulsion=300; // pour éviter valeur inférieure à 300 = position maxi possible servomoteur mon_servo.writeMicroseconds(impulsion); // génère l'impulsion de la durée voulue en µs pour le servomoteur Serial.print ("Impulsion servomoteur = "); Serial.print(impulsion); // affiche valeur numerique entière Serial.println (" microsecondes "); delay (1000); //entre chaque changement de position ReceptionNombre=0; // réinitialisation de la variable de calcul du nombre reçu } // end if
Se reporter aux commentaires présents dans le programme pour plus de détails. Mise en oeuvre du programmePréparation du montage et programmation de la carte Arduino :
Préparation du Terminal côté PC dans le logiciel Arduino
![]()
![]()
![]() Fonctionnement
![]()
![]() Le programme complet en langage Arduino :A copier/coller directement dans l'éditeur Arduino // --- Programme Arduino --- // par X. HINAULT - 01/2010 // --- Que fait ce programme ? --- /* Test de la position d'un servomoteur par saisie directe de la largeur d'impulsion dans le Terminal côté PC*/ // --- Fonctionnalités utilisées --- // Utilise la connexion série vers le PC // Utilise un servomoteur // --- Circuit à réaliser --- // Connexion série entre la carte Arduino et le PC (utilise les broches 0 et 1) // Connecter Broche de commande d'un Servomoteur sur la broche 2 (configurée en sortie) //**************** Entête déclarative ******* // A ce niveau sont déclarées les librairies, les constantes, les variables... // --- Inclusion des librairies utilisées --- #include <Servo.h> // librairie pour servomoteur // --- Déclaration des constantes --- // --- constantes des broches --- const int SERVO=2; //declaration constante de broche // --- Déclaration des variables globales --- int ReceptionOctet=0; // variable de stockage des octets reçus par port série int ReceptionNombre=0; // variable de calcul du nombre reçu par port série int impulsion=1500; // variable pour impulsion - valeur médiane initiale // --- Initialisation des fonctionnalités utilisées --- Servo mon_servo; // crée un objet servo pour contrôler le servomoteur //**************** FONCTION SETUP = Code d'initialisation ***** // La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme void setup() { // debut de la fonction setup() // --- ici instructions à exécuter au démarrage --- mon_servo.attach(SERVO); // attache l'objet servo à la broche de commande du servomoteur Serial.begin(115200); // initialise connexion série à 115200 bauds // IMPORTANT : régler le terminal côté PC avec la même valeur de transmission pinMode(SERVO, OUTPUT); //met la broche en sortie } // fin de la fonction setup() // ******************************************************************************** //*************** FONCTION LOOP = Boucle sans fin = coeur du programme ************* // la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension void loop(){ // debut de la fonction loop() // --- ici instructions à exécuter par le programme principal --- //--- lecture d'un nombre reçu par le Terminal et positionnement du servomoteur --- if (Serial.available()>0) { // si caractère dans la file d'attente //---- lecture du nombre reçu while (Serial.available()>0) { // tant que buffer pas vide pour lire d'une traite tous les caractères reçus ReceptionOctet= Serial.read(); // renvoie le 1er octet présent dans la file attente série (-1 si aucun) ReceptionOctet=ReceptionOctet-48; // transfo valeur ASCII en valeur décimale if ((ReceptionOctet>=0)&&(ReceptionOctet<=9)) ReceptionNombre = (ReceptionNombre*10)+ReceptionOctet; // si valeur reçue correspond à un chiffre on calcule nombre delay(1); // pause pour laisser le temps au Serial.available de recevoir les caractères } // fin while Serial.print ("Nombre recu= "); Serial.println(ReceptionNombre); // affiche valeur numerique entière ou à virgule au format décimal //----- positionnement du servomoteur en fonction de la largeur d'impulsion demandée impulsion=ReceptionNombre; if (impulsion>2600)impulsion=2600; // pour éviter valeur supérieure à 2600 = position maxi possible servomoteur if (impulsion<300)impulsion=300; // pour éviter valeur inférieure à 300 = position maxi possible servomoteur mon_servo.writeMicroseconds(impulsion); // génère l'impulsion de la durée voulue en µs pour le servomoteur Serial.print ("Impulsion servomoteur = "); Serial.print(impulsion); // affiche valeur numerique entière Serial.println (" microsecondes "); delay (1000); //entre chaque changement de position ReceptionNombre=0; // réinitialisation de la variable de calcul du nombre reçu } // end if } // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin // ******************************************************************************** // --- Fin programme --- |