El codificador rotativo es un sensor de rotación cuya dirección y ángulo puede ser conocido. De aspecto similar al potenciómetro, el codificador no tiene un recorrido límite y en lugar de devolver un valor de resistencia, como el potenciómetro, el codificador devuelve dos señales digitales que representan la dirección y la rotación.
Con el algoritmo apropiado, es posible recuperar el estado de estos dos contactores y encontrar su posición de nuevo. El codificador rotativo a veces se acopla con un pulsador que es útil cuando se quiere crear una interfaz.
Hardware
- Computadora
- Arduino UNO
- Cable USB A macho a B macho
- Codificador rotativo
Principio de funcionamiento
El codificador rotatorio está equipado con dos contactores, uno que se cierra o abre dependiendo de la dirección de rotación, y el otro que se abre y cierra cuando se gira el eje del codificador. Sabiendo esto, un codificador envía dos señales digitales (estado ARRIBA o ABAJO), una para recuperar la dirección y la otra para medir el ángulo de rotación. El número de cambios de estado en una revolución varía según la resolución del potenciómetro.
Esquema
Un sensor que devuelve una señal digital se conecta preferentemente a las entradas digitales del microcontrolador. El codificador rotativo tiene 3 pines de salida: uno para el pulsador (SW) y dos para la dirección (DT) y la detección de rotación (CLK).
Código
Para recuperar la información del codificador rotativo, tendremos que rastrear los cambios de estado de cada señal de salida del sensor y definir las variables y sus cambios en base a estas señales. Específicamente, el algoritmo detecta el cambio del husillo del estado ARRIBA al estado ABAJO. Entonces, detectamos la dirección de rotación comprobando si el eje DT está en el estado ARRIBA o ABAJO, si la dirección de rotación es en sentido contrario a las agujas del reloj la variable rotVal se disminuye, si no, se incrementa.
//Parameters const int clkPin = 2; const int dtPin = 4; const int swPin = 7; //Variables int rotVal = 0; bool clkState = LOW; bool clkLast = HIGH; bool swState = HIGH; bool swLast = HIGH; void setup() { //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); //Init Rotary pinMode(clkPin,INPUT); pinMode(dtPin,INPUT); pinMode(swPin,INPUT_PULLUP); } void loop() { readRotary(); } void readRotary( ) { /* function readRotary */ ////Test routine for Rotary // gestion position clkState = digitalRead(clkPin); if ((clkLast == LOW) && (clkState == HIGH)) {//rotary moving Serial.print("Rotary position "); if (digitalRead(dtPin) == HIGH) { rotVal = rotVal - 1; if ( rotVal < 0 ) { rotVal = 0; } } else { rotVal++; if ( rotVal > 10 ) { rotVal = 10; } } Serial.println(rotVal); delay(200); } clkLast = clkState; //gestion bouton swState = digitalRead(swPin); if (swState == LOW && swLast == HIGH) { Serial.println("Rotary pressed"); delay(100);//debounce } swLast = swState; }
Resultado
Se observa que la variable rotVal cambia cuando el codificador gira y se detecta correctamente la presión en el eje del codificador.
Solicitudes
- Sustituir un potenciómetro y un botón en una interfaz por un codificador rotativo
- Sensor de posición o velocidad
Fuentes
Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código
cuando compilo el programa, dice que no esta declarada la variable «rotPin»
Gracias por su comentario ¡Está arreglado!