potenciometro?

Hola,
estamos un poco enredados con un dispositivo que compramos como "potenciometro sin fin", lo hemos conectado de diferentes formas y siempre al mandar la informacion de la lectura por el puerto serial genera este error:

Error inside Serial.serialEvent()
java.io.IOException: Input/output error in nativeavailable
      at gnu.io.RXTXPort.nativeavailable(Native Method)
      at gnu.io.RXTXPort$SerialInputStream.available(RXTXPort.java:1532)
      at processing.app.Serial.serialEvent(Serial.java:206)
      at gnu.io.RXTXPort.sendEvent(RXTXPort.java:732)
      at gnu.io.RXTXPort.eventLoop(Native Method)
      at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575)

lo hemos conectado en maquinas corriendo linux y windows y en este ultimo sistema aparece un error que dice sobrecarga del puerto usb.

aca abajo pongo una imagen del componente para ver si alguien a tratado con alguno de estos:

luego de un rato de googling encontramos la solucion al asunto :smiley:

No es un potenciometro sino un "rotary encoder" y siguiendo [1] y [2] logramos hacerlo funcionar. El conexionado esta de esta manera:

o
| | |
123

encoder -> arduino
1 -> pin 4
2 -> pin 2
3 -> GND

y el codigo:

/* read a rotary encoder with interrupts
   Encoder hooked up with common to GROUND,
   encoder0PinA to pin 2, encoder0PinB to pin 4 (or pin 3 see below)
   it doesn't matter which encoder pin you use for A or B  

   uses Arduino pullups on A & B channel outputs
   turning on the pullups saves having to hook up resistors 
   to the A & B channel outputs 

*/ 

#define encoder0PinA  2
#define encoder0PinB  4

volatile unsigned int encoder0Pos = 0;

void setup() { 


  pinMode(encoder0PinA, INPUT); 
  digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
  pinMode(encoder0PinB, INPUT); 
  digitalWrite(encoder0PinB, HIGH);       // turn on pullup resistor

  attachInterrupt(0, doEncoder, CHANGE);  // encoder pin on interrupt 0 - pin 2
  Serial.begin (9600);
  Serial.println("start");                // a personal quirk

} 

void loop(){
// do some stuff here - the joy of interrupts is that they take care of themselves
}


void doEncoder(){
  if (digitalRead(encoder0PinA) == HIGH) {   // found a low-to-high on channel A
    if (digitalRead(encoder0PinB) == LOW) {  // check channel B to see which way
                                             // encoder is turning
      encoder0Pos = encoder0Pos - 1;         // CCW
    } 
    else {
      encoder0Pos = encoder0Pos + 1;         // CW
    }
  }
  else                                        // found a high-to-low on channel A
  { 
    if (digitalRead(encoder0PinB) == LOW) {   // check channel B to see which way
                                              // encoder is turning  
      encoder0Pos = encoder0Pos + 1;          // CW
    } 
    else {
      encoder0Pos = encoder0Pos - 1;          // CCW
    }

  }
  Serial.println (encoder0Pos, DEC);          // debug - remember to comment out
                                              // before final program run
  // you don't want serial slowing down your program if not needed
}

[1]Arduino Playground - HomePage
[2]http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1201840336;start=all