{{tag>électronique shield arduino}}
====== 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:
* Activer les interruptions sur le port auquel sont associées les broches.
* Activer ensuite les interruptions sur les broches.
* Définir enfin la fonction appelée lorsque les interruptions seront levées.
===== 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
//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 [[software:applications:minicom|minicom]] et son analyse via [[sysadmin:linux:cli:od|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 =====
* https://snootlab.com/shields-snootlab/338-encodeur-rotatif-24-positions-blanc-breakout-board.html
* http://forum.snootlab.com/viewtopic.php?f=53&t=1324
* https://github.com/Snootlab/SwitchEncoder