Anpassade Arduino MIDI Controller (10 / 14 steg)
Steg 10: Hej, vad sägs om roterande pulsgivare?
Om roterande pulsgivare
Potentiometrar och reglar är bra för att kontrollera volymer och frekvenser, men ibland du befinner dig i behov av något som kan vända för evigt, så du kan rulla genom dina spellistor, eller kanske är du en DJ och du vill lägga till jog hjul till handkontrollen repa. Det är då rotationsencoder kommer i.
De kan se ut en potentiometer, men det finns 3 stora skillnader:
- En roterande kodare kan vända för evigt, medan en potentiometer har ett fast utbud (vanligtvis runt 270°).
- En rotationsencoder skickar digitala signaler, medan en potentiometer "utgångar" analoga spänningar.
- En rotationsencoder skickar relativa meddelanden, medan en potentiometer rapporterar dess absoluta vinkel.
Avkoda en rotationsencoder
Innan vi kan använda dem, måste vi först förstå hur de fungerar. Det finns ett långt dokument på Arduino Playground, men jag ska försöka att ge en snabb förklaring.
En rotationsencoder består i princip av två växlar. När den slås är de två stiften på dessa växlar (A & B) ansluten och kopplas bort från det vanliga stiftet (C). (Se bild 1, kredit: RobotRoom)
Detta resulterar i två fyrkantsvågor. Dessa fyrkantsvågor är identiska, men tidpunkten är olika. Vi säger att de är 90° ur fas: den andra vågen startar sin cykel när den första vågen är på 1/4 av sin cykel. (90° är 1/4 av en full 360°, därav den "90° ut av fas". A & B kallas också "kvadratur output", eftersom de är en "kvartal" ur fas.)
Ta en titt på den andra bilden (Källa: Arduino Playground). Låt oss anta att vi vänder kodaren medurs (CW på bilden). Varje gång A signal stiger, (röda vertikala linjen) B signalen är hög, och varje gång A signal faller (gröna linjen), B signalen är låg. Tänk dig nu vrida den moturs (CCW). Nu varje gång A signal stiger (gröna linjen), B signalen är låg, och varje gång A signal faller (röd linje), B signalen är hög. Så genom att kontrollera B värdet när A värdet ändras, vi vet vilken riktning går axeln. Detta gäller även för förändringarna av B-kanal. Genom att räkna pulserar, vet vi hur mycket vi rotera den.
Eftersom kontroll stift A och B i en slinga av vår skiss skulle vara alltför långsam om det finns andra saker som kör också, och vi vill inte missa någon förändring av dem, använder vi avbryter. Här är några bra sidor om avbrott: Arduino referens, Nick Gammon platsoch kapitel 11 i Atmel Datasheet (Uno eller Leonardo).
Avbryter är, enkelt uttryckt, delar av din kod som bara kör när något utlöses, som en pin förändring. Den viktigaste loopen avbryts och ISR eller avbryta tjänsten rutin kallas. Det är långt mer komplex än så, men det är omöjligt att förklara i en Instructable. Hur som helst, om vi fäster ett avbrott till stift av rotary encoder, kan vi göra till att vi inte missar någon pin förändring, oavsett vad som händer i andra delar av vår kod. Du kan läsa mer om detta i tidigare länkarna, men vi kommer inte att vara oroande att mycket om avbrott, eftersom vi kommer att använda PJRC'S encoder bibliotek, som hanterar detta för oss.
Det finns två typer av roterande pulsgivare: mekaniska och optiska. Den första bilden är en mekanisk en: det finns en statisk och en glidande bit metall, och de gör eller broms anslutningar. Den andra typen är en optisk pulsgivare: det finns två strålar av (mestadels infrared) ljus, och en snurrande skiva med tänder avbryter disken. Om avståndet mellan bjälkarna är rätt förhållandet jämfört med bredden på tänderna, kommer deras fyrkantsvågor vara 90° ur fas. Det finns ett exempel i bild 3 (Källa: Kawasaki Heavy Industries). Det är också möjligt att ha två ringar av slitsar, som är redan i rätt fas på disken.
Det finns ett problem med mekaniska kodare, och det är på grund av att anslutningen är aldrig perfekt. Du kan ha små spikar när du ansluter och kopplar från, och Arduino kommer också upptäcka dem och ge oss fel avläsningar. En enkel lösning är att lägga två 100nF kondensatorer mellan våra A- och B utgångar och marken.