Arduino UNO R4 - Codificador rotatorio

En esta guía, aprenderemos a usar un codificador incremental con Arduino UNO R4. Cubriremos:

Codificador rotatorio Arduino UNO R4

Acerca del codificador rotatorio

Un codificador rotatorio es un dispositivo que convierte el movimiento de giro en una señal eléctrica. Detecta el giro y la posición de un eje o de una perilla. Hay dos tipos principales:

  • Codificador incremental: Esto genera pulsos para medir cambios en la posición.
  • Codificador absoluto: Esto proporciona un código digital especial para cada posición, lo que lo hace perfecto para un posicionamiento preciso, incluso si se interrumpe la alimentación.

Este tutorial trata sobre el codificador incremental.

Pinout del módulo del codificador rotatorio

Pinout del codificador rotatorio

Un módulo de codificador rotatorio viene con cuatro pines:

  • Pin CLK (Salida A): Este pin envía una señal cada vez que giras la perilla un clic en cualquier dirección, mostrando un ciclo completo de la señal de BAJO a ALTO a BAJO. Esto nos indica cuánto se ha girado la perilla.
  • Pin DT (Salida B): Similar al pin CLK, pero la señal de este pin se retrasa ligeramente, ocurriendo 90 grados después de la señal CLK. Este retardo nos ayuda a determinar si la rotación es en sentido horario o antihorario.
  • Pin SW: Este se conecta al pulsador interno del codificador, que suele estar abierto. Usar una resistencia pull-up en este pin significa que mostrará HIGH cuando la perilla no esté presionada y LOW cuando lo esté presionada.
  • Pin VCC (+): Conecta este pin a una fuente de alimentación que proporcione entre 3,3 y 5 voltios.
  • Pin GND: Conecta este pin a la tierra (0 V).

Codificador rotatorio frente a potenciómetro

Podrías confundir el codificador rotatorio con el potenciómetro, pero son piezas diferentes. Así es como se comparan:

  • Un codificador rotatorio puede girar completamente de forma continua, pero un potenciómetro solo puede girar tres cuartos de vuelta.
  • Un codificador rotatorio emite pulsos, mientras que un potenciómetro genera una tensión analógica.
  • Un codificador rotatorio es útil para saber cuánto se ha girado una perilla, pero no su posición exacta. Un potenciómetro es bueno para conocer la posición precisa de una perilla.

Cómo funciona un codificador rotatorio

salida del codificador rotatorio

En el codificador, hay un disco con ranuras conectado a un pin llamado C, que actúa como tierra común. También hay dos pines adicionales, A y B.

  • Cuando giras la perilla, los pines A y B hacen contacto con el pin de tierra común C, pero en una secuencia específica según la dirección de la rotación, ya sea en sentido horario o antihorario.
  • Este contacto genera dos señales que difieren ligeramente en su temporización porque un pin se conecta a la tierra antes que el otro. Estas señales están desfasadas por 90 grados, y a esto se le llama codificación en cuadratura.
  • Girar la perilla en sentido horario hace que el pin A entre en contacto con la tierra antes que el pin B. Girarla en sentido antihorario hace que el pin B entre en contacto con la tierra antes que el pin A.
  • Observando cuándo cada pin establece o interrumpe el contacto con la tierra, podemos determinar la dirección de la rotación de la perilla. Hacemos esto analizando los cambios de pin B en relación con el pin A.
Cómo funciona un codificador rotatorio

Cuando A cambia de bajo a alto:

  • Gira la perilla en sentido horario si B está en nivel bajo.
  • Gira la perilla en sentido antihorario si B está en nivel alto.

※ Nota:

Los pines A y B están conectados a los pines CLK y DT. La disposición puede variar según el fabricante. Los códigos que se dan aquí han sido probados con el encoder rotatorio de DIYables.

Cómo programar para un codificador rotatorio

  • Verifica la señal del pin CLK.
  • Cuando la señal cambia de BAJO a ALTO, verifica qué muestra el pin DT.
    • Si el pin DT muestra ALTO, la perilla se gira en sentido antihorario. Suma 1 al contador.
    • Si el pin DT muestra BAJO, la perilla se gira en sentido horario. Resta 1 al contador.

Diagrama de Cableado

Diagrama de cableado del codificador rotatorio Arduino UNO R4

This image is created using Fritzing. Click to enlarge image

Ver La mejor forma de alimentar Arduino Uno R4 y otros componentes.

Código Arduino UNO R4 – Codificador rotatorio sin interrupciones

Este código para Arduino UNO R4 realiza las siguientes acciones:

  • Detecta cómo y cuánto gira el codificador.
    • Si detecta que la perilla se ha girado un clic hacia la derecha, aumenta el contador en uno.
    • Si detecta que la perilla se ha girado un clic hacia la izquierda, disminuye el contador en uno.
  • Detecta si se pulsa el botón.
/* * Este código de Arduino UNO R4 fue desarrollado por es.newbiely.com * Este código de Arduino UNO R4 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-rotary-encoder */ #include <ezButton.h> // the library to use for SW pin #define CLK_PIN 2 // The Arduino UNO R4 pin connected to the CLK pin of encoder #define DT_PIN 3 // The Arduino UNO R4 pin connected to the DT pin of encoder #define SW_PIN 4 // The Arduino UNO R4 pin connected to the SW pin of encoder #define DIRECTION_CW 0 // clockwise direction #define DIRECTION_CCW 1 // counter-clockwise direction int counter = 0; int direction = DIRECTION_CW; int CLK_state; int prev_CLK_state; ezButton button(SW_PIN); // create ezButton object that attach to pin 4 void setup() { Serial.begin(9600); // configure encoder pins as inputs pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); // set debounce time to 50 milliseconds // read the initial state of the rotary encoder's CLK pin prev_CLK_state = digitalRead(CLK_PIN); } void loop() { button.loop(); // MUST call the loop() function first // read the current state of the rotary encoder's CLK pin CLK_state = digitalRead(CLK_PIN); // If the state of CLK is changed, then pulse occurred // React to only the rising edge (from LOW to HIGH) to avoid double count if (CLK_state != prev_CLK_state && CLK_state == HIGH) { // if the DT state is HIGH // the encoder is rotating in counter-clockwise direction => decrease the counter if (digitalRead(DT_PIN) == HIGH) { counter--; direction = DIRECTION_CCW; } else { // the encoder is rotating in clockwise direction => increase the counter counter++; direction = DIRECTION_CW; } Serial.print("DIRECTION: "); if (direction == DIRECTION_CW) Serial.print("Clockwise"); else Serial.print("Counter-clockwise"); Serial.print(" | COUNTER: "); Serial.println(counter); } // save last CLK state prev_CLK_state = CLK_state; if (button.isPressed()) { Serial.println("The button is pressed"); } }

Usamos la biblioteca ezButton para simplificar el código de rebote del botón.

Pasos R\u00e1pidos

Sigue estas instrucciones paso a paso:

  • Si es la primera vez que usas Arduino Uno R4 WiFi/Minima, consulta el tutorial sobre configurar el entorno para Arduino Uno R4 WiFi/Minima en el IDE de Arduino.
  • Conecta el encoder giratorio a la Arduino UNO R4 según el diagrama proporcionado.
  • Conecta la placa Arduino Uno R4 a tu computadora usando un cable USB.
  • Inicia el IDE de Arduino en tu computadora.
  • Selecciona la placa Arduino Uno R4 adecuada (p. ej., Arduino Uno R4 WiFi) y el puerto COM.
  • Agrega la librería ezButton al IDE de Arduino. Para instrucciones, visita este enlace: [librería ezButton](https://arduinogetstarted.com/tutorials/arduino-button-library#content_how_to_install
  • Copia el código proporcionado y ábrelo en el IDE de Arduino.
  • Haz clic en el botón Subir en el IDE de Arduino para cargar el código en la placa Arduino UNO R4.
  • Gira la perilla en sentido horario y luego en sentido antihorario.
  • Pulsa la perilla.
  • Verifica los resultados en el Monitor Serial.
COM6
Send
DIRECTION: Clockwise | COUNTER: 1 DIRECTION: Clockwise | COUNTER: 2 DIRECTION: Clockwise | COUNTER: 3 DIRECTION: Clockwise | COUNTER: 4 DIRECTION: Clockwise | COUNTER: 5 DIRECTION: Counter-clockwise | COUNTER: 4 DIRECTION: Counter-clockwise | COUNTER: 3 DIRECTION: Counter-clockwise | COUNTER: 2 DIRECTION: Counter-clockwise | COUNTER: 1 DIRECTION: Counter-clockwise | COUNTER: 0 The button is pressed
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Explicación del código

Mira los comentarios en el código para cada línea.

Código de Arduino UNO R4 – Codificador rotatorio con interrupción

En el ejemplo de código anterior, usamos el método de sondeo, que continúa comprobando el estado del pin. Este método tiene dos desventajas:

  • Utiliza los recursos del Arduino UNO R4 de forma ineficiente
  • Algunos conteos pueden omitirse si otro código tarda demasiado en ejecutarse.

Un método para controlar esto es mediante interrupciones. Las interrupciones ayudan a evitar la necesidad constante de comprobar un evento específico. Esto permite que el Arduino UNO R4 realice otras tareas mientras continúa monitoreando eventos.

Veamos el código a continuación que usa una interrupción para leer el valor del codificador.

/* * Este código de Arduino UNO R4 fue desarrollado por es.newbiely.com * Este código de Arduino UNO R4 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-rotary-encoder */ #include <ezButton.h> // the library to use for SW pin #define CLK_PIN 2 // The Arduino UNO R4 pin connected to the CLK pin of encoder #define DT_PIN 3 // The Arduino UNO R4 pin connected to the DT pin of encoder #define SW_PIN 4 // The Arduino UNO R4 pin connected to the SW pin of encoder #define DIRECTION_CW 0 // clockwise direction #define DIRECTION_CCW 1 // counter-clockwise direction volatile int counter = 0; volatile int direction = DIRECTION_CW; volatile unsigned long last_time; // for debouncing int prev_counter; ezButton button(SW_PIN); // create ezButton object that attach to pin 4 void setup() { Serial.begin(9600); // configure encoder pins as inputs pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); // set debounce time to 50 milliseconds // use interrupt for CLK pin is enough // call ISR_encoderChange() when CLK pin changes from LOW to HIGH attachInterrupt(digitalPinToInterrupt(CLK_PIN), ISR_encoderChange, RISING); } void loop() { button.loop(); // MUST call the loop() function first if (prev_counter != counter) { Serial.print("DIRECTION: "); if (direction == DIRECTION_CW) Serial.print("Clockwise"); else Serial.print("Counter-clockwise"); Serial.print(" | COUNTER: "); Serial.println(counter); prev_counter = counter; } if (button.isPressed()) { Serial.println("The button is pressed"); } // TO DO: your other work here } void ISR_encoderChange() { if ((millis() - last_time) < 50) // debounce time is 50ms return; if (digitalRead(DT_PIN) == HIGH) { // the encoder is rotating in counter-clockwise direction => decrease the counter counter--; direction = DIRECTION_CCW; } else { // the encoder is rotating in clockwise direction => increase the counter counter++; direction = DIRECTION_CW; } last_time = millis(); }
  • Copia el código proporcionado y ábrelo en el IDE de Arduino.
  • Haz clic en el botón Subir en el IDE de Arduino para cargar el código en el Arduino UNO R4.

Ahora, al girar la perilla, verás que la información se muestra en el Monitor Serial, similar a lo que observaste antes en el código anterior.

※ Nota:

  • Para conectar el pin CLK del codificador al Arduino UNO R4 usando una interrupción, debes usar los pines 2 o 3. Estos son los únicos pines que soportan interrupciones.
  • Algunas guías en línea podrían sugerir usar dos interrupciones para un codificador, pero no es necesario. Usar solo una interrupción es suficiente.
  • Asegúrate de usar la palabra clave volatile para cualquier variable global en la interrupción para evitar problemas.
  • Mantén la programación dentro de la interrupción simple. No uses Serial.print() ni Serial.println() allí.

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

Referencias de Funciones

Tutoriales Relacionados

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!