Cela est complexe tant au niveau câblage, boutons, résistances, fils, qu'en programmation et essouches mémoire.
l'encodeur rotatif, permet de se libérer du nombre restreint d'entré d'une carte Arduino UNO. Pour le câblage, il y a besoin de 5 fils, 2 pour l'alimentation (+5v et GND), deux pour la rotation et un pour le bouton.
.
. L'encodeur rotatif
Pour le câblage, il faut utiliser deux entrées Analogique. Le tableau ci-dessous vous donne les correspondances.
*Encoder * Arduino Uno * Arduino Nano * Arduino Mega
****GND*********GND*********GND************* GND
***** + ********** 5V ********* 5V *************** 5V
*****SW********** 2 ************ 2 **************** 2
*****DT **********A2 ********** A2 ************** A2
****CLC ********* A3 ********** A3 ************** A3
Le schéma de branchement est quand a lui très simple.
Coté programmation, il y a du choix sur le net, mais j'ai eu une préférence pour ce petit sketch très facile a comprendre. Il permet de faire varier la position d'un servo.
Code : Tout sélectionner
#include "RotaryEncoder.h"
RotaryEncoder encoder(A2, A3); // (DT, CLK)
#include "Servo.h"
Servo servo; // création de l'objet "servo"
#define STEPS 36 // Incrémentation a chaque cran
#define POSMIN 0 // Nombre pour la position minimal
#define POSMAX 180 // Nombre pour la position maximal
int lastPos, newPos;
void setup() {
servo.attach(12); // attache le servo au pin spécifié
Serial.begin(9600); // ouvre le port série
encoder.setPosition(10 / STEPS);
}
void loop() {
encoder.tick();
newPos = encoder.getPosition() * STEPS;
if (newPos < POSMIN) {
encoder.setPosition(POSMIN / STEPS);
newPos = POSMIN;
}
else if (newPos > POSMAX) {
encoder.setPosition(POSMAX / STEPS);
newPos = POSMAX;
}
if (lastPos != newPos) {
Serial.println(newPos);
lastPos = newPos;
}
servo.write(lastPos);
}
Dans l'init :
Code : Tout sélectionner
#define STEPSS 1 // Nombre par pas d'encodeur
#define POSMIN -5 // Position MINI de l'encodeur (ici -5)
#define POSMAX 4 // Position MAX de l'encodeur (ici 4)
#define BPE 7 // Borne SW encodeur (bouton)
#include "RotaryEncoder.h" // Appel de la bibliothéque pour encodeur
RotaryEncoder encoder(A2, A3); // Borne de l'encodeur (DT, CLK)
Code : Tout sélectionner
/*
************************************************
* Menu selection par encodeur rotatif *
************************************************
*/
encoder.tick();
newPos = encoder.getPosition() * STEPSS;
if (newPos < POSMIN) {
encoder.setPosition(POSMIN / STEPSS);
newPos = POSMIN;
}
else if (newPos > POSMAX) {
encoder.setPosition(POSMAX / STEPSS);
newPos = POSMAX;
}
if (lastPos != newPos) {
if (newPos <= 0){ // contrôle pour les positions entre -5 et 0 inclus
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("Choix => ");lcd.print(newPos);lcd.print(" ");
delay (10);
lastPos = newPos;
}
if (newPos >= 1){ // contrôle pour les positions supérieur a 0
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("Choix => ");lcd.print("Reglage");
delay (10);
lastPos = newPos;
}
}
if (digitalRead(BPE) == LOW) { // Control si Bouton encodeur actionné
Ebpe = newPos; // Si bouton actionné, mise en variable Ebpe du n° de la position
delay(500);
}