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
|
.
//
//
//***********************************************************
// 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
|
.
//
//
//***********************************************************
// 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