Menu mobile
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
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
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() {
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
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.