encoder

buongiorno a tutti,

ho usato un encoder con arduino uno e mi risponde bene (pin2= input; pin 3= input; comune =aref) mi mostra sullo schermo i passi della ruota,

poi ho copiato il tutto su arduino due e ...... zero non mi legge i movimenti, ho controllato i fili e i collegamenti ed e' tutto ok,

sostituisco nuovamente la scheda, rimonto arduino uno e funziona tutto

...... non riesco a capire cosa devo cambiare.

chi mi aiuta ?

grazie

roberto

Arduino DUE e Arduino UNO sono due schede completamente diverse e non sempre compatibili.

Oggi non mi funziona la mia sfera di cristallo.

Potresti darci il Tuo sketch?

Ciao Uwe

Mica funzionava tutto a 3.3v sulla due ?

ciao
ma non hai già aperto la discussione in SENSOR? là ti ho fornito un link

wildroad:
buongiorno a tutti,

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Ho domandi qui in italiano o in sezione internazionale in inglese

scusa per le due richieste, sono nuovo, leggo le regole e mi adeguo, non volevo creare disturbo

roberto

questo e' lo sketch che ho copiato (per non prendere meriti di altri)

int encoderPin1 = 2;
int encoderPin2 = 3;
volatile int lastEncoded = 0;
volatile long 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); //turn pullup resistor on
digitalWrite(encoderPin2, HIGH); //turn pullup resistor on

attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);
}

void loop(){
Serial.println(encoderValue);
}

void updateEncoder(){
int MSB = digitalRead(encoderPin1); //MSB = most significant bit
int LSB = digitalRead(encoderPin2); //LSB = least significant bit

int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;

lastEncoded = encoded; //store this value for next time
}

lo sketch e' stato inserito in uno più' ampio che mi controlla quanti passi sono stati fatti (motori in cc al posto di motori passo passo) e si ferma al posto predefinito

seguivo questa strategia: provavo pezzi dello sketch su arduino uno (esempio misura distanza, sensore di prossimità) e quando riuscivo a farli funzionare li trasferivo su uno sketch completo (di altre parti) che faccio girare su arduino due

grazie
roberto

Come immaginavo, l'errore è qui

attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);

Sulla UNO devi indicare l'interrupt, sulla DUE invece devi indicare il pin.
Dovrai cambiare codice se cambi scheda.

Esempio:

#if defined(__AVR_ATmega328P__)
   attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);
#else
 attachInterrupt(encoderPin1, updateEncoder, CHANGE);
 attachInterrupt(encoderPin2, updateEncoder, CHANGE);
#endif

Provalo. 8)

Comunque l'Arduino Due ha la gestione degli encoder in hardware
--> http://forum.arduino.cc/index.php/topic,140205.0.html

l'ho provato, ma non parte, i pin sono collegati grn=>AREF CLK=>2 DK=>3

posso aggirare l'ostacolo in qualche maniera?
grazie
roberto

Non devi usare AREF ma GND.
Poi i pin rimangono il 2 e il 3.

L'altro topic che ho linkato non l'ho approfondito perché non ho la DUE.