Aller au contenu


Photo
- - - - -

Gestion des codeurs et PID


3 réponses à ce sujet

#1 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 974 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 05 août 2018 - 05:55

Comme indiqué sur le thread qui parle du câblage, il est intéressant de mettre les codeurs sur des pins d'interruption. 


Code pour gérer la lecture des encodeurs avec les interruptions sur les pins 2 et 3 et utilisation d'un timer 

// Les includes : 
#include <TimerOne.h> // Pour le timer


// Zone des #define

#define PINENCODEURA 2
#define PINENCODEURB 3


// Zone des volatiles pour toutes les variables qui sont manipulées pendant des interruptions
volatile int16_t count = 0;   // comptage de tick d'encoder qui sera incrémenté sur interruption " On change " sur les interruptions 0 et 1
volatile int16_t vitesse = 0; // vitesse du moteur( en ticks / 0,1s )
volatile int32_t pos = 0;     // position du moteur (en tick ) 



// à mettre dans le setup : 

  pinMode(PINENCODEURA, INPUT_PULLUP);
  pinMode(PINENCODEURB, INPUT_PULLUP);

  
  // Timer
  Timer1.initialize(100000);            // set a timer of length 100000 microseconds = 0.1 sec - or 10Hz
  Timer1.attachInterrupt( timerIsr );

  // Interruption pour les codeurs 
  attachInterrupt(0, counterA, CHANGE); // lorsqu'il y une modification sur le pin 2, on interrompt le programme pour enclencher le comptage
  attachInterrupt(1, counterB, CHANGE); // lorsqu'il y une modification sur le pin 3, on interrompt le programme pour enclencher le comptage



// Fonctions d'interruptions


void counterA()
{
  byte state = PIND;  // lit tout le port D d'un coup dont les pins 2 et 3, plus rapide que digitalRead...
  (((state >> PINENCODEURA) & 1) ^ ((state >> PINENCODEURB) & 1)) ? count++ : count--; // régler ++ et -- pour que faire avancer => +
}

void counterB()
{
  byte state = PIND;
  (((state >> PINENCODEURA) & 1 ) ^ ((state >> PINENCODEURB) & 1)) ? count-- : count++; // régler ++ et -- pour que faire avancer => +
}

// Timer qui gère l'asservissement du moteur

void timerIsr()
{
  vitesse = count;
  pos += count;
  count = 0;
  // gestion du PID du moteur à ajouter ici 

}

Ce qui est intéressant c'est que ce même genre de code sera utilisé dans le projet cocotix mais avec quelques variations pour gérer deux moteurs, et c'est le genre de code utilisé pour le projet cocotix,  sur le robot à chenille rick hunter  et sur le robot robil 2WD 

 

Si vous avez des questions sur le code proposé hésitez pas à les poser car après on passera à la mise en place du PID qui utilise ce code là =)

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#2 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 397 messages
  • Gender:Male
  • Location:Paris

Posté 05 août 2018 - 10:36

Je me souviens, quand tu m'avais expliqué le fonctionnement de ces codeurs. Tu m'avais passé ce schéma qui m'a beaucoup aidé.

http://www.robot-maker.com/forum/topic/10234-ash-self-balancing-robot/?p=68215


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#3 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 819 messages

Posté 11 juin 2019 - 01:25

Salut, je souhaitais connecter deux moteurs CC pour un arduino...
c'est possible de réserver deux autres pins de l'arduino (uno pour le moment, clone nano pour la version finale) et de les configurer aussi en "attachInterrupt()" pour le PID ?
 



#4 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 974 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 11 juin 2019 - 03:37

sur une nano il y a que deux pins pour de interruptions hardware.  Si tu veux plus il faut regarder auprès de librairies qui simulent des interruptions hardware sur tous les pins de ta arduino. "software pin interrupt "


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 




Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users