Minha primeira ideia de interface para o "ATmega Detonator" era bem minimalística: vários LEDs e um botão para ir selecionando sequencialmente as opções. Mais adiante resolvi usar um display I2C e apresentar menus nele. Para selecionar as opções vou um "rotary encoder", inspirado por um vídeo onde ele é usado junto com um display do mesmo modelo que vou usar.
Existe muita informação na internet sobre os "rotary encoders" (listo no final as que usei), portanto vou tentar ser sucinto.
A aparência externa de um "rotary encoder" é parecida com um potenciômetro, mas internamente são totalmente diferentes. O potenciômetro é um resistor cuja resistência varia de 0 a um máximo com o ângulo; normalmente o ângulo é limitado a algo como 270 graus. Ele é apropriado para determinar a posição do eixo.
O "rotary encoder" tem por objetivo indicar a velocidade e a direção da movimentação do eixo, sem se preocupar com a posição. A forma como ele faz isso é bem engenhosa. Mecanicamente temos dois contatos (A e B) que, com o movimento, serão ligados ou desligados a um terminal comum (normalmente ligado a terra):
Fonte: Wikipedia (criado por Matt Hercules) |
A ordem com que os contatos são ligados indica a direção do movimento, a velocidade da mudança de cada sinal indica a velocidade da rotação.
Sinais reais. Esquerda rodando no sentido horário e direita rodando no anti-horário |
As estratégias usuais para ler o "rotary encoder" são:
- Monitoração contínua: ficar olhando o tempo todo os sinais (via digitalRead) e detectar as transições. É preciso implementar um "debounce" para ignorar as oscilações. O problema desta opção é que dificulta fazer outras coisas ao mesmo tempo.
- Interrupção:usar o recurso de interrupção para detectar as mudanças em um ou ambos sinais. Isto simplifica fazer outras coisas ao mesmo tempo, mas no Arduino Uno temos somente dois pinos com interrupção e o "debounce" pode ser um pouco mais complicado.
- Monitorar periodicamente: usar a interrupção de tempo para amostrar os sinais. O próprio tempo entre amostragens pode funcionar como debounce. O problema aqui é que um tempo grande entre amostragens pode resultar na perda de mudanças quando o eixo é girado rapidamente.
Montagem para teste |
Como o programa ficou longo não vou listar ele aqui mas ele pode ser visto no github.
Para usar no ATmega Detonator vou dar mais uma "polida" nestas rotinas, o objetivo aqui foi só confirmar que funcionava como precisava. Outra mudança, que veremos no próximo post, é usar um tamanho de letra maior para ficar mais fácil de ler.
Links:
https://rudysarduinoprojects.wordpress.com/2019/04/05/fun-with-arduino-25-rotary-encoder-with-switch/
https://lastminuteengineers.com/rotary-encoder-arduino-tutorial/
http://practicalusage.com/arduino-using-a-rotary-encoder/
Nenhum comentário:
Postar um comentário