Aller au contenu


Photo
- - - - -

Gestion des codeurs et PID


3 réponses à ce sujet

#1 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 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 !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#2 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 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



#3 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 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
  • 9 934 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 !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 




Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users