Inhoudsopgave:
Video: Eenvoudige roterende decoder - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:17
Dit instructable beschrijft een eenvoudige methode voor het decoderen van een sequentiële roterende encoder met behulp van een Arduino Uno R3.
Compacte softwareroutines worden gebruikt om het aantal overgangen te tellen, contact bounce te elimineren en de draairichting te bepalen. Extra componenten en opzoektabellen zijn niet vereist.
Interrupt- en non-interruptversies van de code zijn beschikbaar.
De interrupt-versie van de code vereist slechts een enkele interrupt-pin.
Afbeeldingen:
- De openingsfoto toont de gemonteerde encoder.
- De schermafbeelding toont de code voor de interruptversie en de telling wanneer de encoderas met de klok mee en tegen de klok in wordt gedraaid.
- De video toont de telling tijdens snelle rotatie.
Stap 1: Schakelschema
Het bedradingsschema van de encoder wordt getoond in fig.1.
De jumperdraden worden rechtstreeks op de encoderpinnen gesoldeerd.
Verwissel de twee blauwe draden als de telrichting wordt omgekeerd.
Stap 2: Onderdelenlijst
De volgende onderdelen zijn verkregen van
- 1 alleen Arduino UNO R3 met USB-kabel.
- 1 alleen sequentiële roterende encoder (EC11 of equivalent) met schakelaar.
- 1 enige knop die bij de schacht past.
- 3 alleen Arduino male-to-male jumperdraden.
Stap 3: Theorie
Sequentiële roterende encoders genereren twee blokgolven die elk 90 graden worden verplaatst, zoals weergegeven in Fig.1.
De logische patronen bij contact A en contact B zijn verschillend wanneer de as met de klok mee (CW) en tegen de klok in (CCW) wordt gedraaid door de posities 1 tot 6.
Gebruikelijke methoden voor het bepalen van de draairichting zijn onder meer:
- hardware
- dubbele onderbrekingen
- patroonopzoektabellen
Dit project gebruikt een softwaremethode waarvoor geen opzoektabellen nodig zijn. [1]
Richting
In plaats van te kijken naar de uitvoerpatronen van Contact A en Contact B, laten we ons concentreren op Contact A.
Als we een steekproef nemen van Contact B na elke overgang van Contact A, merken we op dat:
- Contact A en Contact B hebben tegengestelde logische toestanden wanneer de encoder CW wordt gedraaid
- Contact A en Contact B hebben dezelfde logische status wanneer de encoder tegen de klok in wordt gedraaid
Actuele code:
// ----- Overgangen tellen
HuidigeStateA = staatContactA(); if (CurrentStateA! = LastStateA) { CurrentStateB = digitalRead (ContactB); if (CurrentStateA == CurrentStateB) Count++; if (CurrentStateA != CurrentStateB) Count--; LastStateA = HuidigeStateA; }
Deze methode biedt de volgende voordelen:
- opzoektabellen zijn niet vereist
- er is slechts een enkele onderbrekingsregel vereist
debounce
Alle mechanische encoders hebben last van "contact bounce".
Als een schakelcontact niet netjes maakt/verbreekt, zal zijn logische toestand snel oscilleren van HOOG naar LAAG totdat het schakelcontact tot rust komt. Dit resulteert in valse tellingen.
Een methode om contactbotsing te onderdrukken, is door een kleine condensator over elk schakelcontact toe te voegen. De condensator en de bijbehorende pull-up-weerstand vormen een integrator die hoge frequenties effectief kortsluit en de schakelspanning gracieus laat stijgen/dalen.
Het nadeel van deze benadering is dat overgangen kunnen worden gemist als de encoderas snel wordt geroteerd.
Software debouncen
Deze methode maakt gebruik van twee tellers (Open, Gesloten) die op nul zijn gezet. [2]
Zodra een overgang is gedetecteerd op Contact A:
- Doorlopend contact opnemen met Contact A.
- Verhoog de Open-teller en reset de Gesloten-teller wanneer contact A HOOG is.
- Verhoog de Gesloten-teller en reset de Open-teller wanneer contact A LAAG is.
- Verlaat de lus wanneer een van de tellers een vooraf bepaalde telling bereikt. We zijn in feite op zoek naar de stabiele periode na een contact bounce.
Actuele code:
// ----- Debounce Contact A
while (1) {if (digitalRead (ContactA)) { // ----- ContactA is Open Gesloten = 0; // Lege tegenoverliggende integrator Open++; // Integreer als (Open> MaxCount) HOOG retourneert; } else { // ----- ContactA is Gesloten Open = 0; // Lege tegenoverliggende integrator Closed++; // Integreer als (Gesloten > MaxCount) LOW retourneert; } }
Het is niet nodig om contact B te debouncen, omdat de overgangen van contact A en contact B niet samenvallen.
Tellen
Een mechanische "pal" verdubbelt effectief uw telling omdat er twee tellingen worden geregistreerd tussen klikken (zie fig. 1).
Het aantal “palletjes” kan worden bepaald met behulp van modulo 2 rekenkunde zoals hieronder getoond.
Actuele code:
// ----- Tel "detents"
if (Aantal % 2 == 0) { Serial.print("Aantal: "); Serial.println (Tellen / 2); }
Referenties
Verdere informatie is te vinden op:
[1]
howtomechatronics.com/tutorials/arduino/ro…
[2]
newbiehack.com/ButtonorSwitchDebounceinSof…
Stap 4: Software
Dit project vereist een recente versie van de Ardino Uno R3 IDE (geïntegreerde ontwikkelomgeving) die beschikbaar is op
Download elk van de volgende twee Arduino-schetsen (bijgevoegd)
- rotary_encoder_1.ino (polling-versie)
- rotary_encoder_2.no (interrupt-versie)
Dubbelklik op uw voorkeursversie en volg de instructies op het scherm.
Genieten van …
Klik hier om mijn andere instructables te bekijken.
Aanbevolen:
How To: een contactloze roterende encoder: 3 stappen
How To: een contactloze roterende encoder: In deze toepassingsnota wordt beschreven hoe u een zeer betrouwbare draaischakelaar of encoder kunt ontwerpen met behulp van een Dialog GreenPAK™. Dit schakelaarontwerp is contactloos en negeert daarom contactoxidatie en slijtage. Het is ideaal voor gebruik buitenshuis waar er lange
Roterende massagemachine V1.0 (prototype): 7 stappen
Rotary Massage Machine V1.0 (Prototype): Rotary Massage Machine, is een apparaat dat u helpt uw spieren te ontspannen wanneer ze gespannen zijn. Het kan ook helpen om spierknopen te ontwarren of kan worden gebruikt voor diepe weefselbehandeling. De twee knoppen aan de onderkant hebben een verhoogd gebied om het weefsel uit te steken
Arduino - Roterende Led op Beweging - Draagbaar item (geïnspireerd door Chronal Accelerator Tracer Overwatch): 7 stappen (met afbeeldingen)
Arduino - Roterende Led op Beweging - Draagbaar item (geïnspireerd door Chronal Accelerator Tracer Overwatch): Deze instructable helpt je om een accelerometer en een Neopixel Led-ring aan te sluiten. Ik zal de code leveren om de accelerometer te lezen en dit effect te krijgen met je neopixel animatie.Voor dit project heb ik de Adafruit 24bit Neopixel ring gebruikt, en de MP
Roterende Pompoenkop: 3 stappen
Roterende pompoenkop: Hallo, dit is mijn allereerste instructable project. In dit project wil ik buiten een roterende pompoenkop maken. Er is RGB-licht toegevoegd in de pompoenkop, dus dit project is het beste om 's nachts te laten zien! Vooral in de Hallow
Betere roterende encoder: 4 stappen
Betere roterende encoder: als je ooit hebt geprobeerd om de standaard roterende encoder voor je project te gebruiken, viel je waarschijnlijk tegen. Of het nu kwam door de moeilijkheid van het instellen of de onnauwkeurige bediening. Ik had hetzelfde probleem, dus ik besloot het op te lossen. Ik heb 3D pr