Aller au contenu


Photo
- - - - -

Code permettant de rapidement tester 4 codeurs avec un teensy

Encodeurs Teensy

  • Veuillez vous connecter pour répondre
6 réponses à ce sujet

#1 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 278 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é 27 novembre 2021 - 01:48

Ci joint un code vous permettant de tester 4 codeurs quadrature  avec une teensy. ( Teensy 3.2 3.5 36 4.0 ou 4.1 )

En effet si vous souhaitez mettre en oeuvre un asservissement de un ou plusieurs moteurs CC équipé d'encodeurs, il faut bien tester les bases et vérifier son matériel .

Note : un codeur quadrature est généralement équipé de 4 fils : 2 fils de data, 2 fils d'alimentation.
Vérifiez bien les tensions d'alimentation avant de brancher vos encodeurs.
Attention : si la tension indiquée est de 3.3V, brancher du 5V peut être fatal en fonction du matériel. 
Si il est indiqué 5V le 3.3V peut marcher ( généralement c'est le cas ) mais parfois dans certains cas ça ne convient pas mais vous ne risquez pas d'abîmer votre matériel en essayant dans ce cas précis
De même au niveau des broches d'alimentation 1 est pour la masse l'autre est pour la source d'alimentation généralement 3.3V ou 5V. Il ne faut pas inverser l'alimentation et la masse sous peine de définitivement endommager votre encodeur.




Le code ci dessous vous permet de vérifier que 4 codeurs , afin de s'assurer que tout marche comme il le faut en tournant à la main le codeur / l'arbre du moteur. 

Vous pourrez ainsi avoir une estimation du nombre de " count" / tour et vérifier les sens d'incrémentation et de décrémentation. 

Dans ce code on part du principe que les broches data du codeur 0 sont branchés sur 5 et 6 du codeur 1 sont sur 7 et 8, avec 9 et 10 pour le codeur 2 et 11 et 12 pour le codeur 3.
( Si le compteur incrémente au lieu de décrémenter il faut inverser les deux fils de data des codeurs.

 

#include <Encoder.h> // Librairie déjà inclue avec l'installation de teensyduino

#define NBENCODER 4

Encoder encoder0(5, 6);
Encoder encoder1(7, 8);
Encoder encoder2(9, 10);
Encoder encoder3(11, 12);
Encoder encoders[NBENCODER] = {encoder0, encoder1, encoder2, encoder3};
// note : On peut changer les pins des encodeurs mais il faut éviter le pin 13 à cause de la led intégrée

void setup() {
  Serial.begin(115200);  // Pensez à bien régler votre moniteur série à 115200 Bauds ou ajustez cette valeur
  Serial.println("Test des codeurs ");
}

int32_t positionsencoder[NBENCODER] = {0};  // Variable qui stock le résultat des codeurs

void loop() {
  int32_t newEncoders[4];

  for (uint8_t i = 0; i < NBENCODER; i++) {
    newEncoders[i] = encoders[i].read();                     // Lecture de l'objet codeur
    if (newEncoders[i] != positionsencoder[i]) {             // Si changement alors afficher le résultat
      Serial.print("Encoder ");                              // Note : si vous avez un codeur avec beaucoup de pulse par tours votre moniteur série rique d'être un peu spammé par tous les changements
      Serial.print(i);
      Serial.print(" = ");
      Serial.println(newEncoders[i]);
      positionsencoder[i] = newEncoders[i];
    }
  }

  // Envoyer un caractère sur le moniteur série pour remettre à zero les codeurs
  if (Serial.available()) {
    Serial.read();
    for (uint8_t i = 0; i < NBENCODER; i++) {
      encoders[i].write(0);
    }
    Serial.println("Reset des encodeurs");
  }
}


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 ! 

 

Les réalisations de Mike118  

 

 

 


#2 Atmos

Atmos

    Nouveau membre

  • Membres
  • 40 messages
  • Gender:Male

Posté 28 novembre 2021 - 12:32

Merci Mike,

 

Je vais tester ce code, dès que j'aurai assimiler ... le Teensy 4.1



#3 Atmos

Atmos

    Nouveau membre

  • Membres
  • 40 messages
  • Gender:Male

Posté 30 novembre 2021 - 07:21

Est-ce que le code ci-dessus affiche quelque chose ?

 

Car chez moi, il affiche "Test des codeurs", puis, et seulement si je tourne un moteur à la main, et seulement au moment ou j'alimente la Teensy affiche une valeur, puis plus rien.

 

Pour avoir une autre valeur, reboot de la Teensy et vite tourner un moteur. Super

 

Lors de chaque saisie d'un caractère "Reset des encodeurs" Donc, il n'est pas planté...

 

Là, je suis dans la mélasse. De plus, je pensais pouvoir utiliser mes codes d'arduino sur la Teensy. Aucun ne fonctionne.



#4 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 278 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é 01 décembre 2021 - 05:30

Est-ce que le code ci-dessus affiche quelque chose ?

 

Il est censé afficher quelque chose uniquement quand tu bouges ton moteur à la main, c'est juste un code de teste pour la mise en jambe, mais si déjà on a un soucis avec la mise en jambe c'est que j'ai eu raison de chercher à commencer simplement =)

 

 

 

 

Car chez moi, il affiche "Test des codeurs", puis, et seulement si je tourne un moteur à la main, et seulement au moment ou j'alimente la Teensy affiche une valeur, puis plus rien.

 

Pour avoir une autre valeur, reboot de la Teensy et vite tourner un moteur. Super

 

Lors de chaque saisie d'un caractère "Reset des encodeurs" Donc, il n'est pas planté...

 

 

 

Intéressant avec cette modif alors ? 

 

#include <Encoder.h> // Librairie déjà inclue avec l'installation de teensyduino

#define NBENCODER 4

Encoder encoder0(5, 6);
Encoder encoder1(7, 8);
Encoder encoder2(9, 10);
Encoder encoder3(11, 12);
Encoder encoders[NBENCODER] = {encoder0, encoder1, encoder2, encoder3};
// note : On peut changer les pins des encodeurs mais il faut éviter le pin 13 à cause de la led intégrée

void setup() {
  Serial.begin(115200);  // Pensez à bien régler votre moniteur série à 115200 Bauds ou ajustez cette valeur
  Serial.println("Test des codeurs ");
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);

}

int32_t positionsencoder[NBENCODER] = {0};  // Variable qui stock le résultat des codeurs

void loop() {
  int32_t newEncoders[4];

  for (uint8_t i = 0; i < NBENCODER; i++) {
    newEncoders[i] = encoders[i].read();                     // Lecture de l'objet codeur
    if (newEncoders[i] != positionsencoder[i]) {             // Si changement alors afficher le résultat
      Serial.print("Encoder ");                              // Note : si vous avez un codeur avec beaucoup de pulse par tours votre moniteur série rique d'être un peu spammé par tous les changements
      Serial.print(i);
      Serial.print(" = ");
      Serial.println(newEncoders[i]);
      positionsencoder[i] = newEncoders[i];
    }
  }

  // Envoyer un caractère sur le moniteur série pour remettre à zero les codeurs
  if (Serial.available()) {
    Serial.read();
    for (uint8_t i = 0; i < NBENCODER; i++) {
      encoders[i].write(0);
    }
    Serial.println("Reset des encodeurs");
  }
}

J'ai ajouté la déclaration de pin en input pullup au cas où c'est uniquement ce point qui gênait ...

Je reconnais ne pas avoir testé ce code moi même pour le moment ( il faudrait que je me câble le matériel ) mais la modification effectuée du code d'exemple de base que j'ai utilisé par le passé était suffisamment sommaire pour que je sois sûr de moi ... 

Le code d'exemple de base pour 1 seul codeur : 

 

/* Encoder Library - Basic Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */

#include <Encoder.h>

// Change these two numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder myEnc(5, 6);
//   avoid using pins with LEDs attached

void setup() {
  Serial.begin(9600);
  Serial.println("Basic Encoder Test:");
}

long oldPosition  = -999;

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
  }
}

Le code d'exemple de base n'a pas non plus les pull up, mais maintenant que j'y pense il me semble que le codeur que j'avais utilisé en testant cet exemple en avait ... Donc peut être que la modif avec les pull up en software pourrait résoudre le problème. Si ça ne le résout pas je sortirais du matériel pour faire le test moi même avant de fournir un prochain code.

 

Pour ce 

 

 

 

Là, je suis dans la mélasse. De plus, je pensais pouvoir utiliser mes codes d'arduino sur la Teensy. Aucun ne fonctionne.

 

Il faut voir programme par programme, mais de manière général un teensy c'est un arduino sous stéroide.  Ce qu'il faut savoir c'est que comme c'est pas le même microcontrôleurs qu'un uno, les codes utilisant spécifiquement des choses propre à un microcontrôleurs comme certains registres etc peuvent en effet ne pas fonctionner et devoir être ajusté. 

Donc code par code on devrait pouvoir trouver ce qui ne va pas et faire en sorte que ça marche car qui peut le plus peut le moins mais sans plus de détails difficile d'aider.


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 ! 

 

Les réalisations de Mike118  

 

 

 


#5 Atmos

Atmos

    Nouveau membre

  • Membres
  • 40 messages
  • Gender:Male

Posté 01 décembre 2021 - 09:23

Suite Encoder...

 

Exemple1 N'affiche rien

Exemple2 N'affiche rien

Exemple3 (Basic Exemple) ENFIN affiche des valeurs

Exemple TwoKnobs affiche des valeurs

Exemple NoInterrupt affiche des valeurs

 

Mais il n'y as pas d'interruption dans ces codes ?

 

Maintenant, que veulent dire ces valeurs, je m'y collent.



#6 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 278 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é 02 décembre 2021 - 02:47

Suite Encoder...

 

Exemple1 N'affiche rien

Exemple2 N'affiche rien

Exemple3 (Basic Exemple) ENFIN affiche des valeurs

Exemple TwoKnobs affiche des valeurs

Exemple NoInterrupt affiche des valeurs

 

Mais il n'y as pas d'interruption dans ces codes ?

 

Maintenant, que veulent dire ces valeurs, je m'y collent.

Intéressant, j'ai donc introduit un problème avec ma modification pour lire les 4 potentiomètres dans un tableau plutôt qu'en cherchant à les utiliser un par un ?
Je vais creuser cela de mon côté et revenir avec une correction... C'est plus pratique d'avoir l'objet dans un tableau pour pouvoir faire des for dessus facilement. 

Pour le reste, cette librairie encoder fait tout pour toi, elle regarde si les interruptions sont disponible ou pas sur les pins utilisés par ta teensy ( la plus part des pins du teensy peuvent faire des interrupt donc c'est plutôt pratique ;) ) ) 

Mais si tu veux faire le code toi même plutôt qu'utiliser une librairie ça peut aussi très bien se faire.

En gros l'utilisation du code de la librairie pour l'encodeur sur 5 et 6 c'est équivalent à ce genre de code ; 

 



volatile int32_t count = 0;
int32_t oldCount  = 0;

void interruptPin5() { // On a un changement sur le pin 5
  if (digitalRead(5)^digitalRead(6)) { // On test le sens.
    count++;
  } else {
    count--;
  }
}

void interruptPin6() { // On a un changement sur le pin 5
  if (digitalRead(5)^digitalRead(6) ) { // On test le sens.
    count++;
  } else  {
    count --;
  }
}

void setup() {
  Serial.begin(9600);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  attachInterrupt(5, interruptPin5, CHANGE);
  attachInterrupt(6, interruptPin6, CHANGE);
  Serial.println("Basic Encoder Test:");
}

void loop() {
  if (oldCount != count) {
    oldCount = count;
    Serial.println(count);
  }

  if (Serial.available()) {
    Serial.read();
    count = 0;
    Serial.println("Reset");
  }
}

Sauf que les fonctions et les variables sont intégrées dans la classe.


Pour ce qui est de la significations de valeur : C'est le nombre de changement d'états du capteur compté par le teensy.

Imagine une roue dentée, imagine que tu ne vois qu'un seul cran de cette roue dentée qui passe devant toi, même si tu ne sais pas le nombre de crans sur le roue, tu peux compter ces crans qui défilent, et en fonction du sens dans lesquels tu les vois défiler tu peux incrémenter ou décrémenter ton compte. 

Ces valeurs que tu vois ce sont ces crans. en connaissant le nombre de crans par roue, tu peux savoir le nombre de tour qu'a fait cette roue. 

Dans ton cas si tu as un codeur 500pts / tour, vu que tu es en quadrature tu peux compter 2000 incréments par tours de codeurs. Si ce codeur est derrière un réducteur 1:30 tu as 6000 incréments par tour de roue. 

Pour vérifier ce point, essaye de faire " précisément " un tour complet de ta roue à la main et la valeur que tu obtiens te donnera le nombre d'incréments par tours. Afin d'être plus précis dans ton test tu peux même faire 10 tours, et en divisant la valeur par 10 tu obtiendras le nombre d'incrément par tour.


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 ! 

 

Les réalisations de Mike118  

 

 

 


#7 Atmos

Atmos

    Nouveau membre

  • Membres
  • 40 messages
  • Gender:Male

Posté 02 décembre 2021 - 06:29

Oui Mike,

 

J'ai continué cette nuit est j'ai compris enfin... que l'interruption était dans la library.

 

J'ai essayé de diviser la valeur par 550 et ça me donne 100 pour un tour de moyeu.

 

Je vais quand même essayé ton code sans la library.

 

Merci et bonne soirée.







Aussi étiqueté avec au moins un de ces mots-clés : Encodeurs, Teensy

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

0 members, 0 guests, 0 anonymous users