ESP8266 - Codificador rotatorio

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

Hardware Requerido

1×ESP8266 NodeMCU
1×Cable USB Tipo-A a Tipo-C (para PC USB-A)
1×Cable USB Tipo-C a Tipo-C (para PC USB-C)
1×Codificador Rotatorio
1×Cables Puente
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para ESP8266
1×(Recomendado) Divisor de Alimentación para ESP8266 Tipo-C

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 de Codificador Rotatorio

Un codificador rotatorio es un tipo de perilla que puede convertir el giro en una señal eléctrica. Te indica cuánto giro ha dado algo y en qué posición se encuentra. Hay dos tipos principales:

  • Codificador incremental: Este codificador incremental utiliza señales rápidas para medir cuánto se ha movido.
  • Codificador absoluto: Este tipo proporciona un código especial para cada posición, lo que ayuda a saber exactamente dónde se encuentra algo, incluso si se corta la energía.

Este tutorial se centra en el codificador incremental.

Pinout del módulo de codificador rotatorio

Disposición 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 tope (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): actúa como el pin CLK pero emite una señal que se retrasa respecto a la señal CLK en 90 grados. Nos ayuda a determinar la dirección de rotación (en sentido horario o antihorario).
  • Pin SW: es la salida del pulsador dentro del codificador. Normalmente está abierto. Si usamos una resistencia pull-up en este pin, el pin SW estará 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 (0V).

Codificador rotatorio vs potenciómetro

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

  • El codificador rotatorio es como la versión moderna de un potenciómetro, pero puede hacer más cosas.
  • El codificador rotatorio puede girar completamente en un círculo sin detenerse, mientras que el potenciómetro solo puede girar aproximadamente tres cuartos del círculo.
  • El codificador rotatorio emite pulsos, mientras que el potenciómetro emite la tensión analógica.
  • El codificador rotatorio es útil cuando solo necesitas saber cuánto se ha movido la perilla, no exactamente dónde está. El potenciómetro es útil cuando realmente necesitas saber exactamente dónde se encuentra 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 funciona como una tierra común. Hay dos pines más: A y B.

  • Cuando giras la perilla, los pines A y B tocan el pin de tierra común C, pero en un cierto orden dependiendo de hacia qué dirección giras la perilla (en sentido horario o antihorario).
  • Estos contactos generan dos señales. Tienen una ligera diferencia en el tiempo porque un pin toca la tierra antes que el otro. Dos señales están desincronizadas por 90 grados entre sí. A esto se le llama codificación en cuadratura.
  • Cuando giras la perilla en sentido horario, el pin A toca la tierra antes que el pin B. Cuando giras la perilla en dirección antihoraria, el pin B toca la tierra antes que el pin A.
  • Al monitorear cuándo cada pin toca o se despega de la tierra, podemos averiguar hacia qué dirección está girando la perilla. Hacemos esto comprobando qué sucede con el pin B cuando el pin A cambia.
Cómo funciona un codificador rotatorio

Cuando A cambia su estado de bajo a alto:

  • Si B está bajo, la perilla se gira en sentido horario.
  • Si B está 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 el 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 se gira en dirección antihoraria, incrementa el contador en 1
    • Si el estado del pin DT es BAJO, la perilla se gira en dirección horaria, disminuye el contador en 1

Diagrama de Cableado

Diagrama de cableado del codificador rotatorio ESP8266 NodeMCU

This image is created using Fritzing. Click to enlarge image

Para obtener m\u00e1s informaci\u00f3n, consulte Pines del ESP8266 y c\u00f3mo alimentar ESP8266 y otros componentes.

Código ESP8266 – Codificador rotatorio

El código ESP8266 que se muestra a continuación hace:

  • Detecta la dirección y la cantidad de rotación del codificador rotatorio.
    • Si se detecta que el mando se ha girado un clic en dirección horaria, aumenta el contador en uno.
    • Si se detecta que el mando se ha girado un clic en dirección antihoraria, disminuye el contador en uno.
  • Detecta si el botón está presionado.

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

/* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/esp8266-rotary-encoder */ #include <ezButton.h> // The library to use for SW pin #define CLK_PIN D7 // The ESP8266 pin D7 connected to the rotary encoder's CLK pin #define DT_PIN D6 // The ESP8266 pin D6 connected to the rotary encoder's DT pin #define SW_PIN D5 // The ESP8266 pin D5 connected to the rotary encoder's SW pin #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 for pin 7; 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("Rotary Encoder:: direction: "); if (direction == DIRECTION_CW) Serial.print("CLOCKWISE"); else Serial.print("ANTICLOCKWISE"); Serial.print(" - count: "); Serial.println(counter); } // save last CLK state prev_CLK_state = CLK_state; if (button.isPressed()) { Serial.println("The button is pressed"); } }

Pasos R\u00e1pidos

Para empezar con ESP8266 en el IDE de Arduino, siga estos pasos:

  • Consulta el tutorial cómo configurar el entorno para ESP8266 en Arduino IDE si es tu primera vez usando ESP8266.
  • Conecta los componentes tal como se muestran en el diagrama.
  • Conecta la placa ESP8266 a tu computadora usando un cable USB.
  • Abre Arduino IDE en tu computadora.
  • Elige la placa ESP8266 correcta, como (p. ej. NodeMCU 1.0 (ESP-12E Module)), y su puerto COM correspondiente.
  • Instala la biblioteca ezButton en Arduino IDE. Ver [Cómo] (https://arduinogetstarted.com/tutorials/arduino-button-library#content_how_to_install_library)
  • Copia el código anterior y ábrelo con Arduino IDE
  • Haz clic en el botón Subir en Arduino IDE para cargar el código al ESP8266
  • Gira la perilla en sentido horario, y luego en sentido antihorario
  • Presiona la perilla
  • Ver el resultado en el Monitor Serial.
COM6
Send
Rotary Encoder:: direction: CLOCKWISE - count: 1 Rotary Encoder:: direction: CLOCKWISE - count: 2 Rotary Encoder:: direction: CLOCKWISE - count: 3 Rotary Encoder:: direction: CLOCKWISE - count: 4 Rotary Encoder:: direction: CLOCKWISE - count: 5 Rotary Encoder:: direction: ANTICLOCKWISE - count: 4 Rotary Encoder:: direction: ANTICLOCKWISE - count: 3 Rotary Encoder:: direction: ANTICLOCKWISE - count: 2 Rotary Encoder:: direction: ANTICLOCKWISE - count: 1 Rotary Encoder:: direction: ANTICLOCKWISE - count: 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 ESP8266 – Codificador rotatorio con interrupción

En el código anterior, revisar repetidamente el estado del pin mediante sondeo puede desperdiciar recursos y podría no contar correctamente si otras tareas tardan mucho. Las interrupciones proporcionan una solución al evitar la verificación continua, permitiendo que el ESP8266 gestione distintas tareas sin perder ningún evento.

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

/* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/esp8266-rotary-encoder */ #include <ezButton.h> // The library to use for SW pin #define CLK_PIN D7 // The ESP8266 pin D7 connected to the rotary encoder's CLK pin #define DT_PIN D6 // The ESP8266 pin D6 connected to the rotary encoder's DT pin #define SW_PIN D5 // The ESP8266 pin D5 connected to the rotary encoder's SW pin #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 for pin 7; void ICACHE_RAM_ATTR INTERRUPT_handler() { 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(); } 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("Rotary Encoder:: direction: "); if (direction == DIRECTION_CW) Serial.print("CLOCKWISE"); else Serial.print("ANTICLOCKWISE"); Serial.print(" - count: "); Serial.println(counter); prev_counter = counter; } if (button.isPressed()) { Serial.println("The button is pressed"); } // TO DO: your other work here }

Ahora, al girar la perilla, notarás que aparece información en el Monitor Serial, similar a lo que viste en el código anterior.

※ Nota:

  • Podrías encontrar tutoriales en otros sitios web que usan dos interrupciones para un único codificador, pero esto es innecesario y derrochoso. Solo una interrupción es suficiente.
  • Es importante usar la palabra clave volatile para las variables globales que se utilizan en la interrupción. Omitir esto podría provocar problemas inesperados.
  • Mantén el código dentro de la interrupción lo más simple posible. Evita usar Serial.print() o Serial.println() dentro de la interrupción.

ESP8266 Aplicación de Codificador Rotatorio

Con el codificador rotatorio, podemos realizar las siguientes aplicaciones, pero no se limitan a:

  • ESP8266 - El codificador rotatorio controla la posición del motor servo
  • ESP8266 - El codificador rotatorio controla el brillo del LED
  • ESP8266 - 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!