Stap 10: Hey, hoe zit het met rotary encoders?
Over rotary encoders
Potentiometers en faders zijn groot voor het beheersen van de volumes en frequenties, maar soms je merkt dat je behoefte aan iets dat voor altijd, veranderen kan zodat u door uw afspeellijsten bladeren kunt, of misschien u een DJ bent en u wilt toevoegen van de jog-wielen aan de controller te krabben. Dat is wanneer rotary encoders komen in.
Ze kunnen lijken op een potentiometer, maar er zijn 3 belangrijke verschillen:
- Een roterende encoder annuleertekenzwenking voor altijd, terwijl een potentiometer heeft een vaste bereik (meestal ongeveer 270°).
- Een roterende encoder stuurt digitale signalen, terwijl een potentiometer '' analoge spanningen output.
- Een roterende encoder stuurt relatieve berichten, terwijl een potentiometer zijn absolute hoek rapporten.
Decodering van een roterende encoder
Voordat we gebruiken kunnen, moeten we eerst begrijpen hoe ze werken. Er is een lang document in de Arduino Playground, maar ik zal proberen om een snelle uitleg te geven.
Een roterende encoder bestaat in principe uit twee switches. Wanneer deze ingeschakeld, zal de twee pinnen van deze schakelopties (A & B) worden aangesloten en losgekoppeld van de gemeenschappelijke pin (C). (Zie afbeelding 1, credit: RobotRoom)
Dit resulteert in twee vierkante golven. Deze vierkante golven zijn identiek, maar de timing is anders. We zeggen dat ze 90° uit fase: de tweede golf begint de cyclus wanneer de eerste golf op 1/4 van de cyclus is. (90° is 1/4 van een volledige 360°, vandaar de "90° uit van fase". A & B worden ook genoemd 'quadrature uitgangen', omdat ze een 'kwartaal' uit fase.)
Neem een kijkje op de tweede afbeelding (Bron: Arduino Playground). Laten we aannemen dat we weer het coderingsprogramma rechtsom (CW op de afbeelding). Elke keer als het signaal A stijgt, (rode verticale lijn) het signaal B is hoog, en elke keer als het A-signaal valt (groene lijn), de B-signaal is laag. Veronderstel nu draaien tegen de klok in (Linksom). Nu elke keer als het signaal A stijgt (groene lijn), de B-signaal is laag, en elke keer als het A-signaal valt (rode lijn), de B-signaal is hoog. Dus de B door waarde te controleren wanneer de waarde van A wordt gewijzigd, we welke richting weten gaat de schacht. Dit geldt ook voor de wijzigingen van het B-kanaal. Door het tellen van de pulsen, weten we hoeveel we draaien.
Omdat controle pin A en B in de lus van onze schets zou te traag als er andere alles zo soepel, en we willen niet te missen elke wijziging van hen, gebruiken we interrupts. Hier zijn sommige grote pagina's over interrupts: de Arduino verwijzing, Nick Gammon de site, en hoofdstuk 11 in de Atmel Datasheet (Uno of Leonardo).
Interrupts zijn, simpel gezegd, delen van uw code die alleen uitvoeren wanneer iets wordt geactiveerd, als een pin wijzigen. De hoofdlus wordt onderbroken, en de ISR of Interrupt Service Routine is aangeroepen. Het is veel complexer dan dit, maar het is onmogelijk om uit te leggen in een Instructable. Hoe dan ook, als we een interrupt aan de pinnen van de roterende encoder koppelt, kunnen we zeker missen we niet elke wijziging van de pin, ongeacht wat is in de andere delen van onze code gaande er. U kunt meer lezen over dit in de vorige links, maar wij zullen niet verontrustend te veel over interrupts, aangezien we gebruiken PJRC de encoder bibliotheek, die dit voor ons regelt.
Er zijn twee soorten van rotary encoders: mechanische en optische. Het eerste beeld is een mechanische: er is een statische en een bewegende stuk metaal, en ze maken of rem verbindingen. Het tweede type is een optische encoder: er zijn twee balken van (meestal) infraroodlicht, en een draaiende schijf met tanden onderbreekt de schijf. Als de afstand tussen de balken de juiste verhouding ten opzichte van de breedte van de tanden is, zullen hun vierkante golven 90° uit fase. Er is een voorbeeld in afbeelding 3 (Bron: Kawasaki Heavy Industries). Het is ook mogelijk dat twee ringen van spleten, die al in de juiste fase op de schijf.
Er is een probleem met mechanische encoders, en thats wijten aan het feit dat de verbinding is nooit perfect. Je hebt kleine pieken bij aansluiten en loskoppelen en de Arduino zal ook te ontdekken die, en geven ons verkeerde lezingen. Een eenvoudige oplossing is het toevoegen van twee 100nF condensatoren tussen onze A en B uitgangen en de grond.