Mise à jour le 02/01/2021 : Etude sur le fonctionnement et la programmation d’un servomoteur à retour d’information
Sommaire :
- Présentation et etude d’un servomoteur feedback
- Récuperation d’un valeur numerique saisie sur le terminal
- Calibration de la sortie feedback et controle du bon fonctionnement
- Pour tout probléme
- Retour au menu servomoteur avec Feedback
Présentation et etude d’un servomoteur feedback |
.
Le problème que l’on rencontre lors du pilotage d’un servomoteur RC standard à partir d’un microcontrôleur c’est que ce dernier se trouve en boucle ouverte par rapport au microcontrôleur et en boucle fermée par rapport à l’intérieur du boîtier du servomoteur. Vous pouvez envoyer les informations au servomoteur pour que l’arbre soit positionné à une position donnée, mais vous n’avez aucun moyen de confirmer si l’opération s’est exécutée avec succès.
Sans feed-back, la plupart des programmes doivent contenir des temporisations hypothétiques sur la durée d’un mouvement particulier. En général l’ajout de temporisations fixes fonctionne bien pour des applications relativement simples, mais peut entraîner des fonctionnements lents voir saccadé lorsqu’on essaie de synchroniser plusieurs mouvements d’asservissements.On peut aussi avoir des dysfonctionnements lorsque la tension d’alimentation du montage varie soit, l’ensemble est monté sur batterie, ou bien nous avons une forte consommation de courant qui peut naturellement créer une chute de tension électrique et dans ce cas l’énergie électrique va s’affaiblir .Nos servomoteurs ne pourront plus fonctionner correctement, il y aura bien évidemment une répercussion sur le couple et sur la vitesse. On devine aisément que les temporisations fixes sont inappropriées dans ce genre de situation.
.
Retour au sommaire
|
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
// // //*********************************************************** // RedOhm // le 26/12/2020 // // Recuperation d'un valeur numerique saisie sur le terminal // et limite de la fourchette de saisie entre 10 et 170 // valeur de deplacement du servomoteur // // Ce programme est un logiciel libre: vous pouvez le redistribuer // et / ou le modifier // Ce programme est distribué dans l'espoir qu'il vous sera utile, // mais sans aucune garantie de fonctionnement // // IDE Arduino 1.8.12 //*********************************************************** // --- Déclaration des variables globales --- // variable pour nombre reçu sur port Série long valeur_recu = 0; // -------------------------------------------------------------------- // Un programme Arduino doit impérativement contenir la fonction "setup" // Elle ne sera exécutée une seule fois au démarrage du microcontroleur // Elle sert à configurer globalement les entrées sorties // -------------------------------------------------------------------- void setup() { // initialise connexion série à 19200 bauds // régler le terminal côté PC avec la même valeur de transmission Serial.begin(19200); // on attent que le port de communication soit pret while(!Serial); Serial.println ("Communication = Ok "); Serial.println (""); Serial.println ("Veuillez saisir un nombre de 10 à 170° "); } // ---------------------------------------------------------------------- // Le programme principal s’exécute par une boucle infinie appelée Loop () // ---------------------------------------------------------------------- void loop() { // appel de la fonction recevoirNombre valeur_recu=recevoirNombre(); if (valeur_recu!=0) { // si un nombre a été reçu { // controle de la valeur taper de 10 a 170 // si la valeur est inferieure a 10 ou superieur a 170 // alors on envoie un message d'erreur de saisie // sinon on affiche la bonne valeur if ((valeur_recu<10) || (valeur_recu >170)) { Serial.println("erreur de saisie "); Serial.println ("Veuillez saisir un nombre de 10 à 170° "); } else { //--- affiche le nombre reçu sur le port série Serial.print("Valeur du deplacement = "); Serial.println (valeur_recu); Serial.println (""); Serial.println ("Veuillez saisir un nombre de 10 à 170° "); } } // remise a zero de la variable valeur_recu valeur_recu =0; } } //============================================== //Fonction pour la reception d'un nombre //============================================== long recevoirNombre() { // declaration des variables en local // variable pour un octet recu int octet_recu=0; // variable comptage caractères reçus int compteur=0; boolean signe=true; // variable locale signe nombre recu long nombreRecu=0; // variable locale nombre recu while (Serial.available()>0) { // tant qu'un octet en réception // lecture du premiere octet et le met dans la variable octet_recu=Serial.read(); // si Octet reçu est le - et si c'est le 1er caractère reçu - signe négatif if ((octet_recu=='-') && (compteur==0))signe=false; // incrémente le compteur compteur++; // transfo valeur ASCII en valeur décimale octet_recu=octet_recu-48; // calcul du nombre à partir des valeurs reçues if ((octet_recu>=0)&&(octet_recu<=9)) nombreRecu = (nombreRecu*10)+octet_recu; // pause pour laisser le temps de recevoir l'octet suivant // delay(10); } // fin tant que octet réception // prise en compte signe négatif if (signe==false) nombreRecu=nombreRecu*(-1); // renvoie le nombre calculé return(nombreRecu); } |
.
Retour au sommaire
|
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
// // //*********************************************************** // RedOhm // le 02/01/2021 // Mazelin Herve // // Calibration de la sortie feedback // envoie d'une valeur au servomoteur avec controle du retour // Inspiré du code de chez Adafruit // https://learn.adafruit.com/analog-feedback-servos/using-feedback // // // Ce programme est distribué dans l'espoir qu'il vous sera utile, // mais sans aucune garantie de fonctionnement // // IDE Arduino 1.8.12 //*********************************************************** //Permet aux cartes Arduino et Genuino de contrôler une variété de servomoteurs. //Cette bibliothèque peut contrôler 12 servos en utilisant une seule minuterie. #include <Servo.h> // Créé un objet de type "Servo", nommé -> servomoteur_feedback Servo servomoteur_feedback; // Affectation de l'entrée analogique pour le retour de positionnement du servo int feedback9 = A6; // Rappel sur les variables // Les variables déclarées en tête de programme sont des variables globales // et peuvent être utilisées partout dans le programme. // Variable pour l'étalonnage int minDegres ; int maxDegres ; int min_feedback9 ; int max_feedback9 ; // variable pour l'erreur de mesure int tolerance = 1 ; // Variable pour récupérer les données sur le port série int reception_des_donnees; /* * Un programme Arduino doit impérativement contenir cette fonction * Elle ne sera exécutée qu'une seule fois au démarrage du microcontroleur * Elle sert à configurer globalement les entrées sorties */ void setup() { //ouvre le port série et fixe le débit de communication à 57600 bauds Serial.begin(57600); // on attend que le port de communication soit prêt while(!Serial); // temps pour l'opérateur delay(2000); Serial.println(""); Serial.println("================================="); Serial.println("= communication operationnelle ="); Serial.println("================================="); Serial.println(""); // associe le servomoteur à la broche 3 servomoteur_feedback.attach(9); // Lance la calibration calibration (servomoteur_feedback,10,170); // Affichage de la valeur min du servo Serial.print("Valeur de la position mini du servo = "); Serial.print(minDegres); Serial.print(" Valeur mini du retour feedback => "); Serial.println (min_feedback9); // Affichage de la valeur max du servo Serial.print("Valeur de la position maxi du servo = "); Serial.print(maxDegres); Serial.print(" Valeur maxi du retour feedback => "); Serial.println (max_feedback9); //Avertissement de fin de calibration Serial.println (""); Serial.println ("Calibration terminee"); delay(4000); // envoie la position voulue au servomoteur mise_a_la_position (servomoteur_feedback,170); } // ---------------------------------------------------------------------- // Le programme principal s’exécute par une boucle infinie appelée Loop () // ---------------------------------------------------------------------- void loop() { } // ========================== Divers fonctions =============================== // Les fonctions peuvent être placées avant ou après la boucle loop. // Cela n'a pas d'importance puisqu'elles ne seront exécutées que quand elles seront // appelées (dans le setup ou dans le Loop). // Fonction pour la calibration // Rappel : Si on a besoin de variables seulement dans la fonction se sont des // variables locales void calibration (Servo servo ,int position_mini,int position_maxi) { // déplace le servomoteur vers la position minimale servomoteur_feedback.write(position_mini); // enregistre la valeur de retour minDegres = position_mini ; // temps pour arriver à la position demandée delay (3000); // lecture de notre position mini min_feedback9 = analogRead ( feedback9); // déplace le servomoteur vers la position maximale servomoteur_feedback.write(position_maxi); // enregistre la valeur de retour maxDegres = position_maxi ; // temps pour arriver à la position demandée delay (3000); // lecture de notre position maxi max_feedback9 = analogRead ( feedback9); } // Fonction pour positionner le servomoteur // Rappel : Si on a besoin de variables seulement dans la fonction se sont // des variables locales // Les éléments entre parenthèses comme (Servo servo,int feedback9,int pos) // sont les paramètres à transmettre dans la fonction. void mise_a_la_position (Servo servo,int pos) { Serial.println(""); Serial.print ("Valeur de la position demandee a mon servomoteur => "); Serial.print ( pos ); // Calculer la valeur de rétroaction cible pour la position finale int cible = map(pos, minDegres, maxDegres, min_feedback9, max_feedback9); Serial.print(" Valeur de la cible -> "); Serial.println(cible); // ceci a pour effet de fixer l'angle de l'axe (en degrés)sur le servomoteur. // et donc positionne le servomoteur avec la valeur contenue dans la variable pos servo.write(pos); // Verification que le servomoteur atteigne sa cible while(abs(analogRead(feedback9) - cible) > tolerance) {} Serial.print ("Valeur de mon feedback9 -> "); Serial.println (analogRead(feedback9)); } |
..
Pour tout probléme |
.
Pour tout problème de téléchargement ou pour nous suivre sur les réseaux sociaux voici les plateformes sur lesquelles nous éditons.
Cliquez sur celle qui vous intéresse .
.
Retour au sommaire