Domina los encoders rotativos con Arduino: Funcionamiento e integración paso a paso
En este tutorial aprenderemos cómo funciona un encoder rotativo y cómo usarlo con Arduino. Puedes ver el siguiente vídeo o leer el tutorial escrito a continuación. Un encoder rotativo es un tipo de sensor de posición que se usa para determinar la posición angular de un eje giratorio. Genera una señal eléctrica, ya sea analógica o digital, de acuerdo con el movimiento rotacional. Hay muchos tipos diferentes de encoders rotativos que se clasifican por Señal de Salida o Tecnología de Detección. El encoder rotativo particular que usaremos en este tutorial es un encoder rotativo incremental y es el sensor de posición más simple para medir rotación. Este encoder rotativo también se conoce como encoder cuadratura o encoder rotativo relativo y su salida es una serie de pulsos de onda cuadrada. Echemos un vistazo más de cerca al encoder y veamos su principio de funcionamiento. Aquí está cómo se generan los pulsos de onda cuadrada: El encoder tiene un disco con zonas de contacto espaciadas uniformemente que están conectadas al pin común C y dos pines de contacto separados A y B, como se ilustra a continuación. Cuando el disco comienza a girar paso a paso, los pines A y B comenzarán a hacer contacto con el pin común y las dos señales de salida de onda cuadrada se generarán en consecuencia. Cualquiera de las dos salidas puede usarse para determinar la posición rotada si solo contamos los pulsos de la señal. Sin embargo, si queremos determinar la dirección de rotación también, necesitamos considerar ambas señales al mismo tiempo. Podemos notar que las dos señales de salida están desplazadas 90 grados fuera de fase entre sí. Si el encoder gira en sentido horario, la salida A irá por delante de la salida B. Así que si contamos los pasos cada vez que la señal cambia, de Alto a Bajo o de Bajo a Alto, podemos notar en ese momento las dos señales de salida tienen valores opuestos. Viceversa, si el encoder gira en sentido antihorario, las señales de salida tienen valores iguales. Considerando esto, podemos programar fácilmente nuestro controlador para leer la posición del encoder y la dirección de rotación. Hagamos un ejemplo práctico usando Arduino. El módulo particular que usaré para este ejemplo viene en una placa breakout y tiene cinco pines. El primer pin es la salida A, el segundo pin es la salida B, el tercer pin es el pin del Botón y, por supuesto, los otros dos pines son VCC y GND. Podemos conectar los pines de salida a cualquier pin digital de la placa Arduino. Puedes conseguir los componentes necesarios para este tutorial de Arduino en los enlaces a continuación: Aquí está el código de Arduino: Descripción del código: Primero necesitamos definir los pines a los que está conectado nuestro encoder y definir algunas variables necesarias para el programa. En la sección setup necesitamos definir los dos pines como entradas, iniciar la comunicación serial para imprimir los resultados en el monitor serial, así como leer el valor inicial de la salida A y poner el valor en la variable aLastState. Luego, en la sección loop, leemos la salida A de nuevo pero ahora ponemos el valor en la variable aState. Así que si giramos el encoder y se genera un pulso, estos dos valores diferirán y la primera sentencia "if" se volverá verdadera. Justo después, usando la segunda sentencia "if" determinamos la dirección de rotación. Si el estado de la salida B difiere del estado de la salida A, el contador se incrementará en uno, de lo contrario se decrementará. Al final, después de imprimir los resultados en el monitor serial, necesitamos actualizar la variable aLastState con la variable aState. Eso es todo lo que necesitamos para este ejemplo. Si subimos el código, iniciamos el Monitor Serial y empezamos a girar el encoder, comenzaremos a obtener los valores en el monitor serial. El módulo particular que tengo hace 30 cuentas por cada ciclo completo. Aprende más: Sensor Ultrasónico HC-SR04 y Arduino – Guía Completa Además de este ejemplo básico, hice un ejemplo más de controlar la posición de un motor paso a paso usando el encoder rotativo. Aquí está el código fuente de este ejemplo: Siéntete libre de hacer cualquier pregunta en la sección de comentarios a continuación.Resumen


Cómo Funciona el Encoder Rotativo


Ejemplo Encoder Rotativo Arduino

Código Fuente
/* Tutorial Arduino Encoder Rotativo
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#define outputA 6
#define outputB 7
int counter = 0;
int aState;
int aLastState;
void setup() {
pinMode(outputA, INPUT);
pinMode(outputB, INPUT);
Serial.begin(9600);
// Lee el estado inicial de la salida A
aLastState = digitalRead(outputA);
}
void loop() {
aState = digitalRead(outputA); // Lee el estado "actual" de la salida A
// Si el estado previo y el actual de la salida A son diferentes, significa que ha ocurrido un Pulso
if (aState != aLastState) {
// Si el estado de la salida B es diferente al estado de la salida A, significa que el encoder gira en sentido horario
if (digitalRead(outputB) != aState) {
counter++;
} else {
counter--;
}
Serial.print("Posición: ");
Serial.println(counter);
}
aLastState = aState; // Actualiza el estado previo de la salida A con el estado actual
}Lenguaje: Arduino (arduino)Ejemplo 2 – Controlando un Motor Paso a Paso Usando un Encoder Rotativo

/* Motor Paso a Paso usando Encoder Rotativo
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <LiquidCrystal.h> // incluye la librería LiquidCrystal
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Crea objeto LC. Parámetros: (rs, enable, d4, d5, d6, d7)
// define pines
#define stepPin 8
#define dirPin 9
#define outputA 10
#define outputB 11
int counter = 0;
int angle = 0;
int aState;
int aLastState;
void setup() {
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(outputA, INPUT);
pinMode(outputB, INPUT);
aLastState = digitalRead(outputA);
lcd.begin(16,2);
}
void loop() {
aState = digitalRead(outputA);
if (aState != aLastState) {
if (digitalRead(outputB) != aState) {
counter++;
angle++;
rotateCW();
} else {
counter--;
angle--;
rotateCCW();
}
if (counter >= 30) {
counter = 0;
}
lcd.clear();
lcd.print("Posición: ");
lcd.print(int(angle * (-1.8)));
lcd.print("deg");
lcd.setCursor(0,0);
}
aLastState = aState;
}
void rotateCW() {
digitalWrite(dirPin, LOW);
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}
void rotateCCW() {
digitalWrite(dirPin, HIGH);
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}Lenguaje: Arduino (arduino)
Proceso de manufactura
- Control Preciso de Servo con Arduino y MPU6050 (SG90 / MG996R)
- Construir una rueda medidora DIY precisa con Arduino Nano y encoder rotativo
- Módulo GPS u-blox LEA‑6H 02: Guía de integración con Arduino y Python
- Leer Temperatura y Humedad con DHT11 en Blynk – Tutorial Paso a Paso con Arduino
- Uso Fácil de Termistor: Guía Paso a Paso con Arduino
- Genera Tonos Musicales con Arduino: Guía Paso a Paso
- Conexión de Arduino a NMEA‑0183: Guía Paso a Paso
- Domina Modbus en Arduino: Guía Paso a Paso
- Proyecto LED Controlado por Voz: Arduino Micro + BitVoicer Server para Reconocimiento Voz
- Construye tu Propio Robot Asistente IA con Arduino y Python
- Dominando Queues en C#: Enqueue, Dequeue y Operaciones Primero-En-Entrar-Primero-En-Salir Explicadas