Paso 2: Leer Rotary Encoders de cuadratura código
Quiero agregar algunos controles para poder cambiar los valores sobre la marcha como el número de pasos por octava y la nota MIDI. Así que he adquirido estos codificadores rotatorios de Bourns.
Encontré este blog de circuitos post sobre codificadores rotatorios de lectura útil, aunque me costó un poco seguir como alguien nuevo en el mundo de Arduino. Voy a intentar explicar más lejos algunos de los detalles a continuación.
El post menciona que los codificadores generan código de cuadratura. Copié el patrón de salida de código de cuadratura por encima de la hoja de datos para mis codificadores. Demuestra que al girar hacia la izquierda los Estados de la salida de señal AB repetidamente ciclo a 01, 00, 10 y 11. (El orden se invierte para hacia la izquierda.)
Entonces el código de la anterior referencia a post (fragmento abajo), en términos generales, lo que hace es 4 pedacitos relevantes en old_AB: el codificador anterior lectura (00, 10, 11 o 01) seguido por el codificador actual de lectura (también, 00, 10, 11 o 01). La matriz enc_states [] contiene tres posibles respuestas a lecturas de codificador: 0--no hay cambio, 1--incremento para CW y -1--decremento de izquierda.
/* returns change in encoder state (-1,0,1) */ int8_t read_encoder() { static int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0}; static uint8_t old_AB = 0; /**/ old_AB <<= 2; //remember previous state old_AB |= ( ENC_PORT & 0x03 ); //add current state return ( enc_states[( old_AB & 0x0f )]); }
Así, por ejemplo, si la lectura anterior era 00 y la lectura actual es 10, entonces (binarios) 0010 mapas enc_state [2] = 1, que significa incremento porque el codificador se movió hacia la derecha. Otro ejemplo, si la lectura anterior era 00 y la lectura actual es 11, entonces hay un error de lectura o un ruido por lo que se asigna a enc_state [B0011] = 0--no hay cambio. El lector puede trabajar las otras 14 combinaciones posibles de las lecturas anteriores y actuales para ver cómo se asignan a la [enc_states].