Servomoteur à rétroaction analogique

.

Mise à jour le 02/01/2021 : Etude sur le fonctionnement et la programmation d’un servomoteur à retour d’information 

Sommaire : 

 

.

separateur-redohm-001

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

.separateur-redohm-001

  • Récuperation d’un valeur numerique saisie sur le terminal

.

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

 

.separateur-redohm-001

  • Calibration de la sortie feedback et controle du bon fonctionnement

.

//
//
//***********************************************************
// 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));
   
  
}

..

Retour au sommaire.

 

.

separateur-redohm-001

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 .

Facebook  Twitter  Youtube 

Grabcad  Thingiverse  Cults 

.

Retour au sommaire