Vídeo: Decodificador rotativo simples: 4 etapas
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
Este instrutível descreve um método simples de decodificar um codificador rotativo sequencial usando um Arduino Uno R3.
As rotinas de software compactas são usadas para contar o número de transições, eliminar o salto do contato e determinar a direção da rotação. Componentes adicionais e tabelas de pesquisa não são necessários.
Versões de interrupção e não interrupção do código são fornecidas.
A versão de interrupção do código requer apenas um único pino de interrupção.
Imagens:
- A foto de abertura mostra o codificador montado.
- A captura de tela mostra o código para a versão de interrupção e a contagem quando o eixo do codificador é girado no sentido horário e anti-horário.
- O vídeo mostra a contagem durante a rotação rápida.
Etapa 1: Diagrama de Circuito
O diagrama de fiação do codificador é mostrado na fig.1.
Os fios do jumper são soldados diretamente aos pinos do codificador.
Troque os dois fios azuis se a direção da contagem for invertida.
Etapa 2: Lista de peças
As seguintes partes foram obtidas em
- 1 apenas Arduino UNO R3 com cabo USB.
- 1 apenas codificador rotativo sequencial (EC11 ou equivalente) com interruptor.
- 1 botão apenas para se adequar ao eixo.
- 3 fios de jumper macho para macho Arduino apenas.
Etapa 3: Teoria
Os codificadores rotativos sequenciais geram duas ondas quadradas, cada uma delas deslocada em 90 graus, conforme mostrado na Fig.1.
Os padrões lógicos no contato A e no contato B são diferentes quando o eixo é girado no sentido horário (CW) e anti-horário (CCW) nas posições 1 a 6.
Métodos comuns para determinar a direção de rotação incluem:
- hardware
- interrupções gêmeas
- tabelas de pesquisa de padrões
Este projeto usa um método de software que não requer tabelas de pesquisa. [1]
Direção
Em vez de olhar para os padrões de saída do contato A e do contato B, vamos nos concentrar no contato A.
Se amostrarmos o Contato B após cada transição do Contato A, notaremos que:
- O contato A e o contato B têm estados lógicos opostos quando o encoder é girado no sentido horário
- O contato A e o contato B têm o mesmo estado lógico quando o encoder é girado no sentido anti-horário
Código real:
// ----- Transições de contagem
CurrentStateA = stateContactA (); if (CurrentStateA! = LastStateA) {CurrentStateB = digitalRead (ContactB); if (CurrentStateA == CurrentStateB) Contagem ++; if (CurrentStateA! = CurrentStateB) Count--; LastStateA = CurrentStateA; }
Este método oferece as seguintes vantagens:
- tabelas de pesquisa não são necessárias
- apenas uma única linha de interrupção é necessária
Debounce
Todos os codificadores mecânicos sofrem de “ressalto de contato”.
Se um contato da chave não abrir / quebrar corretamente, seu estado lógico oscilará rapidamente de ALTO para BAIXO até que o contato da chave se estabilize. Isso resulta em contagens falsas.
Um método para suprimir o salto do contato é adicionar um pequeno capacitor em cada contato da chave. O capacitor e o resistor pull-up associado formam um integrador que efetivamente causa um curto-circuito nas altas frequências e permite que a tensão da chave aumente / diminua graciosamente.
A desvantagem dessa abordagem é que as transições podem ser perdidas se o eixo do codificador for girado rapidamente.
Debouncing de software
Este método usa dois contadores (aberto, fechado) que foram definidos como zero. [2]
Assim que uma transição for detectada no contato A:
- Pesquisar continuamente o contato A.
- Incremente o contador Aberto e zere o contador Fechado sempre que o Contato A estiver ALTO.
- Incremente o contador Fechado e zere o contador Aberto sempre que o Contato A estiver BAIXO.
- Saia do loop quando um dos contadores atingir uma contagem predeterminada. Estamos efetivamente procurando o período de estado estacionário após qualquer salto de contato.
Código real:
// ----- Debounce Contact A
while (1) {if (digitalRead (ContactA)) {// ----- ContactA está aberto Fechado = 0; // Integrador oposto vazio Open ++; // Integrar if (Abrir> MaxCount) return HIGH; } else {// ----- ContactA está fechado Open = 0; // Integrador oposto vazio Closed ++; // Integrar if (Fechado> MaxCount) return LOW; }}
Não há necessidade de eliminar o contato B, pois as transições do contato A e do contato B não coincidem.
Contando
Um “detentor” mecânico efetivamente duplica sua contagem, já que duas contagens são registradas entre os cliques (consulte a fig. 1).
O número de "detenções" pode ser determinado usando aritmética do módulo 2, conforme mostrado abaixo.
Código real:
// ----- Contar "detenções"
if (Contagem% 2 == 0) {Serial.print ("Contagem:"); Serial.println (contagem / 2); }
Referências
Mais informações podem ser encontradas em:
[1]
howtomechatronics.com/tutorials/arduino/ro…
[2]
newbiehack.com/ButtonorSwitchDebounceinSof…
Etapa 4: Software
Este projeto requer uma versão recente do IDE Ardino Uno R3 (ambiente de desenvolvimento integrado) que está disponível em
Baixe cada um dos dois esboços do Arduino a seguir (em anexo)
- rotary_encoder_1.ino (versão de votação)
- rotary_encoder_2.no (versão de interrupção)
Clique duas vezes em sua versão preferida e siga as instruções na tela.
Aproveitar …
Clique aqui para ver meus outros instructables.