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.
- 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 !