Skyduino:~#
Articles
arduino, programmation, tutoriel

[Arduino] les encodeurs rotatif

Bonjour tout le monde !

Aujourd’hui un petit tutoriel arduino (tient ça faisait longtemps que j’avais pas parler d’arduino :))

Le sujet du jour : les encodeurs rotatifs !

Les encodeurs rotatif sont des petites bêtes bien pratique puisque qu’ils se comportent comme des potentiomètre sans limite de rotation.
On peut tourner encore et encore un encodeur rotatif, il n’y a pas de fin.

De ce fait on peut s’en servir comme mollette pour un menu, un contrôleur de volume, etc etc …
Et comble du bonheur il suffit de deux entrées numériques pour contrôler le tout !

Je vous passe toute la théorie derrière les encodeurs rotatif (ou encodeur à quadrature), c’est comment dire … un peu barbant.
Au cas où, si vous êtes du genre courageux : http://arduino.cc/playground/Main/RotaryEncoders

Je vais vous présenter un morceau de code qui est très simple à comprendre, mais pas des plus efficace.
Sachez quand même qu’il existe une librairie arduino de PJRC (le créateur de la carte teensy) qui marche beaucoup mieux que ma fonction.
Mais c’est moins drôle quand c’est tout fait ^^

http://www.pjrc.com/teensy/td_libs_Encoder.html
(Prenez le temps de regarder l’animation sur le principe d’un encodeur rotatif, c’est très instructif ;))

Le matériel :

Rien de bien compliqué à avoir pour cet article, il vous faut :
une carte arduino,
un encodeur rotatif,
des fils

Le câblage :

Un encodeur rotatif possède 3 broches :
GND (la masse)
ENC_A et ENC_B (les sorties logique)

Dans mon code j’utilise D2 pour ENC_A, et D3 pour ENC_B, libre à vous d’utiliser les broches de votre choix 😉

Le code :

// Définition des broches utilisées pour l'encodeur
#define ENC_A 2
#define ENC_B 3

// setup()
void setup() { 

  pinMode(ENC_A, INPUT);     // Broche ENC_A en sortie
  digitalWrite(ENC_A, HIGH); // et avec résistance de pull-up interne

  pinMode(ENC_B, INPUT);     // Broche ENC_B en sortie
  digitalWrite(ENC_B, HIGH); // et avec résistance de pull-up interne

  Serial.begin (9600);       // Initialisation du port série
} 

// loop()
void loop(){
  char val = read_encoder(); // Lecture de l'encodeur rotatif
  
  if(val) // Si l'encodeur a été tourné
    Serial.println(val, DEC); // Affichage du mouvement (+1 ou -1)
}

// Fonction permettant de lire l'encodeur rotatif
// Pas de debounce = attention au rebonds 
char read_encoder() { 
  byte na = digitalRead(ENC_A), nb = digitalRead(ENC_B); // Lit l'état des deux broches
  static byte old = LOW; // Ancienne valeur de ENC_A (valeur static = valeur persistante)
  char val = 0; // Valeur de retour (0 = pas de mouvement, 1 ou -1 = rotation de l'encodeur)

  if(old != na) { // Si l'encodeur a été tourné
    if(na) { // Test du sens de rotation
      if(!nb) val--; else val++; // Test du sens de rotation
    } 
    else {
      if(!nb) val++; else val--; // Test du sens de rotation
    }
  }
  old = na; // Garde en mémoire la nouvelle valeur de ENC_A

  return val; // Retourne val
}

Le résultat :

Contrairement à la libraire de PJRC je ne gère pas les rebonds lorsqu’un encodeur commute, du coup on se retrouve avec quelques ratés mais le principe est là 🙂
(Si on ne tourne pas à toute vitesse il n’y a aucun raté ;))

Enjoy !

Publicités

Discussion

11 réflexions sur “[Arduino] les encodeurs rotatif

  1. void loop(){
      char val = read_encoder(); // Lecture de l'encodeur rotatif
       
      if(val) // Si l'encodeur a été tourner
        Serial.println(val, DEC); // Affichage du mouvement (+1 ou -1)
    }
    

    si tu tournes trop rapidement, tu rates des tops parce que le Serial.println prend du temps, non ?

    Publié par bill | 12 avril 2012, 17 h 11 min
    • C’est plus les rebonds quand les contacts de l’encodeur tourne qui pose probléme, au contraire en ajoutant un petit delai ça pourrait aider (enfin je pense).

      Publié par skywodd | 12 avril 2012, 17 h 25 min
      • si tu mets un délai, tu rates encore plus de tops.
        pour un test, modifie ton code pour qu’il incrémente un compteur et l’envoie sur le Serial.
        tourne très vite a droite, et doucement à gauche. Je serai surpris que tu tombes sur 0.

        pourquoi ne pas mettre ENC_A sur une interruption http://arduino.cc/en/Reference/AttachInterrupt
        et regarder l’état de ENC_B à ce moment ?

        Publié par bill | 12 avril 2012, 17 h 33 min
  2. @BILL ça revient à faire la méthode donnée dans le playground arduino : http://arduino.cc/playground/Main/RotaryEncoders#Example2 mais franchement à ce moment autant utiliser la librairie tout prête.

    Pour un programme tout simple ma fonction suffit.
    Aprés pour un truc plus costaud un coup de librairie RotaryEncoder et c’est finit.

    Publié par skywodd | 12 avril 2012, 17 h 38 min
    • ok. dans ton cas, c’est bien pour augmenter ou diminuer qque chose, mais pas pour compter.
      Ni pour aller trop vite. si tu tournes vite, ca ira parfois dans le mauvais sens (un +1 au lieu d’un -1 par exemple)
      Mais ca peut suffir, c’est sur !

      Publié par bill | 12 avril 2012, 17 h 42 min
      • C’est une question d’application, pour un menu ça suffit largement, pour un truc plus pointu la librairie est bien plus adapté je suis tout à fait d’accord.

        Publié par skywodd | 12 avril 2012, 17 h 46 min
  3. La solution la plus simple pour ma part, et qui économise le traitement numérique, c’est d’utiliser deux condensateurs céramiques (0,1uf), entre A et GND puis B et GND. avec ça, tu peux tourner rapidement et faire autant de changement de direction que tu veux : plus de jitter.

    Publié par rocla | 13 avril 2012, 9 h 34 min
  4. De plus, la méthode avec les condos permet d’utiliser 12 encodeur roatifs (sur une carte Mega) sans problèmes, et ce sans utiliser aucune interrupt.

    Publié par Grag38 | 1 mai 2012, 13 h 43 min

Rétroliens/Pings

  1. Pingback: Outils, services, sites à (re)découvrir 2012 S15 | La Mare du Gof - 15 avril 2012

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.