



Módulo codificador rotativo de 360 graus KY-040 PARA ARDUINO Módulo Arduino
Módulo codificador rotativo Arduino KY-040
Tensão de trabalho: 5V
Número de pulsos por círculo: 20
O codificador rotativo pode contar o número de pulsos emitidos durante as rotações para frente e para trás. Ao contrário de um potenciômetro, a contagem de rotações é ilimitada. Com o botão no codificador rotativo, ele pode ser redefinido para o estado inicial, ou seja, de0Comece a contar.
princípio de trabalho:
Um encoder incremental é um sensor rotativo que converte deslocamento rotacional em uma série de sinais de pulso digitais. Esses pulsos são usados para controlar o deslocamento angular.EltraA conversão do deslocamento angular no codificador adota o princípio da varredura fotoelétrica. O sistema de leitura é baseado na rotação de um disco de indexação radial (disco de código) composto por janelas alternadas de transmissão de luz e janelas opacas, e é iluminado verticalmente por uma fonte de luz infravermelha. A luz projeta a imagem do disco de código na superfície do receptor. O receptor é coberto com uma grade de difração, que tem a mesma largura de janela que o disco de código. O trabalho do receptor é detectar as mudanças causadas pela rotação do disco e então converter as mudanças de luz em mudanças elétricas correspondentes. O sinal de baixo nível é então elevado a um nível mais alto e um pulso quadrado sem qualquer interferência é gerado, que é processado por um circuito eletrônico. O sistema de leitura geralmente adota um método diferencial, ou seja, duas formas de onda são iguais, mas com uma diferença de fase de180° sinais diferentes são comparados para garantir a qualidade e estabilidade do sinal de saída. A leitura é formada com base na diferença entre os dois sinais, eliminando assim a interferência.
Codificador incremental:

O codificador incremental fornece doisOndas quadradas de fase, sua diferença de fase é de 90°, geralmente chamadas de canal A e canal B. Um dos canais fornece informações relacionadas à velocidade e, ao mesmo tempo, a direção da rotação é obtida pela comparação sequencial dos dois sinais de canal. Há também um sinal especial chamado Z ou canal zero, que fornece a posição zero do codificador. Este sinal é uma onda quadrada que coincide com a linha da onda quadrada do canal A.

A precisão dos codificadores incrementais depende de dois fatores: fatores mecânicos e elétricos. Esses fatores são: erro de indexação da grade, excentricidade do disco, excentricidade do mancal, erros introduzidos pelo dispositivo de leitura eletrônica e inconsistências ópticas. A unidade de medida para determinar a precisão do codificador é graus elétricos. A precisão do codificador determina a indexação de pulso gerada pelo codificador. O seguinte usa 360° graus elétricos para representar a rotação do eixo mecânico, e a rotação do eixo é um ciclo completo. Para saber quantos ângulos mecânicos são equivalentes a 360 graus eletricamente, você pode usar a seguinte fórmula para calcular: Elétrico 360 = Mecânico 360°/n° pulsos/revolução

Figura: Sinais quando A e B estão trocando
O erro de indexação do codificador é expresso como o desvio máximo de duas ondas de pulso consecutivas em graus elétricos. Existem erros em qualquer codificador, que são causados pelos fatores acima. O erro máximo do codificador Eltra é de ±25 graus elétricos (sob quaisquer condições declaradas), o que é equivalente a um desvio de ±7% do valor nominal. Quanto aos dois canais com uma diferença de fase de 90° (eletricamente), o desvio máximo é de ±35 graus elétricos, o que é equivalente a um desvio de cerca de ±10% do valor nominal.
Codificador incremental de sinal UVW
Além dos codificadores tradicionais mencionados acima, também existem alguns codificadores incrementais integrados com outros sinais de saída elétrica. Um exemplo é um codificador incremental integrado com sinais UVW, que geralmente são usados para feedback de servo motores CA. Esses sinais magnéticos geralmente aparecem em servo motores CA, e os sinais UVW são geralmente projetados simulando a função de componentes magnéticos. Nos codificadores Eltra, esses sinais UVW são gerados opticamente e aparecem na forma de três ondas quadradas, que são deslocadas em 120° uma da outra. Para facilitar a partida do motor, o starter usado para controlar o motor requer esses sinais corretos. Esses pulsos magnéticos UVW podem ser repetidos muitas vezes na rotação do eixo mecânico porque dependem diretamente do número de ímãs do motor conectados e são usados para sinais UVW de 4, 6 ou mais motores.
CÓDIGO DE TESTE ARDUINO:
int pino vermelho = 2;
int pinoamarelo = 3;
int pinoverde = 4;
int aPin = 6;
int bPin = 7;
int botãoPin = 5;
int estado = 0;
int longPeriod = 5000; // Tempo em verde ou vermelho
int shortPeriod = 700; // Período de tempo ao alterar
int targetCount = Períodocurto;
contagem int = 0;
configuração nula()
{
pinMode(aPin, ENTRADA);
pinMode(bPin, ENTRADA);
pinMode(botãoPin, ENTRADA);
pinMode(redPin, SAÍDA);
pinMode(pinoamarelo, SAÍDA);
pinMode(pinoverde, SAÍDA);
}
loop vazio()
{
contar++;
se (digitalRead(buttonPin))
{
setLights(ALTO, ALTO, ALTO);
}
outro
{
int mudança = getEncoderTurn();
int novoPeríodo = longoPeríodo + (alteração * 1000);
se (novoPeríodo >= 1000 && novoPeríodo <= 10000)
{
longPeriod = novoPeríodo;
}
se (contagem > targetCount)
{
definirEstado();
contagem = 0;
}
}
atraso(1);
}
int obterEncoderTurn()
{
// retorna -1, 0 ou +1
int estático oldA = BAIXO;
int estático oldB = BAIXO;
int resultado = 0;
int novoA = digitalRead(aPin);
int novoB = digitalRead(bPin);
se (novoA != antigoA || novoB != antigoB)
{
// algo mudou
se (antigoA == BAIXO && novoA == ALTO)
{
resultado = -(oldB * 2 - 1);
}
}
antigoA = novoA;
antigoB = novoB;
retornar resultado;
}
int setState()
{
se (estado == 0)
{
setLights(ALTO, BAIXO, BAIXO);
targetCount = longoPeríodo;
estado = 1;
}
senão se (estado == 1)
{
setLights(ALTO, ALTO, BAIXO);
targetCount = Períodocurto;
estado = 2;
}
senão se (estado == 2)
{
setLights(BAIXO, BAIXO, ALTO);
targetCount = longoPeríodo;
estado = 3;
}
senão se (estado == 3)
{
setLights(BAIXO, ALTO, BAIXO);
targetCount = Períodocurto;
estado = 0;
}
}
void setLights(int vermelho, int amarelo, int verde)
{
digitalWrite(redPin, vermelho);
digitalWrite(yellowPin, amarelo);
digitalWrite(greenPin, verde);