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