Förbättrad Arduino Rotary Encoder behandlingen
Roterande pulsgivare är stor indataenheter för elektronik projekt - förhoppningsvis detta Instructable kommer att inspirera och hjälpa dig att använda en i ditt nästa projekt.
Varför skriva rotationsencoder kod?
Jag ville använda en låg kostnad rotationsencoder som en input mekanism för ett av mina kommande projekt och var från början förvirrade av koden alternativ att ta avläsningar från rotary encoder och avgöra hur många "spärrar" eller cykler kodaren hade klickat förbi och i vilken riktning. Jag tror att min huvudsakliga skiss behöver att använda de flesta av min Arduino minne så jag undviker de olika tillgängliga encoder bibliotek, som verkade vara svårt att fungera när jag försökte ett par av dem. De verkar också använda mycket mer kod budgeten än skiss-baserad kod metoder diskuteras här på.
Om du bara vill kringgå bakom min strategi och komma rakt in i Instructable, gärna du gå vidare till steg 1!
Andra metoder
Flera av de viktigaste skiss-baserade (dvs. de inte använder ett bibliotek) metoder diskuteras i rt's blogginlägg där de skriver rotationsencoder kod som gör de billigaste pulsgivare kan användas som insatsvaror i Arduino. De har också ett bra exempel på de logik signal som kodaren producerar. RT funnit att en timer avbryta systemet fungerat bäst för dem men jag är orolig att röstningen frekvensen skulle förringa skärmen uppdateringshastighet i huvudloop för min projektet skiss. Med tanke på att rotary encoder kommer att flytta för en mycket liten del av den tid, jag skärmen för att uppdatera, det verkar vara en dålig match för min ansökan.
Jag valde att börja med Steve Spence kod här, som var bra på egen hand men verkade riktigt sakta ner när jag tagit resten av min skiss kod (vilket kräver skriva display uppdateringar till en liten TFT-skärm). Först undrade jag om det eftersom huvudloop innehåller ett debounce uttalande.
Jag läste sedan Olegs rotationsencoder artikel på en avbrottstjänstens rutin version av hans tidigare inlägg, jag trodde också det kan vara en bra idé att använda direkt port manipulation för att läsa båda stiften samtidigt och så snart avbrottet bränder. Hans nummer kan användas på alla ingångsstift om port manipulation koden är omskrivet. Däremot bestämde jag mig att använda endast maskinvaruavbrott på digital stift 2 och 3, så vi kan sätta avbrott att bara skjuta på en stigande kanten av pin spänningen, snarare än på stift spänning förändring, vilket inkluderar faller kanter. Detta minskar antalet gånger ISR kallas, störande från den huvudsakliga loopen.
Olegs koden använder en uppslagstabell för att minska storleken på kompilerad kod till en riktigt liten storlek men jag kunde inte få tillförlitliga resultat som skulle fånga mycket långsam rotation samt hyfsat snabb rotation. Ha i åtanke att hårdvara debouncing (se steg 2) kan hjälpa mycket med tillförlitlighet av avläsningar men jag var efter en mjukvarulösning att förenkla den hårdvara bygget och vara lika portabel till andra hårdvara program som möjligt.
Detta avslutar införandet av min utmaning och överväganden. I steg 2 ska vi ta en titt på kodaren hårdvara, terminologi och några praktiska överväganden när du vill integrera en rotationsencoder i ditt projekt.