Cuando el disco comience 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 también queremos determinar la dirección de rotación, debemos considerar ambas señales al mismo tiempo.
Podemos notar que las dos señales de salida están desfasadas 90 grados entre sí. Si el codificador gira en el sentido de las agujas del reloj, la salida A estará por delante de la salida B.
Entonces, si contamos los pasos cada vez que cambia la señal, de alta a baja o de baja a alta, podemos notar que en ese momento las dos señales de salida tienen valores opuestos. Viceversa, si el codificador gira en sentido contrario a las agujas del reloj, las señales de salida tienen valores iguales. Entonces, considerando esto, podemos programar fácilmente nuestro controlador para leer la posición del codificador y la dirección de rotación.
Ejemplo de codificador rotatorio Arduino
Hagamos un ejemplo práctico de ello usando el Arduino. El módulo particular que usaré para este ejemplo viene en una placa de conexiones y tiene cinco pines. El primer pin es la salida A, el segundo pin es la salida B, el tercer pin es el 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.
Puede obtener los componentes necesarios para este tutorial de Arduino desde los siguientes enlaces:
Módulo codificador rotatorio……………….
Placa Arduino ………………………………
Placa de prueba y cables de salto ………
Código fuente
Aquí está el código de Arduino:
/* Arduino Rotary Encoder Tutorial
*
* 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);
// Reads the initial state of the outputA
aLastState = digitalRead(outputA);
}
void loop() {
aState = digitalRead(outputA); // Reads the "current" state of the outputA
// If the previous and the current state of the outputA are different, that means a Pulse has occured
if (aState != aLastState){
// If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
if (digitalRead(outputB) != aState) {
counter ++;
} else {
counter --;
}
Serial.print("Position: ");
Serial.println(counter);
}
aLastState = aState; // Updates the previous state of the outputA with the current state
}
Code language: Arduino (arduino)
Descripción del código: Entonces, primero debemos definir los pines a los que está conectado nuestro codificador y definir algunas variables necesarias para el programa. En la sección de configuración, debemos definir los dos pines como entradas, iniciar la comunicación en serie para imprimir los resultados en el monitor en serie, así como leer el valor inicial de la salida A y poner el valor en la variable aLastState.
Luego, en la sección de bucle, leemos la salida A nuevamente, pero ahora ponemos el valor en la variable aState. Entonces, si giramos el codificador y se genera un pulso, estos dos valores diferirán y la primera declaración "si" se volverá verdadera. Inmediatamente después de eso, usando la segunda declaración "if", determinamos la dirección de rotación. Si el estado de la salida B difiere del estado de la salida A, el contador aumentará en uno; de lo contrario, disminuirá. 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 carga el código, inicia el monitor serie y comienza a girar el codificador, comenzaremos a obtener los valores en el monitor serie. El módulo particular que tengo hace 30 cuentas cada ciclo completo.
Más información:Sensor ultrasónico HC-SR04 y Arduino:guía completa
Ejemplo 2:controlar un motor paso a paso mediante un codificador rotatorio
Además de este ejemplo básico, hice un ejemplo más de cómo controlar la posición de un motor paso a paso usando el codificador rotatorio.
Aquí está el código fuente de este ejemplo:
/* Stepper Motor using a Rotary Encoder
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
// defines pins numbers
#define stepPin 8
#define dirPin 9
#define outputA 10
#define outputB 11
int counter = 0;
int angle = 0;
int aState;
int aLastState;
void setup() {
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
aLastState = digitalRead(outputA);
lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display }
}
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("Position: ");
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);
}
Code language: Arduino (arduino)
No dude en hacer cualquier pregunta en la sección de comentarios a continuación.