A forma de ler o valor de um encoder depende do tipo de encoder. Os métodos de leitura para encoders incrementais e absolutos são descritos abaixo.
Encoder Incremental
Os encoders incrementais fornecem dois canais de sinal de saída: Canal A e Canal B. Estes são sinais de pulso defasados em 90 graus elétricos um do outro. Ao detectar as mudanças de estado no Canal A e no Canal B, é possível determinar tanto a direção quanto o ângulo de rotação. Abaixo estão os passos básicos para ler um encoder incremental com um Arduino.
- Conecte o Canal A e o Canal B do encoder aos pinos com capacidade de interrupção no Arduino (por exemplo, pinos 2 e 3).
- Defina uma variável global no código do Arduino para armazenar a contagem do encoder.
- Escreva uma rotina de serviço de interrupção (ISR) para lidar com as mudanças de estado no Canal A e no Canal B. Nesta rotina, determine a direção de rotação comparando o estado atual de um canal com o estado anterior do outro e, em seguida, atualize a contagem do encoder de acordo.
volatile long encoderCount = 0;
int lastB = 0;
void encoderInterrupt() {
int A = digitalRead(2);
int B = digitalRead(3);
// Decodificação de quadratura simples: comparar A atual com B anterior
if (A == lastB) {
encoderCount++;
} else {
encoderCount--;
}
lastB = B;
}
- Na função
setup(), configure os modos dos pinos e anexe as interrupções para que a ISR seja acionada sempre que o estado do Canal A ou do Canal B mudar.
void setup() {
pinMode(2, INPUT);
pinMode(3, INPUT);
lastB = digitalRead(3);
attachInterrupt(digitalPinToInterrupt(2), encoderInterrupt, CHANGE);
attachInterrupt(digitalPinToInterrupt(3), encoderInterrupt, CHANGE);
}
- No
loop()principal, leia a variávelencoderCountpara obter a posição relativa e a direção de rotação do eixo do motor.
Nota: O exemplo acima utiliza uma abordagem simplificada de decodificação de quadratura. Para encoders de alta velocidade ou alta resolução, considere usar uma máquina de estados de quadratura completa ou uma biblioteca de interface de encoder dedicada para evitar contagens perdidas causadas por oscilação de sinal ou repique de contato.
Encoder Absoluto
Os encoders absolutos emitem um sinal digital que representa a posição absoluta do eixo do motor. O exemplo abaixo aplica-se especificamente a encoders absolutos com saída paralela, onde cada bit do valor de posição é apresentado em um fio de dados separado.
Nota: A maioria dos encoders absolutos industriais utiliza interfaces de comunicação serial como SSI, SPI ou RS-485 em vez de saídas paralelas. Essas interfaces requerem métodos de leitura diferentes e, em alguns casos, bibliotecas de protocolo dedicadas. Consulte sempre o datasheet do seu encoder para obter os detalhes corretos de interface e fiação.
- Conecte cada pino de dados do encoder a um pino de entrada digital no Arduino.
- Na função
setup(), defina cada pino de dados para o modo de entrada.
void setup() {
pinMode(dataPin1, INPUT);
pinMode(dataPin2, INPUT);
// ... Pinos de dados adicionais, dependendo do número de bits do encoder
}
- Escreva uma função para ler o valor do encoder. Nesta função, leia o estado de cada pino de dados usando
digitalRead()e combine os resultados em um único valor inteiro.
int readEncoder() {
int value = 0;
value |= digitalRead(dataPin1) << 0;
value |= digitalRead(dataPin2) << 1;
// ... Pinos de dados adicionais, dependendo do número de bits do encoder
return value;
}
- No
loop()principal, chame a funçãoreadEncoder()para obter a posição absoluta do eixo do motor.
Nota: Estes exemplos cobrem tipos básicos de encoders. Encoders em aplicações do mundo real podem exigir processamento mais avançado, como a implementação de debouncing de sinal ou o uso de um CI de interface de encoder dedicado. Consulte sempre o datasheet do encoder para garantir a fiação e o tratamento de sinal adequados.