01 juli 2015

Arduino Project 2. De Rotary Encoder

Om zo meteen de snelheid te kunnen meten, moet de straal van het voorwiel bekend zijn. Nu kan ik dit  handmatig in de Arduino code invoeren wanneer ik van banden maat wissel, maar het is natuurlijk makkelijker om dit via het paneeltje te doen. En daarvoor heb ik een zogenaamde Rotary Encoder besteld.


Rotrary encoder - $ 1.29

Wanneer er aan een Rotary Encoder gedraaid wordt, worden er pulsjes afgegeven waarmee vervolgens weer 'iets' gedaan kan worden. Je voelt klikjes als je aan zo'n encoder draait. Verder kan bovenstaande encoder ook nog een signaal geven als er op gedrukt wordt. Ik heb mijn encoder als volgt aan de Arduino aangesloten:


De Rotary Encoder op de Arduino Mega

Normaal gesproken wordt een Arduino code stap voor stap uitgevoerd. Nu gaan die stappen vrij snel, maar als het programma een hoop te doen heeft, is dat toch merkbaar. Zo duurt het uitlezen van een DS18B20 temperatuur sensor al gauw een seconde. En als je toevallig dan net aan de draaiknop van de encoder zit te friemelen merkt de software daar niets van.

Nu is een Arduino standaard uitgerust met een paar speciale interrupt poorten. Wanneer deze poorten geactiveerd zijn worden deze gemonitored, en als er iets verandert aan de status van de poort, kan  het programma onderbroken worden om een bepaalde actie uit te voeren, en dat is in mijn geval het veranderen van de wiel straal.

Een Arduino Mega heeft 6 interrupts, genummerd van 0 tot 5. Ik sluit mijn encoder aan op interrupt 0 en 1 (respectievelijk pin 2 en 3). Poort 4 wordt gebruikt voor het indrukken van de encoder knop. 

Nu moet de hele zooi ook nog geprogrammeerd worden. In bijgaande link vond ik de juiste instructies, die ik na wat aanpassingen geschikt maakte voor mijn programma. Nu moet ik dit nog op een zinnige manier op het scherm tonen, maar dat komt later.

Een andere uitdaging die ik had was het opslaan van de wijzigingen. Als een Arduino wordt uit gezet, verliest deze al zijn variabelen. Nu is er gelukkig een kleine geheugen ruimte gereserveerd om wat variabelen op te kunnen opslaan. Via weer een andere link vond ik ook een instructie voor deze uitdaging. De data wordt opgeslagen in het EEPROM geheugen zodra er wat verandert wordt, en wordt weer uitgelezen als ik de Arduino opstart. Op deze manier kan ik de veranderde wielmaten  opslaan als ik die verandert heb.


2 opmerkingen:

RedDuck zei

Verwacht je nog contactdender bij jouw encoder? Zo ja, dan gaat die interrupt vaak een event genereren. Daar zul je dan in je software rekening mee moeten houden. Mooi project trouwens. Volg het op de voet.

Zelf heb ik een AVR in mijn Quest voor (nu alleen nog) de knipperlichten.

Rob Broek zei

Contactdender ben ik tot nu toe heel sporadisch tegenaan gelopen. En dat valt mij best mee voor een encoder van $ 1.29

Ik kijk nog even aan of ik hiervoor ga corrigeren, maar ik denk het niet. Zo vaak verwissel ik nou ook niet van bandenmaat,