Site icon AranaCorp

Usar um codificador rotativo com o Arduino

4
(1)

O codificador rotativo é um sensor de rotação cuja direção e ângulo podem ser conhecidos. Sua aparência é similar à de um potenciômetro, porém, diferente deste, ao invés de devolver um valor de resistência, o codificador devolve dois sinais digitais representando direção e rotação.
Com o algoritmo apropriado, é possível obter o estado desses dois contactores e descobrir a sua posição. O codificador rotativo pode vir com um botão de pressão acoplado, que é útil para criar interfaces.

Material

Princípio de funcionamento

O codificador rotativo tem dois contactores, um que fecha ou abre de acordo com o sentido de rotação; outro que fecha ou abre quando giramos o eixo do codificador. Assim, um codificador envia dois sinais digitais (estado UP ou DOWN), sendo um para obter a direção e o outro para medir o ângulo de rotação. O número de mudanças de estado por revolução depende da resolução do potenciômetro.

Esquema

Um sensor que envia sinais digitais é ligado preferencialmente às entradas digitais do microcontrolador. O codificador rotativo tem 3 pinos de saída: um para o botão de pressão (SW) e dois para a direção (DT) e a detecção de rotação (CLK).

Código

Para obter as informações do codificador rotativo, acompanhamos as mudanças de estado de cada sinal de saída do sensor e definimos as variáveis e suas modificações conforme esses sinais. Mais precisamente, o algoritmo detecta quando o pino muda do estado UP para DOWN. Em seguida, detectamos o o sentido de rotação testando se o pino DT está no estado UP ou DOWN. Se a rotação for no sentido anti-horário, a variável rotVal é decrescente; no sentido horário, ela é crescente.

//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

Podemos observar a evolução da variável rotVal em função da rotação do codificador e detectar corretamente a pressão sobre o eixo do codificador.

Aplicações

Fontes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

How useful was this post?

Click on a star to rate it!

Average rating 4 / 5. Vote count: 1

No votes so far! Be the first to rate this post.

Exit mobile version