logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Arduino Mega + Nextion: Sterowanie siłownikami i silnikiem, pozycjonowanie elementów A i B

Ficek_F 03 Sty 2023 23:17 483 5
REKLAMA
  • #1 20366410
    Ficek_F
    Poziom 12  
    Witam.

    Na początku opisze mój problem.

    Układ z Arduino Mega + wyświetlacz Nextion

    Mam 3 podstawowe funkcje sterujące :

    1. Funkcja 1 – steruje pozycją elementu A za pomocą dwóch siłowników elektrycznych. Jeden odpowiada za podnoszenie i opuszczanie w pionie, a drugi za wsuwanie i wysuwanie w poziomie. Pozycjonowanie odbywa się za pomocą odczytu aktualnego położenia każdego z siłowników (sygnał 0-10V) i porównanie z wartością zadaną wprowadzaną z wyświetlacza. Sygnały sterujące wyprowadzane są na przekaźniki. Funkcja załączana przyciskami na wyświetlaczu Nextion.

    2. Funkcja 2 – steruje podnoszeniem i opuszczaniem elementu B poprzez obroty silnika prawo / lewo – element może przyjąć tylko dwa skrajne położenia, albo całkowicie podniesiony, albo całkowicie opuszczony. Sterowanie poprzez przekaźniki. Sygnał sterujący przekaźnikami trwa przez zadany okres czasu (zmierzony doświadczalnie). Funkcja załączana przyciskami na wyświetlaczu Nextion.

    Ważne. Funkcja 1 i 2 są powiązane ze sobą. Urządzenie B (funkcja 2) może działać tylko wtedy gdy urządzenie A (funkcja 1) osiągnęło umowną pozycję 0 w poziomie

    3. Funkcja 3 – sterowanie zmianami efektów świetlnych dla taśmy z adresowalnymi diodami RGBW. Na chwilę obecną jest 10 efektów. Funkcja skonstruowana jest w oparciu o maszynę stanów. Z wyświetlacza wybierany i załączany jest konkretny efekt świetlny. Po jego załączeniu powinien on pracować aż do momentu wyłączenia lub zmiany na inny.

    W funkcjach nie używam instrukcji delay. Każda z funkcji niezależnie działa poprawnie.

    Problemy zaczynają się gdy chce używać wszystkich funkcji równocześnie w jednym programie. Wtedy albo taśma LED przestaje działać poprawnie i generować efekty świetlne (szczególnie te gdzie są zależności czasowe w sterowaniu poszczególnymi diodami), albo "rozjeżdża" się sterowanie elementami A i B.

    Zależy mi na tym, aby gdy załączę sterowanie taśmami LED to uruchomienie sterowania elementami A i B nie miało wpływu na świecenie taśm i odwrotnie, praca taśm nie powinna wpływać na sterowanie elementami A i B (szczególnie na zależności czasu podnoszenia / opuszczania elementu B)

    Próbowałem już timerów i funkcji mils, ale wydaje mi się że to nie jest właściwa droga (być może robię gdzieś błąd) bo te metody zakładają że funkcje są wykonywane co zadany okres czasu, a tutaj chyba potrzebne jest rozwiązanie z jednej strony działające ciągle (funkcja 3 - taśma LED + komunikacja z Nextion), a z drugiej aktywujące wybrane funkcje (funkcja 1 i 2) w przypadku wywołania ich z poziomu wyświetlacza.

    Zastanawiam się czy nie powinienem użyć Arduino FreeRTOS, ale nie wiem czy to jest rozwiązanie mojego problemu.

    Na chwilę obecną zabrakło mi pomysłów.

    Prosiłbym o naprowadzenie mnie na rozwiązanie jakiego powinienem użyć. Będę wdzięczny za wszelkie podpowiedzi.

    Zaakceptuję również odpowiedź, że Arduino jest za słabe do realizacji takiego zadania szczególnie, że w przyszłości przewiduję rozbudowę o dodatkowe elementy.
  • REKLAMA
  • Pomocny post
    #2 20366647
    tmf
    VIP Zasłużony dla elektroda
    Ficek_F napisał:
    Zastanawiam się czy nie powinienem użyć Arduino FreeRTOS, ale nie wiem czy to jest rozwiązanie mojego problemu.

    Jeśli planujesz sobie odstrzelić kolana, to jest to doskonały pomysł.
    Ficek_F napisał:
    Próbowałem już timerów i funkcji mils, ale wydaje mi się że to nie jest właściwa droga

    W tym przypadku to najwłaściwsza droga.
    Problem należy podzielić na kilka niezależnych elementów:
    - w oparciu o przerwania zrealizować komunikację z modułem Nextion. Czyli coś w rodzaju bufora, plus prosta interpretacja poleceń z GUI wrzucająca je do kolejki skąd są pobierane przez resztę programu.
    - nie wiem jakie masz diody adresowalne, ale zapewne tu tkwi sedno problemu - funkcja realizująca efekty jest napisana w sposób blokujący, zapewne spaprana jest obsługa protokołu. Ale nawet jeśli te funkcje są blokujące, to jeszcze da się problem rozwiązać, patrz dalej.
    - oczywistym jest, że dla realizacji funkcji 1 i 2 najlepiej zrobić coś w rodzaju maszyny stanów. To rozwiąże zależności pomiędzy tymi funkcjami. Obsługa tej maszyny stanów powinna być zrobiona w przerwaniach - wywoływana rozsądnie często (czyli zależy to od stałej czasowej feedback z maszyny - zmiana pozycji).
    Problemy - jeśli skopana jest realizacja protokołu sterowania LEDami, to należy go poprawić (co to za diody adresowalne?), najlepiej tak, aby wykorzystywał hardware, w ostateczności dodać sekcje krytyczne, bo zapewne przerwania rozwalają timingi. Niemniej lepiej to po prostu dobrze napisać. Problem drugi - trzeba dobrze napisać pobieranie poleceń z kolejki poleceń GUI, bo będziesz miał dostęp do tej kolejki z różnych "wątków". Z drugiej strony jeśli obsługa LED będzie poprawnie napisana, to całość można wrzucić w jedną maszynę stanów sterowaną w jednym "wątku", co rozwiązuje drobne problemy.
    Ficek_F napisał:
    Zaakceptuję również odpowiedź, że Arduino jest za słabe do realizacji takiego zadania szczególnie, że w przyszłości przewiduję rozbudowę o dodatkowe elementy.

    To co opisałeś do tej pory myślę, że dałoby się zrealizować na INTEL4004, więc tu raczej nie MCU jest problemem.
  • REKLAMA
  • Pomocny post
    #3 20366817
    khoam
    Poziom 42  
    Ficek_F napisał:
    Próbowałem już timerów i funkcji mils, ale wydaje mi się że to nie jest właściwa droga

    Możesz użyć TaskScheduler i nie odstrzelisz sobie kolan ;)
    Link
  • REKLAMA
  • #4 20366830
    kaczakat
    Poziom 34  
    W Arduino UART działa na przerwaniach. Jak nie pokażesz kodu to nie ma co wróżyć, możesz nie mieć delay, a blokować kod na wiele ms transmisjami realizowanymi inaczej niż ta po UART w przerwaniach albo konstrukcjami typu for, until czy while. Pasek RGB to dla mnie ledy 3 kolory, 3 piny i jakieś mosfety, a ledy programowalne to zupełnie inna historia.
    Zmiana uC to może być dobry pomysł, jeśli akurat na niego istnieje gotowe rozwiązanie Twojego problemu, w Arduino są obsługiwane uC z większą ilością RAM, DMA, I2S, można migać led jeszcze szybciej niż na zwykłym UNO :D.
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #5 20369587
    Ficek_F
    Poziom 12  
    Dziękuję za Wasze odpowiedzi.

    Co do moich kolan bardzo je lubię 😊 dlatego coś czułem że FreeRTOS to przerost formy nad treścią.

    tmf - po przeczytaniu Twojego wpisu zacząłem zastanawiać się nad tematem funkcji blokujących i mam dwa podejrzenia :

    1. Tak jak napisałeś funkcje sterujące taśmą LED – moje taśmy RGBW zawierają układ SK6812 i ich obsługa bazuje na zmodyfikowanej bibliotece FastLed (niestety nie pamiętam linku skąd ją mam) i tutaj rzeczywiście może być problem - biblioteka w załączniku

    2. Drugim podejrzanym został sam proces obsługi komunikacji z Nextion – bazowałem na filmach z tego kanału : [url=]https://www.youtube.com/@CheapControls/videos[/url]

    Niestety w moim wykonaniu odczyt z wyświetlacza nie jest oparty o przerwania, ani nie zawiera obsługi kolejkowania poleceń więc to potencjalnie kolejne źródło problemów

    khoam – dziękuję za podpowiedź odnośnie TaskScheduler

    Wygląda na to, że czeka mnie przepisanie sporej części programu – ale dzięki Wam mam dwa podejścia, które dobrze rokują na przyszłość. W obydwóch przypadkach muszę się jeszcze dokształcić.
  • #6 20369885
    tmf
    VIP Zasłużony dla elektroda
    Ficek_F napisał:
    Tak jak napisałeś funkcje sterujące taśmą LED – moje taśmy RGBW zawierają układ SK6812 i ich obsługa bazuje na zmodyfikowanej bibliotece FastLed (niestety nie pamiętam linku skąd ją mam) i tutaj rzeczywiście może być problem - biblioteka w załączniku

    Załączyłeś tylko nagłówek, rzuć okiem do kodu, jak jest zrealizowana transmisja. Jeśli widzisz tam jakieś delay, programowe opóźnienia, to jest to jeden z winowajców.
    Niestety większość osób publikujących kody ma jakąś awersję do hardware i potem są takie pseudokody, które działają, ale jak trzeba to połączyć z czymś innym to się robi problem. Nie piszę, że tu koniecznie tak jest ale warto to sprawdzić.
    Ficek_F napisał:
    Niestety w moim wykonaniu odczyt z wyświetlacza nie jest oparty o przerwania, ani nie zawiera obsługi kolejkowania poleceń więc to potencjalnie kolejne źródło problemów

    To duży kłopot, bo zapewne masz dosyć blokującą obsługę RS232, kiedy MCU bezczynnie czeka na transmisję kolejnych bajtów. To z pewnością jest do poprawy i zrobienia na przerwaniach.
REKLAMA