I²C Rotary Encoder

Ik zal in dit artikel twee onderwerpen behandelen.

 

De eerste gaat over Rotary Encoders en (summier) hoe ze werken. De tweede gaat over het door Philips ontwikkelde Inter-Integrated Circuit-protocol (I²C).

Rotary Encoders

Een Rotary Encoder is een apparaat dat (fysiek) op een potentiometer lijkt, maar niet de weerstand tussen twee / drie connectoren varieert maar in plaats daarvan pulsen geeft wanneer aan de as wordt gedraaid. Een ander verschil met de potentiometer is dat je de as 360° kunt draaien (er is in feite geen limiet in hoeveel graden je de as kunt draaien).

De meeste Rotary Encoders hebben een druk-schakelaar die wordt geactiveerd als je op de as drukt. En er zijn Rotary Encoders die intern een driekleuren LED hebben (zgn. RGB Rotary Encoder) waarmee je een gebruiker met een pallet aan kleuren feedback kunt geven.

RGB Rotary Encoder RGB Rotary Encoder

De Rotary Encoder genereert pulsen als er aan de as wordt gedraaid. De meeste Rotary Encoders genereren 24 pulsen bij elke 360° rotatie maar er zijn ook Rotary Encoders die meer of minder pulsen per omwenteling afgeven. In je programma kunt je deze pulsen tellen en daarop reageren (bijvoorbeeld: de uitgangs spanning van een voeding verhogen of verlagen of een menulijst doorlopen).

Je kunt je afvragen: "waarom een Rotary Encoder gebruiken en niet gewoon een potentiometer?". Natuurlijk is hierop geen "dit is beter dan dat" antwoord. Het hangt van het project af. Als je een analoge hifi-versterker bouwt, is de potentiometer waarschijnlijk de betere keuze. Als je een project hebt met een microprocessor dan biedt de Rotary Encoder je veel opties om een mooie gebruikersinterface te maken (met misschien een fijne / grove verandering afhankelijk van de kort of lang indrukken van de as en een gekleurde feedback om weer te geven welke modus actief is).

Hieronder staat een voorbeeldschets om een Rotary Encoder te “lezen”. Om dit programma goed en betrouwbaar te laten werken hebt je hardware-bounce control (RC-netwerk) op pin A en B van de encoder nodig:

Demo Sketch Rotary Encoder

Het gebruik van een Rotary Encoder in een project heeft helaas ook een nadeel: je hebt veel GPIO pinnen nodig!

Eén RGB Rotary Encoder heeft twee GPIO-pinnen nodig voor de Encoder zelf (plus GND), vervolgens heb je één GPIO-pin nodig voor de drukschakelaar en drie GPIO-pinnen voor de RGB-LED. Dat is een totaal van zes GPIO-pinnen! Op bijvoorbeeld een ESP8266 heb je dan nog slechts drie GPIO-pinnen over om de rest van je project te besturen! Op een Arduino UNO heb je meer GPIO-pinnen zodat één Rotary Encoder geen probleem zal zijn. Maar wat als je twee, drie of nog meer Rotary Encoders wilt aansluiten. Op een ESP8266 is dat niet mogelijk maar op een Arduino UNO zul je ook snel geen GPIO-pinnen meer hebben!

Gelukkig is er een oplossing!

De Inter-Integrated Circuit bus (I²C)

Dit wordt een (data) "bus" genoemd omdat je er veel devices op kunt aansluiten. De "bus" bestaat uit twee lijnen. Een kloklijn (SCL) en een datalijn (SDA). Er is altijd (ten minste) één 'master'-device en alle andere apparaten zijn 'slave'-devices. Elk device heeft een uniek adres om zich van elkaar te kunnen onderscheiden. Ik zal niet de diepte van het I²C-protocol ingaan, maar normaal zal de master de controle over de bus claimen en een verzoek verzenden naar een slave met een specifiek adres. De slave zal op zijn beurt actie ondernemen op het verzoek, hetzij door een specifieke actie in de slave zelf uit te voeren, door gegevens terug te sturen naar de master of eenvoudigweg door een bevestiging terug te sturen naar de master om hem te laten weten dat hij het verzoek heeft ontvangen. Hier kun je meer over het I²C-protocol lezen.

De I²C Rotary Encoder

Zou het niet leuk zijn om een Rotary Encoder aan te kunnen sluiten met alleen de twee draden van de I²C-bus !?

 

En daar gaat deze post echt over: een Rotary Encoder die je via de I²C-bus verbindt en bestuurt met het I²C-protocol.

 

Ik heb de firmware en een kleine printplaat met een ATtiny841 microprocessor ontworpen. De ATtiny841 heeft ingebouwde Wire-hardware (de laag die onder I²C zit) waardoor deze uitermate geschikt is als I²C Slave voor dit ontwerp.

 

I2C Rotary Encoder v 2.2 bottom view I2C Rotary Encoder v 2.2 bottom view

De firmware zorgt ervoor dat de ATtiny841 zich, aan de ene kant, als een ‘normale’ I²C Slave gedraagt en aan de andere kant de interface met een RGB Rotary Encoder verzorgt. Om de I²C RotaryEncoder eenvoudig aan te kunnen sturen heb ik een bijpassende en eenvoudig te gebruiken Arduino / ESP8266-bibliotheek geschreven.

 

Met deze opzet is het mogelijk om zoveel (letterlijk!) I²C RotaryEncoders op je microprocessor aan te sluiten als je wilt en je toch nog steeds slechts twee GPIO-pinnen hoeft te gebruiken. Je kunt zelfs andere I²C-devices (displays, sensoren, enz.) aansluiten op dezelfde twee GPIO-pinnen, waardoor er veel GPIO-pinnen vrij blijven voor andere doeleinden. 

I2C BUS I2C BUS

Als je wilt, kun je de Interrupt-pin van de I²C RotaryEncoder gebruiken om je programma "Interrupt-driven" te laten werken.

De Interrupt-pin genereert een Interrupt bij elke verandering in de positie van de Rotary as of drukknop. Alle I²C RotaryEncoders delen dezelfde Interrupt-lijn.

Hoe kun je de I²C RotaryEncoder in je project gebruiken?

De onderstaande code is een voorbeeldschets om te communiceren met de I²C RotaryEncoder (met gebruik van de Interrupt pin):

Basic I2C_RotaryEncoder Sketch

I2C Rotary Encoder module - zonder encoder Het I2C rotary encoder bordje is een klein bordje waarmee je een rotary encoder met het I2C-protocol kunt programmeren en uitlezen. Door de I2C-bus kun je meerdere "I2C Rotary Encoder" bordjes met elkaar verbinden. € 11,95

Reacties

Nederland
Klik op de link om een youtube filmpje van de I2C RotaryEncoder te bekijken:

https://youtu.be/_yOXAgfKwmo
Geplaatst op 
1



Upload foto's
Foto's toevoegen

Gegevens