delucidazioni su encoder rotativo

ho trovato una vecchia scgeda a casa mia che monta 2 encoder rotativi della ALPSuno anche con il pulsante. mentre gli altri 2 sono senza. ho cercato un po sul sito ed ho trovato nella playground il primo codice sugli encoder quello che dice se si va avanti indietro. collego il pin a e b (i 2 esterni)del mio encoder agli ingressi 2-3 di arduino metto il comune a massa e carico lo skretch quando apro la seriale arduino legge qualcosa ma mi vengono fuori a caso avanti indietro o meglio magari 1 avanti e 3 indietroanche se inveto la rotazione non cambia nulla.
vorrei sapere se esiste un codice facile facile che mi restituisce un valore numerico in base alla rotazione .perche avevo pensato di prendere il codice di questo esempio e di modificarlo in un qualche modo ma se funziona in questo modo non posso farcela.


// Digital pin definitions
enum enDigitalPins
{
// Rotary encoder input lines
dpInEncoderA=2,
dpInEncoderB=3,
dpInEncoderPress=4,
};

static void _ResetPins()
{
// Rotary encoder input lines
// Configure as input, turn on pullup resistors
pinMode(dpInEncoderA, INPUT);
digitalWrite(dpInEncoderA, HIGH);
pinMode(dpInEncoderB, INPUT);
digitalWrite(dpInEncoderB, HIGH);
pinMode(dpInEncoderPress, INPUT);
digitalWrite(dpInEncoderPress, HIGH);
}

void _lowlevel_ReadEncoder(int &rotate, int& press)
{
rotate = (digitalRead(dpInEncoderB) * 2) + digitalRead(dpInEncoderA);
press = digitalRead(dpInEncoderPress);
}

void ReadEncoder()
{
int Position, Press;
int isForward = 0;

_ResetPins();
Serial.println("Reading the encoder... press a key to abort.");
_lowlevel_ReadEncoder(Position, Press);
while (!Serial.available())
{
int Position2, Press2;
do
{
_lowlevel_ReadEncoder(Position2, Press2);
} while ((Position2 == Position) );
if (Position2 != Position)
{
// "Forward" is shown by the position going from (0 to 1) or (1 to 3)
// or (3 to 2) or (2 to 0). Anything else indicates that the user is
// turning the device the other way. Remember: this is Gray code, not
// binary.
int isFwd = ((Position == 0) && (Position2 == 1)) ||
((Position == 1) && (Position2 == 3)) ||
((Position == 3) && (Position2 == 2)) ||
((Position == 2) && (Position2 == 0));
;

Serial.println(isFwd ? "avanti" : "indietro");
}

Position = Position2;
Press = Press2;
}
}

void setup()
{
// configure the pins
_ResetPins();

// init serial communication
Serial.begin(115200);
Serial.println("Ready to begin");
}

void loop()
{
ReadEncoder();
}

ecco il codice che ho trovato sulla playground
vi ringrazio per le risposte

Ciao!
..ammetto di essere un po' di corsa e non aver letto il codice che hai postato, ma hai qualche sigla degli encoder? O qualche datasheet? O qualche foto? Perchè gli encoder sono di vario tipo, a led o a microinterruttori sfasati.. in ogni caso un piedino va per forza al +5, non sò dove tu abbia trovato che va messo a massa, e gli altri attaccati a massa con due resistenze da 10/20k circa (ma dipende dall'encoder, potrebbe volerci anche più grossa, devi fare delle prove e vedere la sensibilità, prova con un trimmer da 100K per iniziare), poi tra i piedini e le resistenze prendi i segnali.

Guarda qui:
http://www.arduino.cc/playground/Main/RotaryEncoders

STEC11B04 ALPS
Encoder 11mm vert 15imp/30pos Met Shaft 6/25 slot ecco questo penso che sia il nome del mio encoder a vederklo esternamente e identico al massimo pou' cambiare l'altezza del pomello. il codice che ho postato io è il rpimo del link che tu mi hai dato. quindi o io ho sbagliato a collegare l'encoder magari invettendo il comune con n o l'altro contatto o bo' adeso ho messo le due r da 10 k sui pin verso massa e prelevo il segnale sui piedini e lo mando ad arduino ma nulla continua a darmi risposte a caso adesso provo a cercare per bene il datasheet almeno per vedere se le connessioni sono esatte

Se hai il modello vedrai che il datasheet salterà fuori! :wink: Una volta che hai quello basta vedere qual'è il piedino del +5 e quali dei dati.

Purtroppo quel playground andrebbe un po' sistemato.. ma se avessi letto un po' più sotto del primo codice, avresti notato questo:

One side note: I used the Arduino's pullup resistors to "steer" the inputs high when they were not engaged by the encoder. Hence the encoder common pin is connected to ground. The sketch above fails to mention that some pulldown resistors (10k is fine) are going to be needed on the inputs since the encoder common is attached to +5V.

:wink:

Quindi fidati, il comune va a +5 e gli altri due a massa con due resistenze!

Ecco uno schemino:


| |

1 2 3
4 5
Gnd

Al punto 3 va collegato +5.
Ai punti 1 e 2 prelevi i due segnali dati (che vanno a due input analogici diversi).
Nei punti 4 e 5 metti le resistenze che vanno a Gnd. :wink:

ottimo funziona alla grande bene bene ti ringrazio e spero che queste delucidazioni possano servire anche ad altri in un futuro

Dai bene!! :wink:
Buona sperimentazione!