[TUTORIEL] Encodeur Rotatif

Le forum de support des breakout de Snootlab

[TUTORIEL] Encodeur Rotatif

Message non lude Laetitia » Ven 30 Nov 2012 11:23

[MAJ le 26.02.2015 - Utilisation de la nouvelle librairie SwitchEncoder]

Bonjour,

Voici un exemple d'utilisation d'un encodeur rotatif : la mise au point de la position d'un servomoteur.

Wikipédia a écrit:Le codeur rotatif incrémental [est un capteur qui] ajoute ou soustrait (selon le sens de rotation) une unité à un compteur à chaque rotation supérieure à la résolution du capteur. Le compteur est généralement remis à zéro lorsque l'appareil est allumé.


Traduction : à chaque fois que l'on passe un cran vers la droite, on ajoute 1, et quand on passe un cran vers la gauche, on retranche 1. Simple, non ? :)

- MATÉRIEL -

- Arduino Uno (x1)
- Breakout encodeur rotatif (x1)
- Servomoteur (x1) [standard, celui du Starter Kit, par exemple]

Librairie à télécharger et à installer : SwitchEncoder.

- SCHÉMA DU MONTAGE -

Ici notre encodeur a trois pins : CHA, CHB, et SWI, correspondant respectivement aux bornes A et B qui permettent de déterminer la position de l'encodeur, et au poussoir de sélection. Les trois autres pins du breakout sont les deux GND et VCC.

schema_encodeur.png
schema_encodeur.png (100.84 Kio) Vu 1982 fois

- CODE -

Le but de notre code est donc d'interpréter la rotation de l'encodeur dans un sens ou dans l'autre comme une commande de rotation du servomoteur, le poussoir faisant office de bouton de confirmation.
N'hésitez pas à aller consulter la documentation de la librairie pour mieux comprendre ce qu'il se passe dans le code ;)

Code: Tout sélectionner
/*
 * Mise en oeuvre du breakout Encodeur Rotatif Snootlab
 * Rotation d'un servomoteur en fonction du mouvement de l'encodeur
 * Encodeur sur pins D2 à D4, servomoteur sur D5
 */
 
#include <SwitchEncoder.h>
#include <Servo.h>

// Déclaration de l'objet encodeur et de ses branchements (CHA, CHB, SWI)
SwitchEncoder s = SwitchEncoder(2, 3, 4);

// Déclaration de l'objet Servo
Servo myServo;

// Variables utiles
int command = 0;
int angle = 0;
int switchState = HIGH;
int lastSwitchState = HIGH;

void setup()
{
  // Paramétrage des interruptions
  // Voir SwitchEncoder/HowToSetup.h pour le détail des registres
  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();
 
  // Initialisation liaison série et servo
  Serial.begin(9600);
  myServo.attach(5);

  // Position initiale
  myServo.write(0);
}

void loop()
{
  // Lecture de l'état du bouton
  switchState = s.button();
  // On regarde si ça a changé
  if (switchState != lastSwitchState)
  {
    // S'il est passé de HIGH à LOW c'est qu'on a appuyé sur le bouton
    if (switchState == LOW)
    {
      // Récupération des données de l'encodeur
      command = s.count();
      // Remise à zéro du compteur
      s.resetCount();
      // Définition de la nouvelle position du servo et vérification de sa validité
      angle = angle + command;
      if (angle < 0)
      {
        angle = 0;
      }
      else if (angle > 179)
      {
        angle = 179;
      }
      // Envoi des données au moniteur série
      Serial.println(angle);
      // Positionnement du servo
      myServo.write(angle);
    }
  }
  // Sauvegarde de l'état courant pour le prochain tour de loop
  lastSwitchState = switchState;
}

// Interruption gérant la lecture de l'encodeur
ISR(PCINT2_vect)
{
  s.process();
}


C'est tout pour cette fois ! J'espère que ce tutoriel vous aura plu, et bonne bidouille en attendant le prochain !
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Re: [TUTORIEL] Encodeur Rotatif

Message non lude flomoto » Sam 23 Jan 2016 22:15

Merci pour ce tuto bien utile, cependant il y a une erreur : la déclaration CHA, CHB, SWI est inversée par rapport au schéma de câblage. Pour que le montage fonctionne, il faut câbler CHA en 2, CHB en 3, SWI en 4.
flomoto
 
Messages: 1
Inscription: Sam 23 Jan 2016 22:13

Re: [TUTORIEL] Encodeur Rotatif

Message non lude Laetitia » Lun 25 Jan 2016 10:49

Exact ! Merci pour la remarque, je corrige le schéma immédiatement :)
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse


Retourner vers Breakout de Snootlab

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités