Outils pour utilisateurs

Outils du site


dev:arduino:shields:encodeur-rotatif

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
dev:arduino:shields:encodeur-rotatif [2017/12/16 14:10] – créée yoanndev:arduino:shields:encodeur-rotatif [2021/02/01 21:51] (Version actuelle) – modification externe 127.0.0.1
Ligne 15: Ligne 15:
 ===== Exemples ===== ===== Exemples =====
  
-non fonctionnel, les interruptions sont particulièrement sensibles au phénomène de rebond.+Dans ce premier exemple on écrit l'état de l'encodeur rotatif sur le port série.
  
 <code c> <code c>
 +/*****************************************************
 +* 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> #include <SwitchEncoder.h>
 + 
 //stocke le sens de rotation //stocke le sens de rotation
 volatile char dir = 'R'; volatile char dir = 'R';
-volatile bool input_changed false+volatile int last_counter 0; 
 +volatile int current_counter= 0; 
 +volatile int isr_count = 0
 + 
 //constructeur SwitchEncoder(CHA, CHB, SWI) //constructeur SwitchEncoder(CHA, CHB, SWI)
 SwitchEncoder s = SwitchEncoder(8, 12, 2); SwitchEncoder s = SwitchEncoder(8, 12, 2);
 + 
 void setup() void setup()
 { {
   // Autorisation des interruptions sur le port B car les broches D12 D13 sont liées au port B    // Autorisation des interruptions sur le port B car les broches D12 D13 sont liées au port B 
   PCICR |= (1 << PCIE0);   PCICR |= (1 << PCIE0);
-  + 
   // Activation des interruptions sur les broches D12 et D13   // Activation des interruptions sur les broches D12 et D13
   PCMSK0 |= (1 << PCINT0) | (1 << PCINT4);   PCMSK0 |= (1 << PCINT0) | (1 << PCINT4);
-  + 
   // Activation générale des interruptions   // Activation générale des interruptions
   sei();   sei();
-  + 
   //Initialisation du port Série   //Initialisation du port Série
-  Serial.begin(9600);+  Serial.begin(115200);
   Serial.println("boot");   Serial.println("boot");
 +  
 +  s.resetCount();
 } }
 + 
 void loop() void loop()
 { {
-  if(input_changed)+  if(current_counter != last_counter)
   {   {
     Serial.println(dir);     Serial.println(dir);
     Serial.println(s.count());     Serial.println(s.count());
-    input_changed !input_changed;+    Serial.println(isr_count); 
 +    last_counter current_counter;
   }   }
-   +  
-  + 
 } }
 + 
 /* Définition du gestionnaire d'interruption /* Définition du gestionnaire d'interruption
 * PCINT0_vect pour le port B * PCINT0_vect pour le port B
Ligne 64: Ligne 77:
 ISR(PCINT0_vect) ISR(PCINT0_vect)
 { {
 +  
   dir = s.process();   dir = s.process();
-  input_changed !input_changed;+  current_counter s.count(); 
 +  isr_count++;
 } }
- 
 </code> </code>
 +
 +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:
 +
 +<file>
 +boot
 +R
 +1
 +36
 +L
 +0
 +11
 +R
 +1
 +18
 +L
 +0
 +9
 +
 +1
 +33
 +L
 +0
 +16
 +
 +1
 +39
 +
 +2
 +74
 +
 +</file>
 +
 +<note warning>
 +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.
 +</note>
  
 <note> <note>
-Attention à la broche D13 branchée à une led intégrée à la carte.+Attention au choix des broches, la broche D13 par exemple est branchée à une led intégrée à la carte.
 </note> </note>
 +
 +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'.
 +
 +
 +<file>
 +$ cat minicom.cap | od -Ad -tc -w4
 +0000000         t
 +0000004  \n    \n   1
 +0000008  \n      \n
 +0000012    \n    \n
 +0000016      \n   R
 +0000020  \n    \n   1
 +0000024    \n    \n
 +0000028    \n    \n
 +0000032  \n    \n   3
 +0000036    \n    \n
 +0000040    \n     6
 +0000044  \n  \n    \n
 +0000048      \n  \n
 +0000052    \n     4
 +0000056  \n
 +0000057
 +</file>
  
 ===== Références ===== ===== Références =====
dev/arduino/shields/encodeur-rotatif.1513433447.txt.gz · Dernière modification : 2021/02/01 21:51 (modification externe)