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