Bonjour,
Débutant complet en électronique et en programmation, je prépare un projet pour faire de la photo haute vitesse que l'on peut retrouver sur ce forum sous le titre arduino et photo haute vitesse.
Grâce à l'aide reçu, j'ai réussi à construire mon schéma et à écrire quelques lignes de code pour le faire tourner mais j'avoue avoir du mal à trouver comment faire fonctionner mon encodeur rotatif.
Cette petite chose vendu chez sparkfun sous la ref com-10982 rassemble un encodeur 24 clics/tour, un bouton poussoir et une led RVB... Intéressant mais pas simple à programmer pour moi.
En m'inspirant de ceci: http://bildr.org/2012/08/rotary-encoder-arduino/
J'en suis arrivé au code suivant qui se compile correctement:
//Les pins 2&3 ne peuvent être change car ce sont les pins d’interruption.
int encodeurB = 2; //définition de la broche 2 de la carte en tant que variable, encodeur B
int encodeurA = 3; //définition de la broche 3 de la carte en tant que variable, encodeur A
int encodeurBouton = 11; //définition de la broche 11 de la carte en tant que variable, B. poussoir
volatile int retard= 500; //variable pour mémoriser le temps de retardement appeler à évoluer
volatile long encodeurValue = 0; //je sais pas ce que c’est mais ça doit être important
long lastencodeurValue = 0 ; //je sais pas ce que c’est mais ça doit être important
int lastMSB = 0; //je sais pas ce que c’est mais ça doit être important
int lastLSB = 0; //je sais pas ce que c’est mais ça doit être importantvoid setup() {
pinMode(encodeurB, INPUT); // initialisation de la broche 2 comme étant une entrée
pinMode(encodeurA, INPUT); //initialisation de la broche 3 comme étant une entrée
pinMode(encodeurBouton, INPUT); //initialisation de la broche 3 comme étant une entrée
digitalWrite(encodeurB, HIGH); // initialisation de la broche 2 en pullup
digitalWrite(encodeurA, HIGH); // initialisation de la broche 3 en pullup
digitalWrite(encodeurBouton, HIGH); // initialisation de la broche 11 en pullup//appelle updateEncodeur() quand un changement Haut ou Bas est détécté sur les broches //interrupt 0 (broche 2) ou interrupt 1 (broche 3)
attachInterrupt(0, updateEncodeur, CHANGE);
attachInterrupt(1, updateEncodeur, CHANGE);
}void loop(){
// déroulement du programme
if(digitalRead(encodeurBouton)){
//bouton non poussé
}else{
//bouton poussé
}
delay(1000); //ou autres actions
}void updateEncodeur(){
int MSB = digitalRead(encodeurB); //MSB = most significant bit, bit le plus significatif
int LSB = digitalRead(encodeurA); //LSB = least significant bit, bit le moins significatifint encodeur = (MSB << 1) |LSB; // conversion de la valeur des 2 broches en une valeur unique
int sum = (retard << 2) | encodeur; // ajouter à la valeur précédente d’encodeurif(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encodeurValue ++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encodeurValue --;retard = encodeur; //stock la nouvelle valeur de retard
}
Jusqu'ici tout va bien...
Tout cela est relatif au schéma suivant:
