fbpixel
Etiquetas: , , ,
4.5
(10)

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

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

Promedio de puntuación 4.5 / 5. Recuento de votos: 10

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en los medios sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?