Codificador rotativo I2C
Colocado sobreCodificador Rotativo I²C
Vou cobrir dois tópicos neste artigo.
A primeira é sobre Rotary Encoders e (brevemente) como eles funcionam. A segunda trata do protocolo Inter-Integrated Circuit (I²C) desenvolvido pela Philips.
codificadores rotativos
Um Rotary Encoder é um dispositivo que (fisicamente) se assemelha a um potenciômetro, mas não varia a resistência entre dois/três conectores, mas em vez disso dá pulsos quando o eixo é girado. Outra diferença com o potenciômetro é que você pode girar o eixo em 360° (na verdade, não há limite para quantos graus você pode girar o eixo).
A maioria dos codificadores rotativos possui um botão de pressão que é ativado quando você pressiona o eixo. E existem codificadores rotativos que possuem um LED interno de três cores (o chamado codificador rotativo RGB) com o qual você pode fornecer feedback a um usuário com uma paleta de cores.
O Rotary Encoder gera pulsos quando o eixo é girado. A maioria dos Rotary Encoders gera 24 pulsos a cada rotação de 360°, mas também existem Rotary Encoders que fornecem mais ou menos pulsos por revolução. Em seu programa, você pode contar esses pulsos e reagir a eles (por exemplo: aumentar ou diminuir a tensão de saída de uma fonte de alimentação ou percorrer uma lista de menu).
Você pode perguntar: " por que usar um Rotary Encoder e não apenas um potenciômetro? ". Claro que não existe uma resposta " isto é melhor do que aquilo". Depende do projeto. Se você estiver construindo um amplificador hi-fi analógico, o potenciômetro é provavelmente a melhor escolha. Se você tem um projeto com um microprocessador, o Rotary Encoder oferece muitas opções para criar uma interface de usuário agradável (talvez com uma mudança fina/grossa, dependendo do toque curto ou longo no eixo e um feedback colorido para mostrar qual modo ativo) .
Abaixo está um esboço de exemplo para “ler” um Rotary Encoder. Para que este programa funcione corretamente e de forma confiável, você precisa de controle de rejeição de hardware (rede RC) nos pinos A e B do codificador:
Demo Sketch Rotary Encoder
Infelizmente, usar um Rotary Encoder em um projeto também tem uma desvantagem: você precisa de muitos pinos GPIO!
Um RGB Rotary Encoder precisa de dois pinos GPIO para o próprio codificador (mais GND), então você precisa de um pino GPIO para o interruptor de pressão e três pinos GPIO para o LED RGB. Isso é um total de seis pinos GPIO! Em um ESP8266, por exemplo, você tem apenas três pinos GPIO sobrando para controlar o resto do seu projeto! Em um Arduino UNO você tem mais pinos GPIO, então um Rotary Encoder não será um problema. Mas e se você quiser conectar dois, três ou até mais codificadores rotativos? Isso não é possível em um ESP8266, mas em um Arduino UNO você logo ficará sem pinos GPIO!
Felizmente, há uma solução!
O barramento de circuito integrado (I²C)
Isso é chamado de "barramento" (dados) porque você pode conectar muitos dispositivos a ele. O "ônibus" consiste em duas linhas. Uma linha de relógio (SCL) e uma linha de dados (SDA). Há sempre (pelo menos) um'mestre'-dispositivo e todos os outros dispositivos são 'escravo' dispositivos. Cada dispositivo tem um endereço único para se distinguir um do outro. Não vou me aprofundar no protocolo I²C, mas normalmente o mestre reivindicará o controle do barramento e enviará uma solicitação a um escravo com um endereço específico. O escravo, por sua vez, realizará uma ação sobre a solicitação, seja executando uma ação específica no próprio escravo, enviando dados de volta ao mestre, ou simplesmente enviando uma confirmação de volta ao mestre informando que recebeu a solicitação. Aqui você pode ler mais sobre o protocolo I²C.
O Codificador Rotativo I²C
Não seria legal poder conectar um Rotary Encoder usando apenas os dois fios do barramento I²C!?
E é disso que trata este post: um Rotary Encoder que você conecta via barramento I²C e controla usando o protocolo I²C.
Desenhei o firmware e uma pequena placa de circuito com um microprocessador ATtiny841. O ATtiny841 possui aramehardware (a camada abaixo do I²C), tornando-o extremamente adequado como I²C Slave para este projeto.
O firmware garante que o ATtiny841 se comporte, por um lado, como um I²C Slave 'normal' e, por outro lado, fornece a interface com um RGB Rotary Encoder. Para controlar facilmente o I²C RotaryEncoder, tenho um correspondente e fácil de usar Biblioteca Arduino /ESP8266 escrito.
Com esta configuração é possível conectar quantos (literalmente!) I²C RotaryEncoders você quiser ao seu microprocessador e ainda precisar usar apenas dois pinos GPIO. Você pode até mesmo conectar outros dispositivos I²C (displays, sensores, etc.) aos mesmos dois pinos GPIO, deixando muitos pinos GPIO livres para outras finalidades.
Se desejar, você pode usar o pino de interrupção do I²C RotaryEncoder para tornar seu programa "orientado por interrupção".
O pino de interrupção gera uma interrupção a cada mudança na posição do eixo rotativo ou botão de pressão. Todos os I²C RotaryEncoders compartilham a mesma linha de interrupção.
Como você pode usar o I²C RotaryEncoder em seu projeto?
O código abaixo é um esboço de exemplo para se comunicar com o I²C RotaryEncoder (usando o pino de interrupção):