fbpixel
Etiquetas: , , ,
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

  • Computador
  • Arduino UNO
  • Cabo USB A Macho/B Macho
  • Codificador rotativo

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

  • Substituir um potenciômetro e um botão por um codificador rotativo numa interface
  • Sensor de posição ou velocidade

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.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?