Cómo usar el Scroll del ratón con Arduino

Posted on by

Codificador Rotatorio de Rueda de Ratón

El scroll de un ratón funciona usando un codificador rotatorio (rotary encoder) para detectar el sentido y el movimiento de la rueda de manera que nos ayuda a manejar  mejor la interfaz de diferentes programas como navegadores web, lectores de PDF, editores de texto, etc.

Pero un codificador rotatorio tiene sus ventajas e inconvenientes respecto de usar un potenciómetro con Arduino como veremos en el siguiente tutorial.


Un codificador rotatorio, también llamado codificador del eje o generador de pulsos, es un dispositivo electromecánico usado para convertir la posición angular de un eje a un código digital, lo que lo convierte en una clase de transductor.

Funcionamiento

Si no tenemos hoja de especificaciones del codificador rotatorio, podemos usar este circuito con LED’s para averiguar la secuencia de códigos que más adelante necesitaremos.

Test con LEDs del Codificador rotatorio de la rueda del ratón

Test con LEDs del Codificador rotatorio de la rueda del ratón

Según giramos la rueda veremos la secuencia de los LED encendidos y apagados, al ser  dos LED’s lo traduciremos a código binario de manera que la secuencia será  01->11->10->00->01 y en el sentido contrario 01->00->10->11->01.  Con esto ya podemos pasar a conectarlo con Arduino sabiendo la secuencia de la que podremos extraer el número de pasos y el sentido del giro.

Conexión con Arduino

Conexión del Codificador rotatorio con Arduino.

Conexión del Codificador rotatorio con Arduino.

Conectamos las dos salidas digitales a los pines 6 y 7 de Arduino. Leeremos constantemente estos pines en el código y formaremos la variable State con estos dos valores. Comprobaremos si el valor de State cambia con respecto de la medida anterior, si no hay cambio es que no se ha movido la rueda, en el caso de que sea diferente determinaremos el sentido del cambio (variable cw) y sumaremos o restaremos en la variable steps en función de dicho sentido. Como comprobamos antes la secuencia de estados es la siguiente  1<->3<->2<->0<->1.

byte AInput = 6;
byte BInput = 7;

byte lastState = 0;
byte steps = 0;
int  cw = 0;
byte AState = 0;
byte BState = 0;
byte State = 0;

void setup() {
  Serial.begin(9600);
  pinMode(AInput, INPUT);
  pinMode(BInput, INPUT);
}

void loop() {
  // read the input pin:
  AState = digitalRead(AInput);
  BState = digitalRead(BInput) << 1;
  State = AState | BState;

  if (lastState != State){
    switch (State) {
      case 0:
        if (lastState == 2){
          steps++;
          cw = 1;
        }
        else if(lastState == 1){
          steps--;
          cw = -1;
        }
        break;
      case 1:
        if (lastState == 0){
          steps++;
          cw = 1;
        }
        else if(lastState == 3){
          steps--;
          cw = -1;
        }
        break;
      case 2:
        if (lastState == 3){
          steps++;
          cw = 1;
        }
        else if(lastState == 0){
          steps--;
          cw = -1;
        }
        break;
      case 3:
        if (lastState == 1){
          steps++;
          cw = 1;
        }
        else if(lastState == 2){
          steps--;
          cw = -1;
        }
        break;
    }
  }

  lastState = State;
  Serial.print(State);
  Serial.print("\t");
  Serial.print(cw);
  Serial.print("\t");
  Serial.println(steps);
  delay(1);
}

 

Para ver estos valores de una manera alternativa al monitor del puerto serie podemos comprobarlo mediante el plotter. Para utilizarlo correctamente tendremos que imprimir la variables en una sola línea separando la variables con \t para que el plotter las identifique como variables diferentes y las muestre por separado.

 Serial.print(State);
 Serial.print("\t");
 Serial.print(cw);
 Serial.print("\t");
 Serial.println(steps);
Comments are disabled