Tabla de contenido:

Codificador rotatorio - Entenderlo y usarlo (Arduino / otro ΜController): 3 pasos
Codificador rotatorio - Entenderlo y usarlo (Arduino / otro ΜController): 3 pasos

Video: Codificador rotatorio - Entenderlo y usarlo (Arduino / otro ΜController): 3 pasos

Video: Codificador rotatorio - Entenderlo y usarlo (Arduino / otro ΜController): 3 pasos
Video: Arduino desde cero en Español - Capítulo 22 - Codificador rotatorio KY-040 (rotary encoder) 2024, Mes de julio
Anonim
Codificador rotatorio - Entenderlo y usarlo (Arduino / otro ΜController)
Codificador rotatorio - Entenderlo y usarlo (Arduino / otro ΜController)

Un codificador rotatorio es un dispositivo electromecánico que convierte el movimiento rotatorio en información digital o analógica. Puede girar en sentido horario o antihorario. Hay dos tipos de codificadores rotativos: codificadores absolutos y relativos (incrementales).

Mientras que un codificador absoluto genera un valor proporcional al ángulo actual del eje, un codificador incremental genera el paso del eje y su dirección (en este caso tenemos un codificador incremental).

Los codificadores giratorios se están volviendo más populares porque puede utilizar dos funciones en un módulo eléctrico: un interruptor simple para confirmar las operaciones y el codificador giratorio para navegar, p. Ej. a través de un menú.

Un codificador rotatorio incremental genera dos señales de salida mientras su eje está girando. Dependiendo de la dirección, una de las señales adelanta a la otra. (vea abajo)

Paso 1: comprensión de los datos de salida

Comprensión de los datos de salida
Comprensión de los datos de salida

Como puede ver, cuando el eje del codificador comienza a girar en el sentido de las agujas del reloj, la salida A cae primero a LOW y la salida B le sigue. En sentido contrario a las agujas del reloj, la operación gira en sentido contrario.

Ahora solo tenemos que implementar esto en nuestro µController (usé un Arduino Nano).

Paso 2: construye el circuito

Construye el circuito
Construye el circuito
Construye el circuito
Construye el circuito

Como describí antes, las salidas crean un flanco ALTO y uno BAJO. Para obtener un ALTO limpio en los pines de datos A y B del µController, tenemos que agregar resistencias Pull-Up. El pin C común va directo a tierra para el flanco BAJO.

Para obtener información sobre el interruptor interno (pulsador) usaremos los otros dos pines. Uno de ellos va a VCC y el otro a un Pin de datos del µController. También tenemos que agregar una resistencia desplegable al pin de datos para obtener un BAJO limpio.

¡También es posible utilizar resistencias Pull-Up y Pull-Down internas de su µController!

En mi caso, el pinout se ve así:

  • +3, 3V => +3, 3V (Arduino) (también es posible + 5V)
  • GND => GND (Arduino)
  • A => Pin10
  • B =>

    Alfiler

    11

  • C => TIERRA
  • SW =>

    Alfiler

    12

Paso 3: escribir el código

int pinA = 10; // interruptor interno A int pinB = 11; // interruptor interno B int pinSW = 12; // cambiar (codificador pulsado) int encoderPosCount = 0; // comienza en cero, cambia si quieres

int positionval;

bool switchval; int mrotateLast; int mrotate;

configuración vacía () {

int mrotateLast = digitalRead (pinA); Serial.begin (9600); retraso (50); }

bucle vacío () {codificador de lectura (); if (readswitch () == 1) {Serial.println ("Switch = 1"); }}

int readencoder () {

mrotate = digitalRead (pinA); if (mrotate! = mrotateLast) {// la perilla está girando if (digitalRead (pinB)! = mrotate) {// el interruptor A cambió primero -> girando en el sentido de las agujas del reloj encoderPosCount ++; Serial.println ("girado en el sentido de las agujas del reloj"); } else {// el interruptor B cambió primero -> girando en sentido antihorario encoderPosCount--; Serial.println ("girado en sentido antihorario"); }

Serial.print ("Posición del codificador:"); Serial.println (encoderPosCount); Serial.println (""); } mrotateLast = mrotate; return encoderPosCount; } bool readswitch () {

if (digitalRead (pinSW)! = 0) {// se presiona el interruptor

while (digitalRead (pinSW)! = 0) {} // el interruptor está actualmente presionado switchval = 1; } else {switchval = 0;} // switch está sin presionar return switchval; }

Ahora puede girar el codificador y la variable codificador PosCount contará hacia arriba si gira en el sentido de las agujas del reloj y contará hacia atrás si gira en el sentido contrario a las agujas del reloj.

¡Eso es todo! Simple y útil.

Siéntase libre de cambiar y ejecutar el código. Puedes implementarlo en tu proyecto.

También subiré un proyecto de LED donde usé el codificador para configurar el brillo de mis LED.

Recomendado: