Spisu treści:
- Krok 1: Wewnątrz enkodery obrotowe
- Krok 2: Nieszczęście, które wielu ludziom powoduje prawdziwy ból
- Krok 3: Rozwiązanie maszyny skończonej (FSM)
- Krok 4: Kod Arduino
- Krok 5: Bezbłędna integracja
Wideo: Kompletne rozwiązanie obrotowe Arduino: 5 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:30
Enkodery obrotowe to obrotowe pokrętła sterujące do projektów elektronicznych, często używane z mikrokontrolerami z rodziny Arduino. Mogą być używane do dostrajania parametrów, nawigacji po menu, przesuwania obiektów na ekranie, ustawiania dowolnych wartości. Są powszechnymi zamiennikami potencjometrów, ponieważ można je obracać dokładniej i nieskończenie, inkrementują lub dekrementują o jedną wartość dyskretną, a często są zintegrowane z wciskanym przełącznikiem funkcji wyboru. Występują we wszystkich kształtach i rozmiarach, ale najniższy przedział cenowy jest trudny do połączenia, jak wyjaśniono poniżej.
Istnieje niezliczona ilość artykułów o szczegółach pracy i trybach użytkowania enkoderów obrotowych, a także liczne przykładowe kody i biblioteki dotyczące ich używania. Jedynym problemem jest to, że żaden z nich nie działa w 100% dokładnie z chińskimi modułami obrotowymi z najniższej półki cenowej.
Krok 1: Wewnątrz enkodery obrotowe
Obrotowa część enkodera ma trzy piny (i dwa dodatkowe dla opcjonalnej części przełącznika). Jedna to wspólna masa (czarny GND), a dwie pozostałe służą do określania kierunku po przekręceniu pokrętła (często nazywane są niebieskimi CLK i czerwonymi DT). Obydwa są podłączone do pinu wejściowego PULLUP mikrokontrolera, dzięki czemu poziom WYSOKI jest ich domyślnym odczytem. Gdy pokrętło jest obrócone do przodu (lub zgodnie z ruchem wskazówek zegara), najpierw niebieski CLK spada do poziomu LOW, a następnie czerwony DT. Obracając się dalej, niebieski CLK wznosi się z powrotem do HIGH, a następnie, gdy wspólna łatka GND opuszcza oba piny połączeniowe, czerwony DT również podnosi się z powrotem do HIGH. W ten sposób ukończenie jednego pełnego tiku FWD (lub zgodnie z ruchem wskazówek zegara). To samo idzie w innym kierunku BWD (lub przeciwnie do ruchu wskazówek zegara), ale teraz czerwony spada jako pierwszy, a niebieski powraca jako ostatni, jak pokazano odpowiednio na dwóch obrazach poziomu.
Krok 2: Nieszczęście, które wielu ludziom powoduje prawdziwy ból
Częstym problemem dla hobbystów Arduino jest to, że tanie moduły enkoderów obrotowych odbijają dodatkowe zmiany poziomów wyjściowych, powodując dodatkowe i błędne odczyty liczników kierunku. Zapobiega to bezbłędnemu liczeniu i uniemożliwia zintegrowanie tych modułów z dokładnymi projektami obrotowymi. Te dodatkowe odbicia są spowodowane mechanicznymi ruchami łatek nad pinami łączącymi, a nawet zastosowanie dodatkowych kondensatorów nie może ich całkowicie wyeliminować. Odbicia mogą pojawić się w dowolnym miejscu w pełnych cyklach tików i są ilustrowane przez rzeczywiste scenariusze na obrazach.
Krok 3: Rozwiązanie maszyny skończonej (FSM)
Obraz pokazuje pełną przestrzeń stanów możliwych zmian poziomów dla dwóch pinów (niebieskiego CLK i czerwonego DT), zarówno dla poprawnych, jak i fałszywych odbić. Na podstawie tej maszyny stanowej można zaprogramować kompletne rozwiązanie, które zawsze działa w 100% dokładnie. Ponieważ w tym rozwiązaniu nie są potrzebne żadne opóźnienia filtrowania, jest ono również najszybsze z możliwych. Kolejną korzyścią wynikającą z oddzielenia przestrzeni stanów pinów od trybu pracy jest to, że można zastosować zarówno tryb odpytywania, jak i tryby przerwań według własnych upodobań. Odpytywanie lub przerwania mogą wykryć zmiany poziomu na pinach, a oddzielna procedura obliczy nowy stan na podstawie bieżącego stanu i rzeczywistych zdarzeń zmian poziomu.
Krok 4: Kod Arduino
Poniższy kod zlicza tiki FWD i BWD na monitorze szeregowym, a także integruje opcjonalną funkcję przełącznika.
// Peter Csurgay 10.04.2019
// Piny obrotowe mapowane na porty Arduino
#zdefiniuj SW 21 #zdefiniuj CLK 22 #zdefiniuj DT 23
// Aktualna i poprzednia wartość licznika dostrojona pokrętłem
int curVal = 0; int prevVal = 0;
// Siedem stanów FSM (maszyna skończonych stanów)
#define IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #define SDT_01 6 int state = IDLE_11;
pusta konfiguracja () {
Serial.początek(250000); Serial.println("Rozpocznij…"); // Poziom HIGH będzie domyślny dla wszystkich pinów pinMode(SW, INPUT_PULLUP); pinMode(CLK, INPUT_PULLUP); pinMode(DT, INPUT_PULLUP); // Zarówno CLK jak i DT będą wyzwalać przerwania dla wszystkich zmian poziomu attachInterrupt(digitalPinToInterrupt(CLK), rotorCLK, CHANGE); attachInterrupt(digitalPinToInterrupt(DT), rotacyjnyDT,CHANGE); }
pusta pętla () {
// Obsługa opcjonalnego przełącznika zintegrowanego z niektórymi enkoderami obrotowymi if (digitalRead(SW)==LOW) { Serial.println("Wciśnięty"); while(!digitalRead(SW)); } // Każda zmiana wartości licznika jest wyświetlana w Monitorze szeregowym if (curVal != prevVal) { Serial.println(curVal); prevVal = curVal; } }
// Przejścia automatu stanów dla zmian poziomu CLK
void rotorCLK() { if (digitalRead(CLK)==LOW) { if (stan==IDLE_11) stan = SCLK_01; w przeciwnym razie (stan==SCLK_10) stan = SCLK_00; w przeciwnym razie (stan==SDT_10) stan = SDT_00; } else { if (stan==SCLK_01) stan = IDLE_11; w przeciwnym razie (stan==SCLK_00) stan = SCLK_10; w przeciwnym razie (stan==SDT_00) stan = SDT_10; else if (stan==SDT_01) { stan = IDLE_11; curVal--; } } }
// Przejścia automatu stanów dla zmian poziomu DT
void rotorDT() { if (digitalRead(DT)==LOW) { if (stan==IDLE_11) stan = SDT_10; w przeciwnym razie (stan==SDT_01) stan = SDT_00; w przeciwnym razie jeśli (stan==SCLK_01) stan = SCLK_00; } else { if (stan==SDT_10) stan = IDLE_11; w przeciwnym razie (stan==SDT_00) stan = SDT_01; w przeciwnym razie, jeśli (stan==SCLK_00) stan = SCLK_01; else if (stan==SCLK_10) { stan = IDLE_11; curVal++; } } }
Krok 5: Bezbłędna integracja
Możesz sprawdzić w załączonym filmie, że rozwiązanie FSM działa dokładnie i szybko, nawet w przypadku niskozakresowych enkoderów obrotowych z różnymi sporadycznymi efektami odbicia.
Zalecana:
Skaner punktowy XYZ wykorzystujący odzyskane enkodery obrotowe: 5 kroków
Skaner punktów XYZ wykorzystujący odzyskane enkodery obrotowe: Po nabyciu dużej liczby wyrzuconych obrotowych enkoderów optycznych z mojego miejsca pracy w końcu zdecydowałem się zrobić z nimi coś zabawnego/przydatnego. Niedawno kupiłem nową drukarkę 3D do mojego domu i co może to komplement lepiej niż 3D s
Obrotowe płyty słoneczne oparte na programie: 9 kroków
Obrotowe płyty słoneczne oparte na programie: Zgodnie z rosnącą populacją i potrzebami potrzebujemy większej wydajności przy mniejszych nakładach. Zaproponowaliśmy programową rotacyjną płytę solarną. Działa zawsze zgodnie z kierunkiem natężenia światła słonecznego. W tym konkursie zaproponowaliśmy specjalny rodzaj
Mini dwukolorowe obrotowe światło ostrzegawcze: 6 kroków
Mini dwukolorowe obrotowe światło ostrzegawcze: W tej instrukcji stworzymy mini światło ostrzegawcze. Wiesz, jedno z tych staromodnych wirujących świateł, które montowano na sprzęcie budowlanym, zanim diody LED stały się duże? Tak. Jeden z tych. Ten będzie stosunkowo prosty i mały
Najnowsze rozwiązanie MacOS/Hackintosh High Sierra 10.13 USB Wifi Driver "Przyszłościowe" rozwiązanie przy użyciu Raspberry Pi: 4 kroki
Najnowsze rozwiązanie MacOS/Hackintosh High Sierra 10.13 USB Wifi Driver „Future Proof” przy użyciu Raspberry Pi: Jednym z najbardziej frustrujących problemów z najnowszym macOS/Hackintoshem jest dostępność sterownika Wi-Fi USB. Mam 3 USB Wi-Fi, żaden z nich nie działa na najnowszych macOS High Sierra 10.13Moje najnowsze wifi USB to bezprzewodowa panda, ale obsługa sterowników dla macO
Obrotowe rzutniki LED napędzane silnikiem Stirlinge (eVoltis Stirlingmachine): 12 kroków (ze zdjęciami)
Obrotowe rzutniki LED napędzane silnikiem Stirlinge (eVoltis Stirlingmachine): Jest to maszyna na gorące powietrze (silnik Stirling), zbudowana ze starych części komputerowych (radiator i głowica starego dysku twardego). Ten silnik Stirlinge (i wszystkie inne również) działa z różnicą temperatur między gorącą stroną dolną (np. Heatet z