0. Componentes y programación necesaria para un Encoder Rotativo con Eje Pulsador

Componentes requeridos:

{Product:2000}{Product:703}

I. Cómo utilizar el módulo Codificador Rotativo con Switch Eje Pulsador

Un encoder rotativo es un dispositivo genérico que permite determinar la posición y velocidad angular de un accionamiento realizado físicamente, y registrar la medición desde un procesador o autómata como Arduino.

Estos codificadores constan de dos pines para el pulsador (funciona como un pulsador normal) y tres pines para el codificador. Los tres pines del codificador van conectados uno a masa y los otros dos a las respectivas entradas que designemos en la placa Arduino. Estas dos señales que salen del encoder nos dan un total de 4 combinaciones. 00, 01, 10, y 11. Esto se conoce como 2 bits de código Grey.

Si tratamos a los pines en código binario, las leemos como 00, 01, 10, o 11. La secuencia de las salidas del codificador mientras giramos en sentido de las agujas del reloj es 00, 01, 11, 10

II. Procedimientos experimentales

Conexión

El módulo se alimenta directamente de Arduino, así que no necesitamos una fuente de alimentación externa. Para conectar el encoder a Arduino, necesitamos tres entradas digitales, dos para la detección del encoder y una adicional si queremos registrar la pulsación de la palanca (SW)

Los pines están conectados según la tabla:

 

Pin Módulo

Pin de Arduino UNO

CLK

D2

DT

D3

SW

D9

+

5V

GND

GND

Código

Abre un sketch nuevo y copia el siguiente código:

const int channelPinA = 9;

const int channelPinB = 10;

 

unsigned char stateChannelA;

unsigned char stateChannelB;

unsigned char prevStateChannelA = 0;

 

const int maxSteps = 255;

int prevValue;

int value;

 

const int timeThreshold = 5; 

unsigned long currentTime;

unsigned long loopTime;

 

bool IsCW = true;

 

void setup() {

   Serial.begin(9600);

   pinMode(channelPinA, INPUT);

   pinMode(channelPinB, INPUT);

   currentTime = millis();

   loopTime = currentTime;

   value = 0;

   prevValue = 0;

}

 

void loop() {

   currentTime = millis();

   if (currentTime >= (loopTime + timeThreshold))

   {

      stateChannelA = digitalRead(channelPinA);

      stateChannelB = digitalRead(channelPinB);

      if (stateChannelA != prevStateChannelA)  // Para precisión simple if((!stateChannelA) && (prevStateChannelA))

      {

         if (stateChannelB) // B es HIGH, es CW

         {

            bool IsCW = true;

            if (value + 1 <= maxSteps) value++; // Asegurar que no sobrepasamos maxSteps

         }

         else  // B es LOW, es CWW

         {

            bool IsCW = false;

            if (value - 1 >= 0) value = value--; // Asegurar que no tenemos negativos

         }

 

      }

      prevStateChannelA = stateChannelA;   // Guardar valores para siguiente

 

      // Si ha cambiado el valor, mostrarlo

      if (prevValue != value)

      {

         prevValue = value;

         Serial.print(value);

 

      }

 

      loopTime = currentTime;  // Actualizar tiempo

   }

   

   // Otras tareas

}

Desde el Monitor Serie en la pestaña Herramientas, podemos observar las posiciones.