Jak najtaniej zbudować układ, który odczyta pozycję z enkodera inkrementalnego, skalibruje zakres od 0 do końca i wystawi odpowiadający mu sygnał 0-10 V albo 0-20 mA?
Da się to zrobić na mikrokontrolerze, a praktyczne rozwiązanie z wątku to Arduino Nano + enkoder inkrementalny z wyjściami A/B + endstop, z wyjściem PWM filtrowanym RC i wzmocnionym do 0-10 V przez op-amp, np. LM324 [#20886313][#20886545][#20890457] Enkoder kwadraturowy daje informację o kierunku, więc układ może zliczać pozycję w górę i w dół; do obsługi nie potrzeba bibliotek, tylko kilka linii kodu [#20886376][#20887132] Przy starcie pozycja jest nieznana, więc trzeba wykonać kalibrację na krańcówce lub przycisku, a pozycję min/max można zapisać do EEPROM po kalibracji, nie przy każdym kroku [#20890457][#20907949][#20908010] W odpowiedzi padła też propozycja, by użyć enkodera 50–100 imp/obrót, co przy takiej aplikacji powinno wystarczyć [#20887597] Arduino Nano 3.0 uznano za odpowiednie, najlepiej zasilać je z VIN 7–12 V, a sam sygnał wyjściowy z PWM można dopasować do modułu, który przyjmuje 0-5 V lub 0-10 V [#20888978][#20887309]
Szukam układu do odczytywania pozycji z enkodera inkrementalnego. Konkretnie chodzi mi o takie działanie: ustawiam pozycję 0, zapisuję i jadę w drugą stronę do końca, a następnie zapisuję, ile impulsów podał enkoder. Na koniec chciałbym, żeby przeliczał pozycje i wystawiał na wyjściu sygnał 0-10V albo 0-20mA. Czy istnieje taki moduł? Ewentualnie, czy jest jakiś projekt na Arduino? Jednak programowanie w moim przypadku jest praktycznie żadne.
Najważniejsze jest, żeby takie rozwiązanie nie kosztowało dużo pieniędzy.
Zwykły licznik góra - dół i przetwornik DA z wyjściem napięciowym lub prądowym, powinny załatwić sprawę.
Do realizacji na procku lub układach TTL/ CMOS.
Przy czym, przepełnienie, czyli wyjazd poza zakres, ignorowany. To znaczy, po dotarciu do min/ max następuje nasycenie wyjścia i dalsze kręcenie w tę samą stronę nic nie zmienia. Zmiana kierunku natomiast, wywołuje niezwłoczną reakcję.
Poza tym, działałoby to tylko do wyłączenia zasilania. Po ponownym uruchomieniu trzeba by od nowa programować.
Chyba, że założyć, iż podczas przerwy w dostawie prądu, stan enkodera nie ulega zmianie. Wtedy, w procedurze "brownout" można np. wpisać ostatnią pozycję do pamięci (zasadniczo, w wykonaniu procesorowym).
Albo zapewnić bateryjne podtrzymanie.
Witam kol. Mam pytanie chyba nie zna działania enkodera inkrementalnego
Licznik jest ok tylko w jednym kierunku obrotów, jeśli będzie się obracał w różnych to lipa licznik wszystko zliczy
Da się na mikrokontrolerze.
Sygnały A i B enkodera oraz przycisk zwierany do masy na wejściu, sygnał PWM o rozdzielczości 8-bitów na wyjściu.
Sygnał PWM filtrujesz filtrem RC i odpowiednio wzmacniasz wzmacniaczem operacyjnym do zakresu 0-10V.
Kalibrację pozycji będziesz musiał wykonać przy każdym włączeniu zasilania, bo przy starcie enkoder może się znajdować w dowolnej pozycji.
Kodowanie kwadraturowe, które jest standardem w enkoderach z dwoma wyjściami (wspomniane sygnały A i B) zawiera w sobie informację o kierunku ruchu, prawda?
Witam kol. Mam pytanie chyba nie zna działania enkodera inkrementalnego
Niewątpliwie Kol. zathura80 ma rację.
Podobnie, nie mam absolutnie żadnych informacji ponad te, które autor wątku zawarł w poście. Np. co do tego, czy "lipa", w ogóle się do liczenia pcha? Albo, jak traktować choćby błędnie zliczone obiekty - ignorować, wycofać?
[/quote]
W większości przypadków takie enkodery służą do precyzyjnego zaliczania obrotów i kontroli prędkości obrotowej
Oczywiście można sygnał z enkodera zaadaptować do różnych zastosowań poprzez odpowiednie przetworniki
Kontynuując moją propozycję. Do wyjścia PWM mikrokontrolera podłączasz taki oto układ:
Rezystor wyjściowy 1K nie jest wymagany. Użyty został tylko w celu symulacji).
Rezystor 7.1K zamieniasz na rezystor nastawny liniowy 10K i z jego pomocą ustawiasz 10V na wyjściu przy 100% PWM zadanym przez mikrokontroler.
Jako op-amp może pracować popularny LM324.
Mikrokontroler musi być zasilany ze stabilizowanego napięcia (przy wykorzystaniu Arduino, płytki te mają wbudowane stabilizatory).
Enkodery inkrementalne zwykle dają dwa sygnały, i sekwencja ich zmian zależy od kierunku obrotu (chyba, że autor ma enkoder z jednym sygnałem wyjściowym, wtedy można tylko zwiększać sygnał przez obracanie). Być może rozwiązaniem byłoby użycie potencjometru cyfrowego - najlepiej takiego, któremu odpowiadają sygnały, jakie daje enkoder (bo inaczej trzeba będzie konwertować sygnały).
Jak najbardziej enkodery inkrementalne nadają się do zliczania przebytej drogi. Pracuje w firmie jako utrzymanie ruchu i posiadamy na stanie maszyny które wykorzystują właśnie takie enkodery. I możecie być pewni, że właśnie zliczają przebytą drogę, albo kąt przechyłu. I to w obie strony. I we wszystkich przypadkach są to enkodery inkrementalne. Więc czy nadają się do takiej aplikacji nie mam żadnej wątpliwości.
gps79
I teraz właśnie pojawią się problem. Bardzo chętnie zbudował bym takie użądzenie na arduino. Dość tania platforma więc można zainwestować. Czytałem nawet że są biblioteki do odczytu takich enkoderów. Ale sam nie jestem w stanie zaprogramować takiego układu, bo poprostu nie umiem programować. Dlatego szukam gotowego rozwiązania. Co do zaniku prądu, zdaję sobie z tego sprawę żę stracę pozycje. Ale to można rozwiązać kalibracją w końcowych punktach. Czyli przy dojechaniu do początku lub końca, automatycznie kalibruje się pozycja. Tak właśnie mamy rozwiązane to w dwóch maszynach, gdzie jest duża szansa na utratę pozycji poprzez poślizg koła napędowego. Tylko takie punkty są w środku trasy i kalibracją robi się za każdym przejazdem.
Akurat do obsługi enkodera nie potrzeba bibliotek, bo to kilka linijek kodu.
Coś więcej powiesz o sygnale wejściowym (maksymalna ilość impulsów na sekundę, największa możliwa ilość impulsów do zliczania) i wyjściowym (jaka jest wymagana rozdzielczość napięcia wyjściowego, jaki błąd jest akceptowalny)?
Myślałem aby to użyć w systemie inteligentnego domu do sterowania rolet, bramy garażowej i zasłon. Więc nie jest potrzebna jakaś super dokładność. Jeśli chodzi o sygnał wejściowy to nie jestem w stanie dokładnie określić. Na alliex... można kupić tanie enkodery optyczne z ilością impulsów 600 na obrót, I taki myślę że by wystarczył w takich urządzeniach. Przy założeniu 600 impulsów na obrót myślę że będzie to z 3 może 4 tysiące impulsów. Więcej może być przy karniszu. Do rolet w tym momencie używam rozwiązania producenta które polega na na zliczania czasu otwarcia i zamknięcia rolety. Ale to nie jest najbardziej precyzyjne. A do karnisza można użyć gotowych rozwiązań, tylko że nie bardzo gadają z tym systemem co wybrałem. A nie chce też polegać na wifi bo jest zawodne i wszystko robie po kablach.
Ponieważ taki sygnał przyjmuje moduł w systemie, który wybrałem. Jest to system Grenton, polskiego producenta. Można by to było połączyć poprzez Modbus albo HTTP. Z tym że gotowe rozwiązania nie wystawiają na zewnątrz swojej pozycji. I tak się właśnie zastanawiałem nad takim pozycjonowaniem. A do tego gotowe rozwiązania do zasłon to wielkie puszki, które zwisają z karnisza. A ja chciałbym tę puszkę schować w suficie podwieszanym. Mogłbym użyć serwa z Chin i sprzęgła elektrycznego na 24V DC i właśnie tego nieszczęsnego enkodera. Wtedy na aplikacji w telefonie będę miał informację zwrotną w jakiej pozycji jest zasłona. A przez sprzęgło również będzie możliwość operowania zasłoną manualnie.
Przepraszam za opóźnienie w odpowiedzi, ale jestem właśnie w pracy. I piszę w wolnych chwilach.
I jeszcze dziękuję za zainteresowanie tematem i pomoc.
Ok., parametr enkodera znamy, ale chyba nie chcesz znać każdego z tych 4 tysięcy położeń rolety z dokładnością do 7 miejsc po przecinku. co nie?
Jak sądzę, 128 powinno być w sam raz.
Dobra - 256 w wersji premium.
Zarzuć może jeszcze linke do jakiegoś naprzykładowego, taniego Chińczyka, z tych, o których wspomniałeś.
Chodzi o to, czy ma tylko wyjścia z odbiorników optyki, czy już wbudowaną elektronikę logiki "kierunkowej".
W drugim przypadku, jak napisano, wystarczy zwykły licznik impulsòw. Pierwszy natomiast wymagać będzie ręcznej rzeźby w tzw. hardware lub napisania stosownej procedury obsługi, uwzględniającej także zatrzymanie w ròżnych położeniach, czyli np. niepełne "przejścia", a także dalszy ruch - naprzòd lub do tyłu.
Nie jest to skomplikowane - parę bramek i przerzutnikòw lub kilka sztuk "If ... Then" więcej.
Dla mnie to trochę rozbudowany system dla zwykłych zasłon. Rolety zewnętrzne to ok.
Tutaj zastosował bym parę wyłączników krańcowych i sterownik silnika. Urządzenie proste mniej awaryjne i tanie
Program do Arduino nie będzie problemem, jak podasz, jaką logiką ma się kierować. Przynajmniej jeden endstop będzie konieczny, aby po napotkaniu na niego "wyzerować" licznik pozycji do wartości min lub max zapisanej w EEPROMie. Oznacza to, że po włączeniu zasilania startujesz z pozycji niewiadomej i taka pozostanie do czasu napotkania endstopu. Chyba, że urządzenie ma się zachowywać inaczej. Na razie wiemy, jakiego zachowania oczekujesz z postu #1, ale nie wierzę, że przy każdorazowym zaniku zasilania będziesz guziczkiem kalibrował wszystkie rolety.
Nie podałeś, z jaką maksymalną prędkością będzie się obracała oś enkodera.
Tak masz rację. Nie potrzeba znać dokładnej pozycji z tych 4000 impulsów. Ale procesor musi je wszystkie odczytać. Jeżeli będzie je pomijał zacznie się wszystko rozjeżdżać. Ale konkretnie to chodzi mi o to że zaczynamy programowanie, ustawiam pozycje 0 i jedziemy do samego końca, zapisujemy pozycje końcową a procesor zapamiętuje ile impulsów podał w tym czasie enkoder. Dzieli to na 100, tak żeby rozdzielczość była 0.1v. W taki sposób nie potrzeba dokładnie znać enkodera może być 300 a może być 1024 impulsy na obrót. A procesor i tak wykona całą resztę. A jeżeli do tego dodamy pozycje kalibracji np. przy pozycji 0, to będzie trzeba programować taki układ tylko raz, jak uruchomimy albo wymienimy enkoder.
Przynajmniej ja tak to widzę, ale to wcale nie musi tak działać. Może właśnie trzeba dokładnie znać typ enkodera żeby przerwania pasowały.
To link do przykładowego enkodera, można wybrać wersję ile impulsów:
https://pl.aliexpress.com/item/10050050717716...fJMLjuPJhvxoC-ZAQAvD_BwE&gatewayAdapt=glo2pol
A tu na ebay angielskim, z omrona więc chyba dość dobra jakość, I też nie zabija ceną:
gps79
Właśnie chodzi mi o takie działanie jak podałeś z endstopem. Programujemy tylko raz jak uruchamiamy albo wymieniamy enkoder. A po zaniku prądu wysyłam wszystkie rolety i zasłony do pozycji 0 gdzie jest endstop. Automatyka domu oczekuje na sygnał 0 albo 10V, tak układ zapamiętuje pozycje I wystawia odpowiedni sygnał. I od tego czasu wszystko już będzie działało jak powinno. Można dodać również kalibrację na endpoint, za każdym razem jak ten zostanie wyzwolony.
Taki skomplikowany układ ponieważ automatyka nigdy nie zna pozycji rolet ani zasłon, I są sytuację gdy czasy zapamiętane się rozjadą, ustawiam żeby roleta otwożyła się do połowy, a ona otwiera się 15%. I wtedy właśnie trzeba znowu kalibrować taką roletę. Wszystko przez to że system oszacowuje pozycje rolety, na podstawie czasu jazdy w dół i w górę. Tak samo jest z zasłonami. W zasłonach dochodzi jeszcze problem obsługi ręcznej. Po tym system kompletnie się zgubi. I w przypadku gotowych rozwiązań, zostaję tylko sterowanie zasłona otwórz, zamknij. A i tak muszą być krańcówki żeby nie spaliło silnika. Bo system będzie wyzwalał wyjście na odpowiedni " zapisany" czas działania.
I zapomniałem dodać.
Nie musi to być akurat 0-10v może to być również 0-5v bo moduł I takie sygnały przyjmuje.
Tak teraz jeszcze raz przeczytałem twój post. Jak pisałem byłem w pracy na noc 12h. Więc odpowiedzi pisze jak mam czas. Na pewno nie będą to zawrotne prędkości. Myślę że w roletach i zasłonach nie ma więcej jak 3 może 5 obrotów na sekundę. A i takie prędkości wydają się przy roletach spore.
Teraz niestety muszę iść spać bo dzisiaj znowu nocka 12h.
Jak coś to odezwę się znowu dopiero po 20:00
Ok. Dzięki. Zalecam zatem enkoder o rozdzielczości 50 lub 100 imp/obrót, co i tak w rzeczywistości da rozdzielczość 2x większą.
Więc z mojej strony taka jest propozycja rozwiązania:
-enkoder 50ppr
-1x pushbutton
-1x endstop
-arduino
-filtr dolnoprzepustowy RC
-op-amp np. LM324
-zasilanie op-ampa 12-30VDC
-zasilanie arduino - zależne od typu
Przy takiej konfiguracji jestem w stanie pomóc w napisaniu programu.
To będzie działać 24x7?
Taki jest plan, aby działał 24/7.
Arduino, polecasz jakiś konkretny typ, czy może być Nano v3.0 z ATmega328P?
Do tego konwerter DC-DC z 24V na 5V.
Enkoder może być chińczyk, czy może jednak zainwestować w tego Omrona?
Arduino Nano 3.0 jest OK. Na płytce jest LED, którą można użyć do wizualizacji stanu podczas kalibrowania.
Najlepiej zasilać je z wejścia VIN napięciem 7-12V DC. Zasilanie Arduino napięciem 5V (z zewnętrznego niepewnego źródła) często powoduje problemy ze stabilnością, których nie ma przy wykorzystaniu wbudowanego w Nano stabilizatora.
Nie mam wiedzy odnośnie jakości enkoderów, więc tutaj nie pomogę.
Wrzucam kod realizujący w/w założenia. Obsługa enkodera, to funkcja pinChangeINT(). Jak widać, to kilka linijek kodu.
- Na starcie program zakłada, że roleta jest na górze, co oznacza PWM=100%. Zjeżdżając w dół PWM zmniejsza się proporcjonalnie. Po napotkaniu endstopu (sygnał zwarty do masy) program uznaje, że roleta zjechała do samego dołu.
- Przy pierwszym uruchomieniu, gdy dane kalibracyjne nie zostały zapisane do EEPROMU następuje jedno długie mrugnięcie LED.
- Przy pierwszym uruchomieniu przed kalibracją LED mruga co 2s do czasu wykonania kalibracji.
- PWM działa z częstotliwością 31.4kHz i do tej częstotliwości należy dobrać filtr RC.
- pierwsze naciśnięcie przycisku, to zapamiętanie pozycji niskiej rolety (tu nie ma zapisu danych do EEPROMU). Potwierdzone podwójnym mrugnięciem LED.
- drugie naciśnięcie przycisku, to zapamiętanie górnej pozycji rolety i zapis parametru do EEPROMU. Potwierdzone długim sygnałem LED. Brak sygnału LED oznacza, że pozycja górna rolety nie różniła się od dolnej i nie było zapisu do EEPROMU.
- Możesz na bieżąco podejrzeć stan programu za pomocą terminala UART podłączonego do Arduino.
Dziękuję
Jak tylko wszystko dotrze będę składał i testował na stole.
Jeszcze tylko małe pytanie. Filtr RC ma być na wyjściu a op-amp na wejściu do arduino przed enkoderem, dobrze rozumiem?
- Enkoder (A, B, GND) podłączasz do wejść 2, 3, GND w Arduino.
- Wyjście 11 (PWM) i GND w Arduino podłączasz do układu (filtr RC + op-amp) z postu #10.
- Endstop podłączasz do wejść 5 i GND w Arduino.
- Przycisk podłączasz do wejść 4 i GND w Arduino
O dziękuję. Wyjścia i wejścia znalazłem w programie. Ale z filtrem RC wolałem się upewnić. Teraz już mam jasność i czekam na dostawę zamówionych elementów.
✨ Użytkownik poszukuje modułu do konwersji pozycji enkodera inkrementalnego na sygnał 0-10V lub 0-20mA, z możliwością kalibracji pozycji. W dyskusji podano, że enkodery inkrementalne dostarczają impulsy, ale nie informują o kierunku obrotu, co może być problematyczne. Proponowane rozwiązania obejmują użycie mikrokontrolera (np. Arduino) do zliczania impulsów oraz przetwornika DA do generowania sygnału wyjściowego. Wskazano na potrzebę kalibracji pozycji przy każdym uruchomieniu oraz na możliwość zastosowania endstopów do ustalania pozycji. Użytkownik rozważa zastosowanie enkodera o rozdzielczości 600 impulsów na obrót, a także systemu Grenton do integracji z inteligentnym domem. Wskazano na możliwość użycia kondensatorów do podtrzymania zasilania oraz pamięci EEPROM do zapisywania pozycji. Wygenerowane przez model językowy.