Spisu treści:

Kompletne rozwiązanie obrotowe Arduino: 5 kroków
Kompletne rozwiązanie obrotowe Arduino: 5 kroków

Wideo: Kompletne rozwiązanie obrotowe Arduino: 5 kroków

Wideo: Kompletne rozwiązanie obrotowe Arduino: 5 kroków
Wideo: 5 KROKÓW do poznania ARDUINO 🤖 2024, Listopad
Anonim
Kompletne rozwiązanie obrotowe Arduino
Kompletne rozwiązanie obrotowe Arduino

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

Enkodery obrotowe wewnątrz
Enkodery obrotowe wewnątrz
Enkodery obrotowe wewnątrz
Enkodery obrotowe wewnątrz
Enkodery obrotowe wewnątrz
Enkodery obrotowe wewnątrz

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

Nędza, która wielu ludziom sprawia prawdziwy ból
Nędza, która wielu ludziom sprawia prawdziwy ból
Nędza, która wielu ludziom sprawia prawdziwy ból
Nędza, która wielu ludziom sprawia prawdziwy ból
Nędza, która wielu ludziom sprawia prawdziwy ból
Nędza, która wielu ludziom sprawia 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)

Rozwiązanie maszyny skończonej (FSM)
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

Kod Arduino
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: