Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Jak korzystać z impulsatora (enkodera impulsowego) podłączonego do Arduino

ghost666 23 Lip 2018 23:22 3852 20
  • Jak korzystać z impulsatora (enkodera impulsowego) podłączonego do Arduino
    Enkoder obrotowy - impulsator - jest doskonałym urządzeniem wejściowym do sterowania np. menu w interfejsie urządzenia. W poniższym tutorialu opiszemy, jak wykorzystać typowy impulsator w połączeniu z modułem Arduino.

    Krok 1. Obejrzyj film

    Jeśli nie chce Ci się czytać całego poniższego tekstu, a język angielski nie jest dla Ciebie problemem, to obejrzyj poniższy film - z pewnością pomoże Ci on zrozumieć, w jaki sposób podłączyć impulsator i oprogramować Arduino, by całość wspólnie działała.



    Jak korzystać z impulsatora (enkodera impulsowego) podłączonego do Arduino
    Krok 2. Wstęp

    Enkoder taki to urządzenie elektromechaniczne, który tłumaczy pozycję kątową lub ruch obrotowy osi na cyfrowy lub analogowy sygnał wyjściowy. Istnieją dwa rodzaje enkoderów obrotowych:

    1) Absolutny - stan wyjścia tego enkodera odpowiada dokładnie bezwzględnej pozycji osi. W ten sposób jest on przetwornikiem kąta.
    2) Inkrementalny - sygnały na wyjściu tego enkodera odpowiadają ruchom osi, więc obliczana na ich podstawie pozycja jest względna. Przetwarzanie tych sygnałów na dane na temat pozycji, prędkości obrotowej etc. realizowane jest zawsze zdalnie.

    Jak korzystać z impulsatora (enkodera impulsowego) podłączonego do Arduino
    Krok 3. Czym jest inkrementalny enkoder obrotowy

    Enkoder inkrementalny podaje informacje na temat zmiany pozycji i jej kierunku (obrót zgodnie i przeciwnie do kierunku ruchu wskazówek zegara). W wielu aplikacjach taka funkcjonalność jest kluczowa, jednakże element ten nie śledzi pozycji bezwzględnej. Z uwagi na to w niektórych zastosowaniach enkodera może być konieczna inicjalizacja go poprzez przemieszczenie go do jakiejś znanej, ustalonej pozycji.

    Jak korzystać z impulsatora (enkodera impulsowego) podłączonego do Arduino
    Krok 4. Budowa i zasada działania

    Przykładowy enkoder, jaki wykorzystamy w tutorialu, posiada wbudowane wszystkie potrzebne rezystory podciągające linie I/O. Element ten posiada pięć pinów wyjściowych:

    Zegar, Dane, Przełącznik, Vcc, GND.

    Budowa

    Pokrętło, którym kręcimy, jest wewnętrznie połączone z dyskiem wewnątrz enkodera. Będzie się on ruszał zgodnie z lub przeciwnie do ruchu wskazówek zegara, tak samo jak pokrętło, którym obraca użytkownik. Na powierzchni tego dysku znajdują się pola podłączone do linii zasilania. Pozostała część dysku znajduje się na potencjale masy. Nad dyskiem znajdują się dwa styki przesunięte względem siebie o określoną odległość - to wyprowadzenia Zegara oraz Danych.

    Zasada działania

    W momencie gdy obracamy enkoderem stan wyjść będzie zmieniał się wraz z położeniem dysku w enkoderze. Na wyjściu Zegarowym i Danych możemy zaobserwować w takiej sytuacji ciągi impulsów.

    Jeśli spojrzymy na te impulsy, to możemy dostrzec, że są one przesunięte w fazie o 90 stopni. Jeśli enkoder obraca się zgodnie z kierunkiem wskazówek zegara, to impulsy na wyjściu zegarowym będą pierwsze, a jeżeli enkoder obraca się w drugą stronę, to pierwszy impuls pokaże się na wyjściu danych.

    Analizując zmianę stanów na tych dwóch wyjściach, można natychmiastowo ocenić, w którą stronę obraca się pokrętło enkodera. Spróbujmy teraz zrealizować tą analizę programowo w Arduino.

    Krok 5. Oprogramowanie

    Przykład 1: (Counter.ino)

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W tym przykładzie pin zegarowy podłączony jest do pinu 3, a pin danych do pinu 4. Do pinu 5 podłączyliśmy przełącznik, który aktywuje się, gdy naciśniemy enkoder.

    W powyższym programie najpierw zdefiniowaliśmy szereg zmiennych oraz ustawiliśmy piny, do których podłączono enkoder jako piny wejściowe. Finalnie uruchomiono port szeregowy, który wykorzystamy do komunikacji i przesyłania danych.

    Następnie uruchamiana jest główna pętla programu. To tutaj odczytujemy stan wejść enkodera. Obecny stan zapisywany jest do zmiennej state. Jeśli w którejkolwiek iteracji state != state to znaczy, że enkoder się obrócił. Następnie, jeżeli data != state to znaczy, że enkoder obrócił się zgodnie z kierunkiem wskazówki zegara, a przeciwnie jeśli zmienne są równe. Te impulsy z enkodera będą odpowiednio zwiększać i zmniejszać licznik.

    Aktualna wartość licznika jest następnie przesyłana poprzez interfejs szeregowy. Jeśli naciśnięty zostanie przycisk, to licznik zostanie wyzerowany, a nowa wartość także przesłana poprzez port szeregowy.

    Na końcu pętli nowy stan zapisywany jest do zmiennej state i cały cykl może rozpocząć się od nowa.

    Przykład 2: (LEDBrightness.ino)

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W tym przypadku, będącym modyfikacją pierwszego programu, wartość licznika wykorzystana jest do sterowania jasnością diody poprzez PWM. Wartość licznika zamiast na interfejs UART kierowana jest do funkcji analogWrite. Należy tylko ograniczyć wartość licznika do wartości od 0 do 255, gdyż takie wartości przyjmuje zmienna kontrolująca wypełnienie PWMa.

    I tylko tyle potrzebne jest, aby w najprostszy sposób obsłużyć enkoder obrotowy - impulsator w naszym urządzeniu. Czy Wy korzystacie w swoich projektach z takiego elementu? Pochwalcie się swoimi implementacjami i urządzeniami, niekoniecznie opartymi o moduły Arduino.

    Źródło: https://www.instructables.com/id/How-to-Use-an-Rotary-Encoder-With-Arduino/


    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • #2 24 Lip 2018 06:08
    noel200
    Poziom 25  

    Kilka razy skorzystałem z impulsatora. Wdzięczne urządzenie. Małe, a kilka funkcji można na nim zrealizować.
    Ja tylko korzystam z biblioteki rotary.h

  • #3 24 Lip 2018 06:42
    Slawek K.
    Poziom 29  

    Przy enkoderze zdecydowanie odczyt w przerwaniach, przy rozbudowanym kodzie w trybie polling (jak wyżej) po prostu przestaje działać.

    Pozdr

  • #4 24 Lip 2018 08:18
    3149400
    Użytkownik usunął konto  
  • #5 24 Lip 2018 12:46
    Paweł Es.
    Pomocny dla użytkowników

    Incremental encoder, to jest po polsku koder przyrostowy, co się wszyscy uparli na tę kalkę typu ENKODER ?

    Tekst wyjściowy jest tak napisany po polsku jak lektor mówi po angielsku ;) , poza tym są w nim błędy (np. w nazwach zmiennych w stosunku do kodu programu). Wypadało by by tłumacz nie robił przekładu na pałę, tylko dokonał korekty merytorycznej i sprawdzenia czy wszystko się zgadza, bo tak to i jego praca traci na wartości i jeszcze się niedoświadczonych czytelników wprowadza w błąd.

  • #6 24 Lip 2018 13:43
    3149400
    Użytkownik usunął konto  
  • #7 24 Lip 2018 14:17
    Paweł Es.
    Pomocny dla użytkowników

    Dwumlask, to tylko chyba u Jana Bieleckiego ;)

    Dbajmy o swój język rodzimy, tam gdzie to możliwe.

    "- Zwis męski - ???
    - Zwis nocny - ???" - słownik komercyjny? (perlator z wleką, latarka bryzgoszczelna itd) ;)

  • #8 24 Lip 2018 15:05
    SylwekK
    Poziom 29  

    Te algorytmy z artykułu niestety kiepskie są i wyłożyły by się na ułamku tego co poniżej...
    W moim projekcie w C na Atmega32 taktowana 16MHz na dzień dzisiejszy (bo projekt jest rozwijany cały czas) obsługuje:
    - 2x encoder 1600imp/obr z prędkością max 15obr/s,
    - 2x encoder 10imp/obr z vmax 10000obr/min,
    - 1x encoder 25imp/obr z vmax 1000obr/min,
    - dwa programowe niezależnie regulowane generatory impulsów,
    - przyciski,
    Do tego jeszcze kupa operacji matematycznych, czytanie adc, obsługa lcd buforowa, itp.
    Nic się nie gubi, nie tnie, wszystko zlicza... Biblioteki oczywiście własne.
    Tak to urządzenie wygląda i już działa :)
    Jak korzystać z impulsatora (enkodera impulsowego) podłączonego do Arduino
    Jest szansa, że niedługo opiszę całość w DIY :)

  • #9 24 Lip 2018 15:49
    simw
    Poziom 21  

    SylwekK napisał:
    Atmega32 taktowana 16MHz na dzień dzisiejszy (bo projekt jest rozwijany cały czas)

    Bibliotekę od Sylwka stosuję z powodzeniem już od dawna, oczywiście starą, chyba jedną z pierwszych wersji. To świetny kawałek kodu. Korzystam również na STM, bo niby dlaczego nie :)
    Próbowałem kiedyś gubić impulsy enkoderem optycznym 365 imp/obrót, stosując jakąś prostą przekładnię, ale nie udało mi się :), zatem moim skromnym zdaniem potwierdzam, że jest niezła.
    Sylwek koniecznie opublikuj najnowszą wersję, i to chyżo! :)

  • #10 24 Lip 2018 19:21
    szczepan999
    Poziom 11  

    Odczyt enkodera tylko przez pooling.
    Z tego prostego powodu ze jest deterministyczny.
    W przypadku drgających styków na przerwaniach nagle dostaniesz 10x taka częstotliwość wywoływania funkcji.

    Ja w jednej maszynie mam serwomotor którym steruję impulsowo i odczytuję pozycję enkoderem. Podczas ruchu jest jakieś 20-30 tys impulsów z enkodera na sekundę. Czestotliwość poolingu ustawiłem nieco poniżej max wydajności tego AVRa uwzględniając resztę rzeczy które on robi. W efekcie maszyna może cały dzień chodzić i nie gubi ani jednego impulsu. Nie wyobrażam sobie jak można uzyskać podobną przewidywalność przerwaniami.

    Czyli prawidłowo:
    - wybieramy sobie timer który ma najwyższy priorytet w tablicy przerwań
    - ustawiamy odpowiednią częstotliwość dla tego timera
    - w procedurze jego obsługi zawieramy kod zwiększający lub zmniejszający wartość jakiejś zmiennej globalnej reprezentującej pozycję enkodera

    Cokolwiek dalej robimy w innych miejscach programu (pętla główna, inny timer) to robimy w oparciu o wartość tej zmiennej globalnej. Daje to gwarancję tego, że odczyt enkodera ma najwyższy priorytet i zawsze działa tak samo.

  • #14 25 Lip 2018 09:42
    3149400
    Użytkownik usunął konto  
  • #15 25 Lip 2018 10:05
    SylwekK
    Poziom 29  

    nowyARM napisał:
    Amatorzy (Aduinowcy) tak właśnie myślą. Nie wiedzą co to timer.

    Możesz rozwinąć myśl? Ja akurat arduinowcem nie jestem, do odczytu używam przerwań timera, a nie zewnętrznych, więc nie za bardzo rozumiem Twojej uwagi.

  • #16 25 Lip 2018 18:11
    Paweł Es.
    Pomocny dla użytkowników

    W urządzeniach profesjonalnych stosuje się często wstępny filtr usuwający efekty drgań styków kodera obrotowego, np. coś takiego:

    Jak korzystać z impulsatora (enkodera impulsowego) podłączonego do Arduino

    Pokazany wyżej układ był zastosowany do każdego kodera w układzie, a każda czwórka koderów była odczytywana przez rejestr równoległo-szeregowy HCT165 czyli metodą odpytywania. Dodatkowo w urządzeniu było też wykrywanie samo dotknięcie metalizowanego pokrętła kodera co powodowało podświetlenie na ekranie zmienianej wielkości.

    Zależnie od typu użytego kodera w układzie zmieniały się tylko wartości kondensatorów filtrujących C1 i C2 (od 1n do 10n).

    Nie wiem tylko jak często były odpytywane te kodery ale pewnie ze 20-30 razy na sekundę (kodery były typu 24 impulsy na obrót).

  • #17 25 Lip 2018 18:33
    SylwekK
    Poziom 29  

    Jakikolwiek układ z kondensatorami przy enkoderze jest u mnie na starcie stracony, bo ogranicza prędkość jego odczytu. Może w mało wymagających aplikacjach to zdaje egzamin, ale na pewno nie w PROFESJONALNYCH. Często w popularnym sprzęcie RTV i AGD spotyka się obłożony filtrami enkoder, który działa poprawnie tylko przy wolnym kręceniu. Może to być nawet znana i popularna firma jednak o profesjonalizmie nawet nie ma tu co mówić.
    Zapewniam Cię, że można zrobić niewielki i w miarę szybki program, który świetnie poradzi sobie z drgającymi stykami ;-)

  • #18 25 Lip 2018 21:40
    Paweł Es.
    Pomocny dla użytkowników

    Szczególnie jak tych koderów w urządzeniu jest np. 40 (do ustawiania parametrów różnych) tak jak w tej konsolecie cyfrowej, z której pochodzi ten układ. To nie jest do napędów tylko do koderów ręcznie obracanych. ;)

  • #19 25 Lip 2018 22:35
    SylwekK
    Poziom 29  

    Mimo wszystko obsługa z kondensatorami gdzie zazwyczaj część programową traktuje się po macoszemu mnie irytuje, bo wystarczy lekkie zużycie enkodera czy niewielkie zabrudzenie (co wzmaga drgania styków) i praktycznie nie można z niego korzystać. Mój algorytm kompensuje drgania w czasie rzeczywistym i przestanie zliczać jak już naprawdę uszkodzenie mechaniczne będzie poważne.

  • #20 26 Lip 2018 12:46
    Janusz_kk
    Poziom 19  

    SylwekK napisał:
    Mój algorytm kompensuje drgania w czasie rzeczywistym i przestanie zliczać jak już naprawdę uszkodzenie mechaniczne będzie poważne.

    No to zrób coś dla świata i pochwal się tym algorytmem :)

  • #21 26 Lip 2018 13:13
    Janusz_kk
    Poziom 19  

    Patrzyłem w Twoje linki i nie znalazłem ale przyznaję że nie szukałem zbyt intensywnie, znalazłem wsady ale to mnie nie interesuje bo nie powielam
    czyiś pomysłów, jeśli już to szukam inspiracji.

    Dodano po 1 [minuty]:

    SylwekK napisał:
    Juz to kiedyś zrobiłem... google Ci zablokowali?

    A google to wielki śmietnik, nie mam czasu na grzebanie tam.