Arduino Nano - Codificador rotatorio

Este tutorial explica cómo usar el codificador rotatorio con Arduino Nano. Esto es lo que cubriremos:

Hardware Requerido

1×Official Arduino Nano
1×Alternatively, DIYables ATMEGA328P Nano Development Board
1×Cable USB A a Mini-B
1×Codificador Rotatorio
1×Cables Puente
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para Arduino Nano
1×(Recomendado) Placa de Expansión Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentación para Arduino Nano

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgación: Algunos de los enlaces proporcionados en esta sección son enlaces de afiliado de Amazon. Podemos recibir una comisión por las compras realizadas a través de estos enlaces sin costo adicional para usted. Apreciamos su apoyo.

Acerca del codificador rotatorio

Una perilla giratoria llamada codificador rotatorio puede convertir giros en una señal. Muestra cuánto giró algo y dónde se encuentra. Hay dos tipos principales:

  • Codificador incremental: Utiliza señales rápidas para saber cuánto se movió algo.
  • Codificador absoluto: Este tipo proporciona un código único para cada posición, lo que ayuda a determinar exactamente dónde se encuentra algo, incluso si se corta la energía.

Esta guía trata por completo sobre el codificador incremental.

Pinout del módulo codificador rotatorio

diagrama de pines del codificador rotatorio

Un módulo codificador rotatorio tiene 4 pines:

  • Pin CLK (Salida A): es el pulso principal que nos indica cuánta rotación ha ocurrido. Cada vez que giras la perilla un detent (clic) en cualquiera de las direcciones, el pin CLK emite una señal que completa un ciclo completo (LOW HIGH LOW).
  • Pin DT (Salida B): funciona como el pin CLK pero emite una señal que queda rezagada respecto a la señal CLK en 90 grados. Nos ayuda a determinar la dirección de rotación (horaria o antihoraria).
  • Pin SW: es la salida del pulsador dentro del encoder. Normalmente está abierto. Si usamos una resistencia de pull-up en este pin, el pin SW estará en HIGH cuando la perilla no esté presionada y LOW cuando esté presionada.
  • Pin VCC (+): debe conectarse a VCC (entre 3,3 y 5 voltios).
  • Pin GND: debe conectarse a GND (0 V).

Codificador rotatorio vs Potenciómetro

Puede que confundas el codificador rotatorio con el potenciómetro, pero son piezas distintas. A continuación, una comparación entre ellos:

  • El codificador rotatorio puede considerarse la versión moderna de un potenciómetro, pero ofrece más capacidades.
  • El codificador rotatorio puede girar completamente sin detenerse, mientras que el potenciómetro solo puede girar aproximadamente tres cuartos de vuelta.
  • El codificador rotatorio emite pulsos, mientras que el potenciómetro produce una tensión analógica.
  • Cuando solo necesitas saber cuánto se ha movido la perilla sin determinar su posición exacta, el codificador rotatorio es conveniente. Por otro lado, el potenciómetro es valioso cuando necesitas conocer con precisión la posición de la perilla.

Cómo funciona un codificador rotatorio

salida del codificador rotatorio

Dentro del codificador, hay un disco con ranuras conectado a un pin llamado C, que actúa como tierra común. Hay dos pines más, A y B.

  • Cuando giras el mando, los pines A y B tocan el pin de tierra común C, pero en un orden específico dependiendo de hacia qué lado gires el mando (horario o antihorario).
  • Estos contactos crean dos señales. Tienen un pequeño desfase en el tiempo porque un pin toca la tierra antes que el otro. Las dos señales están desfasadas 90 grados entre sí. A esto se le llama codificación en cuadratura.
  • Cuando giras el mando en dirección horario, el pin A toca la tierra antes que el pin B. Cuando giras el mando en dirección antihoraria, el pin B toca la tierra antes que el pin A.
  • Observando cuándo cada pin toca o sale de la tierra, podemos deducir hacia qué dirección está girando el mando. Hacemos esto comprobando qué ocurre con el pin B cuando el pin A cambia.
Cómo funciona un codificador rotatorio

Cuando A cambia de estado de bajo a alto:

  • Si B está en estado bajo, la perilla se gira en sentido horario.
  • Si B está en estado alto, la perilla se gira en sentido antihorario.

※ Nota:

Los pines A y B están conectados a los pines CLK y DT. Sin embargo, dependiendo de los fabricantes, el orden puede ser diferente. Los códigos proporcionados a continuación han sido probados con el codificador rotatorio de DIYables.

Cómo programar para un codificador rotatorio

  • Verifica la señal del pin CLK
  • Si el estado cambia de BAJO a ALTO, verifica el estado del pin DT.
    • Si el estado del pin DT es ALTO, la perilla gira en sentido antihorario, incrementa el contador en 1
    • Si el estado del pin DT es BAJO, la perilla gira en sentido horario, disminuye el contador en 1

Diagrama de Cableado

Diagrama de cableado del codificador rotatorio Arduino Nano

This image is created using Fritzing. Click to enlarge image

Ver La mejor forma de alimentar Arduino Nano y otros componentes.

Código para Arduino Nano – codificador rotatorio

El código de Arduino Nano que se muestra a continuación hace lo siguiente:

  • Detecta la dirección y la cantidad de rotación del codificador.
    • Si detecta que la perilla ha girado un clic en dirección horaria, incremente el contador en uno.
    • Si detecta que la perilla ha girado un clic en dirección antihoraria, disminuya el contador en uno.
  • Detecta si el botón está presionado.
/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-rotary-encoder */ #include <ezButton.h> // The library to use for SW pin #define CLK_PIN 2 #define DT_PIN 3 #define SW_PIN 4 #define DIRECTION_CW 0 // clockwise direction #define DIRECTION_CCW 1 // anticlockwise direction int counter = 0; int direction = DIRECTION_CW; int CLK_state; int prev_CLK_state; ezButton button(SW_PIN); 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 anticlockwise 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("Twisted direction: "); if (direction == DIRECTION_CW) Serial.print("CLOCKWISE"); else Serial.print("ANTICLOCKWISE"); Serial.print(" - counter: "); Serial.println(counter); } // save last CLK state prev_CLK_state = CLK_state; if (button.isPressed()) { Serial.println("The button is pressed"); } }

Para simplificar el código del rebote del botón, se utiliza la biblioteca ezButton.

Pasos R\u00e1pidos

  • Instala la biblioteca ezButton en el IDE de Arduino. Ver Cómo
  • Copia el código anterior y ábrelo con el IDE de Arduino
  • Haz clic en el botón Subir en el IDE de Arduino para subir el código al Arduino Nano
  • Gira la perilla en sentido horario, y luego en sentido antihorario
  • Pulsa la perilla
  • Consulta el resultado en el Monitor Serial.
COM6
Send
Twisted direction: CLOCKWISE - counter: 1 Twisted direction: CLOCKWISE - counter: 2 Twisted direction: CLOCKWISE - counter: 3 Twisted direction: CLOCKWISE - counter: 4 Twisted direction: CLOCKWISE - counter: 5 Twisted direction: ANTICLOCKWISE - counter: 4 Twisted direction: ANTICLOCKWISE - counter: 3 Twisted direction: ANTICLOCKWISE - counter: 2 Twisted direction: ANTICLOCKWISE - counter: 1 Twisted direction: ANTICLOCKWISE - counter: 0 The button is pressed
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Explicación del código

Consulta los comentarios línea por línea en el código.

Código de Arduino Nano – Codificador rotatorio con interrupción

En el código del ejemplo anterior, usamos el método de sondeo, que verifica continuamente el estado del pin. Esto tiene dos desventajas:

  • Malgastar el recurso del Arduino Nano
  • Puede que se pierdan algunos contadores si otro código tarda mucho en ejecutarse.

Una forma de manejar esto es mediante interrupciones. Las interrupciones eliminan la necesidad de revisar constantemente un evento en particular. Esto permite que el Arduino Nano realice otras tareas sin pasar por alto un evento.

Aquí tienes un ejemplo de cómo leer un codificador rotatorio con interrupciones.

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-rotary-encoder */ #include <ezButton.h> // The library to use for SW pin #define CLK_PIN 2 // The Arduino Nano pin D2 connect to the pin CLK of the rotary encoder #define DT_PIN 3 // The Arduino Nano pin D3 connect to the pin DT of the rotary encoder #define SW_PIN 4 // The Arduino Nano pin D4 connect to the pin SW of the rotary encoder #define DIRECTION_CW 0 // clockwise direction #define DIRECTION_CCW 1 // anticlockwise direction volatile int counter = 0; volatile int direction = DIRECTION_CW; volatile unsigned long last_time; // for debouncing int prev_counter; ezButton button(SW_PIN); void INTERRUPT_handler() { if ((millis() - last_time) < 50) // debounce time is 10ms return; if (digitalRead(DT_PIN) == HIGH) { // The encoder is rotating in anticlockwise 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(); } 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 INTERRUPT_handler() when CLK pin changes from LOW to HIGH attachInterrupt(digitalPinToInterrupt(CLK_PIN), INTERRUPT_handler, RISING); } void loop() { button.loop(); // MUST call the loop() function first if (prev_counter != counter) { Serial.print("Twisted direction: "); if (direction == DIRECTION_CW) Serial.print("CLOCKWISE"); else Serial.print("ANTICLOCKWISE"); Serial.print(" - counter: "); Serial.println(counter); prev_counter = counter; } if (button.isPressed()) { Serial.println("The button is pressed"); } // TO DO: your other work here }

Ahora, a medida que giras la perilla, notarás que aparece información en el Monitor Serial, muy parecido a lo que viste en el código anterior.

※ Nota:

  • Si usas la interrupción, debes conectar el pin CLK del codificador a un pin del Arduino Nano que pueda manejar interrupciones. Pero recuerda, no todos los pines del Arduino Nano pueden hacer esto. Por ejemplo, en el Arduino Nano, solo los pines 2 y 3 pueden funcionar con interrupciones.
  • Podrías encontrarte con tutoriales en otros sitios web que usan dos interrupciones para un solo codificador, pero esto es innecesario y desperdicia recursos.
  • Es importante usar la palabra clave volatile para las variables globales utilizadas en la interrupción. Omitir esto podría provocar problemas inesperados.
  • Mantén el código dentro de la interrupción lo más sencillo posible. Evita usar Serial.print() o Serial.println() dentro de la interrupción.

Aplicación de codificador rotatorio para Arduino Nano

Con el codificador rotatorio, podemos realizar las siguientes aplicaciones, pero no nos limitamos a ellas:

  • Arduino Nano - El codificador rotatorio controla la posición del servomotor
  • Arduino Nano - El codificador rotatorio controla el brillo del LED
  • Arduino Nano - El codificador rotatorio controla la velocidad del motor paso a paso

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!