Icono del sitio AranaCorp

Uso de un codificador rotativo con Arduino

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

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

Fuentes

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código

Salir de la versión móvil