C贸mo funciona el codificador y c贸mo conectarlo a Arduino

Si eres un apasionado de la electr贸nica y la programaci贸n, seguro has escuchado hablar del codificador y su utilidad en la interacci贸n con dispositivos como Arduino. En este art铆culo te explicaremos en detalle c贸mo funciona este componente y c贸mo puedes conectarlo de forma sencilla a tu placa Arduino para sacarle el m谩ximo provecho. 隆Sigue leyendo para descubrir todas las posibilidades que ofrece esta herramienta!

Estamos rodeados de codificadores sin siquiera darnos cuenta, ya que se utilizan en muchos objetos cotidianos, desde impresoras y c谩maras hasta m谩quinas CNC y robots. La aplicaci贸n m谩s com煤n de un codificador rotatorio es el control de volumen de la radio de un autom贸vil.

Un codificador rotatorio es un tipo de sensor de posici贸n que convierte la posici贸n angular (rotaci贸n) de una perilla en una se帽al de salida que se puede usar para determinar en qu茅 direcci贸n se gira la perilla.

Los codificadores rotatorios se dividen en dos tipos: absolutos e incrementales. El codificador absoluto informa la posici贸n exacta de la perilla en grados, mientras que el codificador incremental informa el n煤mero de incrementos que se ha movido el eje.

El codificador rotatorio utilizado en este tutorial es de tipo incremental.

Codificador rotatorio versus potenci贸metro

Los codificadores rotatorios son el equivalente digital moderno de los potenci贸metros y son m谩s vers谩tiles.

Los codificadores rotatorios pueden girar 360掳 sin detenerse, mientras que los potenci贸metros solo pueden girar 3/4 del c铆rculo.

Los potenci贸metros se utilizan en situaciones en las que es necesario saber la ubicaci贸n exacta de la perilla. Los codificadores rotatorios, por otro lado, se utilizan en situaciones en las que es necesario conocer el cambio de posici贸n y no la posici贸n exacta.

驴C贸mo funcionan los codificadores rotativos?

Dentro del codificador hay un disco ranurado conectado al pin C, la tierra com煤n. Tambi茅n tiene dos pines de contacto A y B como se muestra a continuaci贸n.

C贸mo funciona el codificador y c贸mo conectarlo a Arduino

A medida que gira la perilla, A y B hacen contacto con el pin de tierra com煤n C en un orden espec铆fico dependiendo de en qu茅 direcci贸n gire la perilla.

Al entrar en contacto con el terreno com煤n, se generan dos se帽ales. Estas se帽ales est谩n desfasadas 90掳 porque un pin hace contacto con tierra com煤n antes que el otro. Se le conoce como Codificaci贸n en cuadratura.

C贸mo funciona el codificador y c贸mo conectarlo a Arduino

Cuando se gira la perilla en el sentido de las agujas del reloj, el pin A se conecta a tierra antes que el pin B. Cuando se gira la perilla en sentido antihorario, el pin B se conecta a tierra antes que el pin A.

Al monitorear cu谩ndo cada pin est谩 conectado o desconectado de tierra, podemos determinar la direcci贸n en la que se gira la perilla. Esto se puede lograr simplemente observando el estado de B a medida que cambia el estado de A.

Si A cambia de estado:

  • si B != A, entonces la perilla se gira en el sentido de las agujas del reloj.
    C贸mo funciona el codificador y c贸mo conectarlo a Arduino
  • si B = A, la perilla se gira en sentido antihorario.
    C贸mo funciona el codificador y c贸mo conectarlo a Arduino

Asignaci贸n de pines del codificador

La asignaci贸n de pines del m贸dulo codificador es la siguiente:

C贸mo funciona el codificador y c贸mo conectarlo a Arduino

Tierra es la conexi贸n a tierra.

VCC es el voltaje de suministro positivo, que normalmente est谩 entre 3,3 y 5 voltios.

SUDOESTE es la salida del interruptor de presi贸n (activo bajo). Cuando se presiona el bot贸n, el voltaje baja.

DT (salida B) es similar a la salida de CLK, pero va por detr谩s de CLK en un cambio de fase de 90掳. Esta salida se utiliza para determinar la direcci贸n de rotaci贸n.

CLK (salida A) es el pulso de salida principal utilizado para determinar la cantidad de rotaci贸n. Cada vez que se gira la perilla solo un tope (clic) en una direcci贸n u otra, la salida 鈥淐LK鈥 pasa por un ciclo de subida a ALTO y luego a BAJO.

Cableado de un codificador rotatorio a un Arduino

Ahora que entendemos c贸mo funciona el codificador, 隆es hora de usarlo!

Conectemos el codificador al Arduino. Las conexiones son bastante simples. Primero, conecte el pin +V del m贸dulo a la salida de 5V del Arduino y el pin GND a tierra.

Ahora conecte los pines CLK y DT a los pines digitales n.掳 2 y n.掳 3 respectivamente. Finalmente, conecte el pin SW al pin digital n.掳 4.

La siguiente imagen muestra el cableado.

C贸mo funciona el codificador y c贸mo conectarlo a Arduino

C贸digo de ejemplo 1 de Arduino: lectura del codificador rotatorio

Nuestro primer ejemplo es muy simple; Simplemente detecta el sentido de rotaci贸n del codificador y cu谩ndo se presiona el bot贸n.

Pruebe primero el boceto y luego lo analizaremos con m谩s detalle.

// Rotary Encoder Inputs
#define CLK 2
#define DT 3
#define SW 4

int counter = 0;
int currentStateCLK;
int lastStateCLK;
String currentDir ="";
unsigned long lastButtonPress = 0;

void setup() {
        
	// Set encoder pins as inputs
	pinMode(CLK,INPUT);
	pinMode(DT,INPUT);
	pinMode(SW, INPUT_PULLUP);

	// Setup Serial Monitor
	Serial.begin(9600);

	// Read the initial state of CLK
	lastStateCLK = digitalRead(CLK);
}

void loop() {
        
	// Read the current state of CLK
	currentStateCLK = digitalRead(CLK);

	// If last and current state of CLK are different, then pulse occurred
	// React to only 1 state change to avoid double count
	if (currentStateCLK != lastStateCLK  && currentStateCLK == 1){

		// If the DT state is different than the CLK state then
		// the encoder is rotating CCW so decrement
		if (digitalRead(DT) != currentStateCLK) {
			counter --;
			currentDir ="CCW";
		} else {
			// Encoder is rotating CW so increment
			counter ++;
			currentDir ="CW";
		}

		Serial.print("Direction: ");
		Serial.print(currentDir);
		Serial.print(" | Counter: ");
		Serial.println(counter);
	}

	// Remember last CLK state
	lastStateCLK = currentStateCLK;

	// Read the button state
	int btnState = digitalRead(SW);

	//If we detect LOW signal, button is pressed
	if (btnState == LOW) {
		//if 50ms have passed since last LOW pulse, it means that the
		//button has been pressed, released and pressed again
		if (millis() - lastButtonPress > 50) {
			Serial.println("Button pressed!");
		}

		// Remember last button press event
		lastButtonPress = millis();
	}

	// Put in a slight delay to help debounce the reading
	delay(1);
}

Deber铆a ver un resultado similar en el monitor serie.

C贸mo funciona el codificador y c贸mo conectarlo a Arduino

Si la rotaci贸n informada es la opuesta a la esperada, intente intercambiar los pines CLK (Salida A) y DT (Salida B).

Explicaci贸n del c贸digo:

El boceto comienza especificando los pines Arduino a los que est谩n conectados los pines CLK, DT y SW del codificador.

#define CLK 2
#define DT 3
#define SW 4

Luego se definen algunas variables.

  • El counter La variable aumenta cada vez que se gira la perilla una muesca (clic).
  • las variables currentStateCLK Y lastStateCLK Guarda el estado de la salida CLK y se utiliza para calcular la cantidad de rotaci贸n.
  • Una cadena que contiene el nombre. currentDir se utiliza para mostrar la direcci贸n de rotaci贸n actual en el monitor serie.
  • La variable lastButtonPress se utiliza para rebotar un interruptor.
int counter = 0;
int currentStateCLK;
int lastStateCLK;
String currentDir ="";
unsigned long lastButtonPress = 0;

En la secci贸n de configuraci贸n, primero configuramos las conexiones del codificador como entradas y luego habilitamos la entrada pull-up en el pin SW. Tambi茅n configuramos el monitor serial.

Finalmente, leemos el valor actual del pin CLK y lo guardamos en la variable lastStateCLK.

pinMode(CLK,INPUT);
pinMode(DT,INPUT);
pinMode(SW, INPUT_PULLUP);

Serial.begin(9600);

lastStateCLK = digitalRead(CLK);

En la secci贸n de bucle comprobamos nuevamente el estado de CLK y lo comparamos con el lastStateCLK Valor. Si son diferentes significa que se ha girado el mando. Tambi茅n comprobamos si currentStateCLK es 1 para reaccionar solo ante un cambio de estado y evitar el doble conteo.

currentStateCLK = digitalRead(CLK);

if (currentStateCLK != lastStateCLK  && currentStateCLK == 1){

Dentro de if Se determina el sentido de rotaci贸n. Para lograr esto, simplemente leemos el pin DT y lo comparamos con el estado actual del pin CLK.

  • Si estos dos valores son diferentes, significa que el mando est谩 girado en sentido antihorario. El counter luego se reduce y el currentDir est谩 configurado en 鈥淐CW鈥.
  • Si estos dos valores son iguales, significa que la perilla est谩 girada en el sentido de las agujas del reloj. El counter luego se incrementa y el currentDir est谩 ajustado en 鈥淐W鈥.
if (digitalRead(DT) != currentStateCLK) {
    counter --;
    currentDir ="CCW";
} else {
    counter ++;
    currentDir ="CW";
}

Luego, los resultados se imprimen en el monitor serie.

Serial.print("Direction: ");
Serial.print(currentDir);
Serial.print(" | Counter: ");
Serial.println(counter);

Siguiendo el if Declaraci贸n, actualizamos lastStateCLK con el estado actual de CLK.

lastStateCLK = currentStateCLK;

El siguiente paso es leer y eliminar el rebote del interruptor de bot贸n. Primero leemos el estado actual de la clave y, cuando cambia a BAJO, esperamos 50 ms hasta que la clave rebote.

Si el bot贸n permanece BAJO durante m谩s de 50 ms, esto indica que realmente fue presionado. Como resultado, imprimimos 芦隆Bot贸n presionado!禄 en el monitor en serie.

int btnState = digitalRead(SW);

if (btnState == LOW) {
    if (millis() - lastButtonPress > 50) {
        Serial.println("Button pressed!");
    }
    lastButtonPress = millis();
}

Luego repetimos el proceso.

C贸digo de muestra 2 de Arduino: uso de interrupciones

Para leer el codificador, necesitamos monitorear constantemente los cambios en las se帽ales DT y CLK.

Una forma de detectar estos cambios es sondearlos continuamente, como hicimos en nuestro boceto anterior. Sin embargo, no es la mejor soluci贸n por las siguientes razones.

  • A menudo necesitamos comprobar si el valor ha cambiado. Si el nivel de la se帽al no cambia, se desperdician ciclos.
  • Existe la posibilidad de latencia entre el momento en que ocurre el evento y el momento en que lo revisamos. Cuando necesitamos responder r谩pidamente, esta latencia provoca retrasos.
  • Si el cambio dura poco tiempo, existe la posibilidad de que el cambio de se帽al se pase por alto por completo.

Una forma de lidiar con esto es usar interrumpe.

Con las interrupciones no es necesario preguntar constantemente por un evento espec铆fico. Esto permite que Arduino realice otras tareas sin perderse ning煤n evento.

alambrado

Dado que la mayor铆a de las placas Arduino (incluida Arduino UNO) solo tienen dos interrupciones externas, solo podemos monitorear los cambios en las se帽ales DT y CLK. Por lo tanto eliminaremos la conexi贸n del pin SW.

Algunas placas (como la Arduino Mega 2560) tienen m谩s interrupciones externas que otras. Si tiene uno de estos, puede conservar la conexi贸n del pin SW y modificar el siguiente esquema para incluir el c贸digo del bot贸n pulsador.

El dise帽o de cableado actualizado es el siguiente:

C贸mo funciona el codificador y c贸mo conectarlo a Arduino

c贸digo arduino

A continuaci贸n se muestra un ejemplo de lectura de un codificador con interrupciones.

// Rotary Encoder Inputs
#define CLK 2
#define DT 3

int counter = 0;
int currentStateCLK;
int lastStateCLK;
String currentDir ="";

void setup() {

	// Set encoder pins as inputs
	pinMode(CLK,INPUT);
	pinMode(DT,INPUT);

	// Setup Serial Monitor
	Serial.begin(9600);

	// Read the initial state of CLK
	lastStateCLK = digitalRead(CLK);
	
	// Call updateEncoder() when any high/low changed seen
	// on interrupt 0 (pin 2), or interrupt 1 (pin 3)
	attachInterrupt(0, updateEncoder, CHANGE);
	attachInterrupt(1, updateEncoder, CHANGE);
}

void loop() {
    //Do some useful stuff here
}

void updateEncoder(){
	// Read the current state of CLK
	currentStateCLK = digitalRead(CLK);

	// If last and current state of CLK are different, then pulse occurred
	// React to only 1 state change to avoid double count
	if (currentStateCLK != lastStateCLK  && currentStateCLK == 1){

		// If the DT state is different than the CLK state then
		// the encoder is rotating CCW so decrement
		if (digitalRead(DT) != currentStateCLK) {
			counter --;
			currentDir ="CCW";
		} else {
			// Encoder is rotating CW so increment
			counter ++;
			currentDir ="CW";
		}

		Serial.print("Direction: ");
		Serial.print(currentDir);
		Serial.print(" | Counter: ");
		Serial.println(counter);
	}

	// Remember last CLK state
	lastStateCLK = currentStateCLK;
}

Tenga en cuenta que el bucle principal de este programa se deja vac铆o, por lo que Arduino est谩 ocupado sin hacer nada.

Ahora, cuando gire la perilla, deber铆a ver una salida similar en el monitor serie.

C贸mo funciona el codificador y c贸mo conectarlo a Arduino

Explicaci贸n del c贸digo:

Este boceto solo monitorea los pines digitales 2 (correspondiente a la interrupci贸n 0) y 3 (correspondiente a la interrupci贸n 1) para detectar cambios de se帽al. En otras palabras, detecta cuando el voltaje cambia de ALTO a BAJO o de BAJO a ALTO girando la perilla.

Cuando ocurre un cambio, Arduino lo detecta inmediatamente, guarda su estado de ejecuci贸n y ejecuta la funci贸n. updateEncoder() (tambi茅n conocido como Interrumpir la rutina del servicio. o simplemente ISR) y luego vuelve a lo que estaba haciendo antes.

Las siguientes dos l铆neas configuran las interrupciones. El attachInterrupt() La funci贸n le dice al Arduino qu茅 pin monitorear, qu茅 ISR ejecutar cuando se activa la interrupci贸n y qu茅 tipo de disparador buscar.

attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);

C贸digo de ejemplo 3 de Arduino: control del servomotor con codificador rotatorio

En el siguiente ejemplo, utilizamos un codificador rotatorio para controlar la posici贸n de un servomotor.

Este proyecto puede resultar muy 煤til en diversas situaciones. Por ejemplo, si desea operar un brazo rob贸tico, puede ayudarle a colocar con precisi贸n el brazo y su mango.

Si no est谩 familiarizado con los servomotores, lea el siguiente tutorial.

LECTURAS SUGERIDAS

C贸mo funciona el codificador y c贸mo conectarlo a Arduino
C贸mo funciona el servomotor y c贸mo conectarlo a Arduino
Hay muchos motores para elegir, pero es importante elegir el adecuado para el trabajo. Si su proyecto requiere un posicionamiento preciso, un鈥

alambrado

Incluyamos un servomotor en nuestro proyecto. Conecte el cable rojo del servomotor al suministro externo de 5 V, el cable negro/marr贸n a tierra y el cable naranja/amarillo al pin digital 9 habilitado para PWM.

Por supuesto, puedes utilizar la salida de 5 V del Arduino. Sin embargo, tenga en cuenta que el servo puede causar ruido el茅ctrico en la l铆nea de suministro de 5 V que podr铆a da帽ar su Arduino. Por lo tanto, se recomienda utilizar una fuente de alimentaci贸n externa.

C贸mo funciona el codificador y c贸mo conectarlo a Arduino

c贸digo arduino

Aqu铆 est谩 el c贸digo para usar el codificador rotatorio para controlar con precisi贸n el servomotor. Cada vez que se gira la perilla un tope (clic), la posici贸n del brazo del servo cambia un grado.

// Include the Servo Library
#include <Servo.h>

// Rotary Encoder Inputs
#define CLK 2
#define DT 3

Servo servo;
int counter = 0;
int currentStateCLK;
int lastStateCLK;

void setup() {

	// Set encoder pins as inputs
	pinMode(CLK,INPUT);
	pinMode(DT,INPUT);
	
	// Setup Serial Monitor
	Serial.begin(9600);
	
	// Attach servo on pin 9 to the servo object
	servo.attach(9);
	servo.write(counter);
	
	// Read the initial state of CLK
	lastStateCLK = digitalRead(CLK);
}

void loop() {
        
	// Read the current state of CLK
	currentStateCLK = digitalRead(CLK);
	
	// If last and current state of CLK are different, then pulse occurred
	// React to only 1 state change to avoid double count
	if (currentStateCLK != lastStateCLK  && currentStateCLK == 1){
		
		// If the DT state is different than the CLK state then
		// the encoder is rotating CCW so decrement
		if (digitalRead(DT) != currentStateCLK) {
			counter --;
			if (counter<0)
				counter=0;
		} else {
			// Encoder is rotating CW so increment
			counter ++;
			if (counter>179)
				counter=179;
		}
		// Move the servo
		servo.write(counter);
		Serial.print("Position: ");
		Serial.println(counter);
	}
	
	// Remember last CLK state
	lastStateCLK = currentStateCLK;
}

Explicaci贸n del c贸digo:

Si comparas este boceto con nuestro primer boceto, notar谩s que son bastante similares con algunas excepciones.

Para comenzar, incluiremos la biblioteca de servos Arduino incorporada y crearemos un objeto Servo para representar nuestro servomotor.

#include <Servo.h>

Servo servo;

En la configuraci贸n, conectamos el objeto servo al pin 9 (al que est谩 conectado el pin de control del servomotor).

servo.attach(9);

En el bucle, limitamos el contador al rango de 0 a 179 porque los servomotores solo aceptan valores dentro de este rango.

if (digitalRead(DT) != currentStateCLK) {
    counter --;
    if (counter<0)
        counter=0;
} else {
    counter ++;
    if (counter>179)
        counter=179;
}

Finalmente, el valor del contador se utiliza para posicionar el servomotor.

servo.write(counter);


Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

C贸mo funciona el codificador rotativo y c贸mo conectarlo a Arduino

Estamos rodeados de codificadores rotativos sin siquiera darnos cuenta, ya que se utilizan en tantos elementos cotidianos, desde impresoras y c谩maras hasta m谩quinas CNC y robots. La aplicaci贸n m谩s com煤n de un codificador rotativo es la perilla de volumen de un radio de autom贸vil.

Tipos de codificadores rotativos

Un codificador rotativo es un tipo de sensor de posici贸n que convierte la posici贸n angular (rotaci贸n) de una perilla en una se帽al de salida que se puede utilizar para determinar en qu茅 direcci贸n se gira la perilla. Los codificadores rotativos se clasifican en dos tipos: absolutos e incrementales. El codificador absoluto informa la posici贸n exacta de la perilla en grados, mientras que el codificador incremental informa el n煤mero de incrementos que el eje se ha movido. El codificador rotativo utilizado en este tutorial es del tipo incremental.

Los codificadores rotativos son el equivalente digital moderno de los potenci贸metros y son m谩s vers谩tiles. Los codificadores rotativos pueden girar 360掳 sin detenerse, mientras que los potenci贸metros solo pueden girar 3/4 de c铆rculo. Los potenci贸metros se utilizan en situaciones donde se necesita conocer la posici贸n exacta de la perilla. Los codificadores rotativos, por otro lado, se utilizan en situaciones donde se necesita conocer el cambio de posici贸n en lugar de la posici贸n exacta.

驴C贸mo funcionan los codificadores rotativos?

En el interior del codificador hay un disco ranurado que est谩 conectado al pin C, la tierra com煤n. Tambi茅n tiene dos pines de contacto A y B. Cuando giras la perilla, A y B hacen contacto con el pin com煤n C en un orden espec铆fico dependiendo de la direcci贸n en la que gires la perilla.

Cuando hacen contacto con tierra com煤n, se generan dos se帽ales. Estas se帽ales est谩n desfasadas 90掳 porque un pin hace contacto con tierra com煤n antes que el otro, lo que se conoce como codificaci贸n en cuadratura.

Al monitorear cu谩ndo cada pin hace contacto o deja de hacer contacto con tierra, podemos determinar la direcci贸n en la que se gira la perilla. Esto se puede lograr simplemente observando el estado de B cuando el estado de A cambia.

La conexi贸n del codificador rotativo a Arduino se puede hacer de la siguiente manera:

  1. Conectar el pin +V del m贸dulo a la salida de 5V de Arduino y el pin GND a tierra.
  2. Conectar los pines CLK y DT a los pines digitales #2 y #3, respectivamente.
  3. Conectar el pin SW al pin digital #4.

Para ver ejemplos de c贸digos para leer codificadores rotativos con Arduino, puedes consultar el sitio oficial de Arduino para obtener m谩s informaci贸n.

2 comentarios en 芦C贸mo funciona el codificador y c贸mo conectarlo a Arduino禄

Deja un comentario