Go Down

Topic: Encoder Rotativo, letture multiple. (Read 153 times) previous topic - next topic

pralex

Jul 16, 2017, 10:31 am Last Edit: Jul 17, 2017, 09:34 am by pralex Reason: Perchè questo risultato inatteso? Come faccio ad ottenere letture unitarie?
Salve a tutti,
premetto che è il mio primo post sul forum pertanto spero di riuscire da subito a non infrangerne alcuna regola di comportamento. Altro particolare importante è che essendomi avvicinato all'elettronica ed alla programmazione da poco ed in via del tutto amatoriale, spero riusciate a porvi a me come se doveste spiegare qualcosa ad un giovane ragazzo (per non dire a un bambino).
Ma veniamo al dunque:
ho usato questo codice per testare il più economico encoder rotativo acquistabile su amazon ma quando provo a ruotarlo, anzicchè ottenere aumenti o diminuzioni unitarie dell'"encoderValue", come primo valore incrementale ottengo 2 e quelli successivi si avvicendano a multipli di 4 e cioè: 6,10,14...ecc. (situazione speculare per i numeri negativi).
Perchè questo risultato inatteso? Come faccio ad ottenere letture unitarie?
Quasi dimenticavo, uso un Arduino Mega 2560

 
Code: [Select]
int encoderPin1 = 2;
int encoderPin2 = 3;
volatile int lastEncoded = 0;
volatile int encoderValue = 0;
long lastencoderValue = 0;
int lastMSB = 0;
int lastLSB = 0;
void setup() {
  Serial.begin (9600);
  pinMode(encoderPin1, INPUT);
  pinMode(encoderPin2, INPUT);
  digitalWrite(encoderPin1, HIGH);
  digitalWrite(encoderPin2, HIGH);
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);
}
void loop(){
   Serial.println(encoderValue);
  delay(1000);
}
void updateEncoder(){
  int MSB = digitalRead(encoderPin1);
  int LSB = digitalRead(encoderPin2);
  int encoded = (MSB << 1) |LSB;
  int sum  = (lastEncoded << 2) | encoded;
  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
  lastEncoded = encoded;
}

gpb01

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :)

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili
Search is Your friend ... or I am Your enemy !

docdoc

Ehm, non capisco bene perché il tuo codice sia così "strano", non ho mai usato così gli encoder, e con due ISR poi...

Ma hai provato con altri codici di test, come ad esempio QUESTO del Playground? O anche QUESTO?
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito ;-) **

astrobeed

#3
Jul 17, 2017, 11:59 am Last Edit: Jul 17, 2017, 12:00 pm by astrobeed
La gestione che hai scritto per l'encoder è caotica, inoltre gli encoder meccanici hanno la particolarità che ad ogni scatto eseguono un ciclo completo dei canali A e B, ovvero sono due impulsi se lo gestisci senza quadratura, quattro impulsi se lo gestisci in quadratura.
Ti consiglio di dare un'occhiata a quanto ho realizzato per X-Plane, sia 10 che 11, dove gestisco la parte radio tramite un display grafico 320x240 e due encoder per cambiare le frequenze, in particolare la parte encoder implementata tramite la libreria encoder di Paul Stoffregen.
Scientia potentia est

Go Up