Table des matières

, ,

Encodeur rotatif Snootlab

Installer la bibliothèque disponible sur le github. L'installation d'une nouvelle bibliothèque dans l'IDE Arduino est détaillée ici

Le fonctionnement correct du shield repose sur l'activation et la gestion des interruptions. Le fichier HowToSetup.h détaille dans les commentaires la configuration des interruptions.

Selon les broches utilisées il faudra:

Exemples

Dans ce premier exemple on écrit l'état de l'encodeur rotatif sur le port série.

/*****************************************************
* ERST01: Encodeur Rotatif Snootlab Test 01          *
* Affiche sur le port série:                         *
* Le sens de rotation R (Right) ou L (Left)          *
* valeur du compteur                                 *
* le nombre d'appels du gestionnaire d'interruption  *
*****************************************************/
 
#include <SwitchEncoder.h>
 
//stocke le sens de rotation
volatile char dir = 'R';
volatile int last_counter = 0;
volatile int current_counter= 0;
volatile int isr_count = 0;
 
//constructeur SwitchEncoder(CHA, CHB, SWI)
SwitchEncoder s = SwitchEncoder(8, 12, 2);
 
void setup()
{
  // Autorisation des interruptions sur le port B car les broches D12 D13 sont liées au port B 
  PCICR |= (1 << PCIE0);
 
  // Activation des interruptions sur les broches D12 et D13
  PCMSK0 |= (1 << PCINT0) | (1 << PCINT4);
 
  // Activation générale des interruptions
  sei();
 
  //Initialisation du port Série
  Serial.begin(115200);
  Serial.println("boot");
 
  s.resetCount();
}
 
void loop()
{
  if(current_counter != last_counter)
  {
    Serial.println(dir);
    Serial.println(s.count());
    Serial.println(isr_count);
    last_counter = current_counter;
  }
 
 
}
 
/* Définition du gestionnaire d'interruption
* PCINT0_vect pour le port B
* PCINT2_vect pour le port D
*
*  Relevé des données en provenance de l'encodeur via s.process()
*  dès que l'on détecte un changement sur l'une des broches concernées
*/
ISR(PCINT0_vect)
{
 
  dir = s.process();
  current_counter = s.count();
  isr_count++;
}

Le téléversement de ce code et quelques manipulations de l'encodeur rotatif retournent un affichage de ce type sur le Moniteur de port Série:

boot
R
1
36
L
0
11
R
1
18
L
0
9

1
33
L
0
16

1
39

2
74
Les interruptions sont particulièrement sensibles au phénomène de rebond, on constate ici que lors de la première manipulation, l'encodeur est tourné d'un cran vers la droite et 36 appels du gestionnaire d'interruption ont été fait.
Attention au choix des broches, la broche D13 par exemple est branchée à une led intégrée à la carte.

Autre curiosité, la valeur du sens de rotation n'est pas systématiquement écrite sur le port série. L'enregistrement de la sortie via l'outil minicom et son analyse via od montre que des caractères NUL sont régulièrement écrits en lieu et place de 'R' ou 'L'.

$ cat minicom.cap | od -Ad -tc -w4
0000000   b   o   o   t
0000004  \n   R  \n   1
0000008  \n   3   6  \n
0000012   L  \n   0  \n
0000016   1   1  \n   R
0000020  \n   1  \n   1
0000024   8  \n   L  \n
0000028   0  \n   9  \n
0000032  \n   1  \n   3
0000036   3  \n   L  \n
0000040   0  \n   1   6
0000044  \n  \n   1  \n
0000048   3   9  \n  \n
0000052   2  \n   7   4
0000056  \n
0000057

Références