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

Próba zbudowania 6 osiowego robota "ala przemysłowego" wraz z sterowan

11 Wrz 2019 22:58 213 4
  • Poziom 14  
    Próba zbudowania 6 osiowego robota "ala przemysłowego" wraz z sterowan

    Próba zbudowania 6 osiowego robota "ala przemysłowego" wraz z sterowan

    Witam,
    Miałem wcześniej w planach zgłosić się z prośba o pomoc w zaprogramowaniu, jak wszystkie osie bedę miał juz gotowe, ale niestety przy próbie uruchomienia 3 osi napotkałem problemy z odczytem enkoderów.
    Zaczynając od początku, mój pomysł zrodził sie po przypadkowym wejściu na stronę:
    https://www.instructables.com/id/Build-a-Giant-3D-Printed-Robot-Arm/
    Na chwilę obecną, tak jak to widać na zdjęciach mam zmontowane 4 osie, z czego 3 podpięte razem z silnikami i enkoderami. Na początku myślałem czy by nie spróbować tego napisać w PLC siemensa z wykorzystaniem szybkich liczników pod enkodery, ale jednak finansowo mnie to przerosło, dlatego postanowiłem zacząć pisać program i robić wstępne okablowanie na ESP32 z wykorzystaniem środowiska Arduino.
    Ogólnie muszę powiedzieć, że ta konstrukcja, sposoby łączenia ze sobą osi (poza pierwszą, którą na pewno poprawię), są rewelacyjne. W mojej ocenie jest to dosyć stabilna konstrukcja, chociaż sporo pozmieniałem. Chciałem, dodatkowo zamontować enkodery inkrementalne do poprawnego odczytu pozycji i niestety tu pojawiają sie problemy:
    Zamontowałem na razie na 3 osie enkodery inkrementalne 600imp/obr typu NPN. Dodatkowo mam płytkę z rezystorami podciągającymi, aby mieć wyjście PNP. Są to chińskie enkoderki za 34zł/szt.
    Zasilam je napięciem 5V i z kanalów A i B, takie napięcie wchodzi na wejścia ESP32. Poniżej kod obsługi przerwań od obliczania pozycji danej osi:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dzięki takiemu wykrywaniu każdego zbocza, mogę uzyskać 2400 pozycji na 1 obrót.
    Problemem jest to, że kiedy uruchomione są silniki krokowe, to enkodery nie zliczają poprawnie pozycji
    Próba zbudowania 6 osiowego robota "ala przemysłowego" wraz z sterowan
    Tak wygląda to tymczasowo. Po prawej sterownik, a na lewo płytka do podpięcia enkoderów. Ekran enkoderów podpięty jest do masy, czyli teoretycznie tam gdzie przewody enkoderów są w kontakcie z przewodami silników krokowych, tam jest ekran. Próbowałem na zwolnionych silnikach ruszać szybko, wolno każdą osią i układ nie zgubił pozycji. Myślałem, że może coś namieszane jest w algorytmie podczas jazdy, ale nie. Po prostu silniki krokowe wprowadzaja chyba zakłócenia, chociaż na oscyloskopie nie zauważyłem ani jednego piku.
    Co mógłbym zrobić, może jakieś małe kondensatory?

    Ogólnie Całość ma być sterowana przez ESP32, a te z kolei ma być parametryzowane przez aplikację napisana w C#. Wszystko na prawdę ładnie chodzi, jeżeli ktoś byłby zainteresowany to chętnie pokażę oba projekty, ale żeby to w ogóle chodziło, musiałbym się uporać z enkoderami także poproszę o pomoc w tym temacie. Taka pajęczyna z kablami jest oczywiście tymczasowo i starałem się aby przewody kanałów enkoderów nie sąsiadowały z innymi kablami
  • PCBway
  • Pomocny post
    Poziom 24  
    Skoro masz 2400 na obrót to dużo. Silnik krokowy przy zahamowaniu może drży i enkoder odczytuje to jako impulsy albo zakłócenia bo ekranów widzę nie ma, skoro programowo jest ok.
  • PCBway
  • Poziom 14  
    Próba zbudowania 6 osiowego robota "ala przemysłowego" wraz z sterowan
    Tak, silnik krokowy drży, ale teoretycznie każde wykryte zbocze powinno korygować pozycję. Tak jak widać na obrazku, ekran jest od enkodera do płytki z rezystorami podciągającymi. Od płytki do sterownika kanał A i B nie są ekranowane, ale czy na tak krótkim odcinku może wystąpić jakieś zakłócenie? Czy mógłbym zasilić enkoder z +24V, a same sygnały A i B tylko puszczać na 5V? Jego napięcie zasilające jest w zakresie 5-24V
  • Pomocny post
    Poziom 24  
    Ja miałem kiedyś taki program że sterownik odczytywał mi impulsy z enkodera jak silnik był zahamowany. Po wymianie drivera który sterował silnikiem nie miałem takiego problemu.
  • Poziom 14  
    Próba zbudowania 6 osiowego robota "ala przemysłowego" wraz z sterowan
    Co prawda nie wymieniłem sterownika, ale postanowiłem, że do odczytu pozycji enkoderów zastosuję Arduino Mega. ten sterownik ma możliwość 6 przerwań zewnetrznych, co akurat pasuje na 6 sygnałów z 3 enkoderów. Wyniki przesyłam co 2ms do ESP32 po UART używając Serial3.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Niestety, okazuje się, że tak częsty przesył danych za bardzo obciąża już mocno obciążone ESP32 i mój jakby "master" się zawiesza. Nie jestem zbyt dobry w tym Arduino, Może spróbowałbym napisać to jeszcze raz "moduł po module" konsultując to z wami koledzy. Wieczorem postaram się przygotować samą wymianę danych zwracając się z zapytaniem czy taki sposób jest prawidłowy. Czego na razie jestem pewien to, że odczyty z enkoderów są poprawne i żadna z trzech osi nie zgubiła nawet na moment pozycji.

    Dodano po 4 [godziny] 25 [minuty]:

    Chcąc najpierw uzyskać informacje o danych z Arduino Mega, czyli pozycje enkoderów oraz przesyłać te dane do Aplikacji, w kodzie ESP32 mam coś takiego:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeżeli chodzi o odbiór pozycji enkodera z arduino mega, tym zajmuje sie funkcja:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    wywoływana z pętli loop. Jeżeli Arduino Mega wyśle dane, to powyższa funkcja rozdziela otrzymana linijke tekstu na słowa po kropce, a nastepnie odpowiednie słowo trafia do pozycji danej osi jako przekonwertowana wartość liczbowa:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    W tym temacie nie ma problemu, działa to świetnie i nie ma mowy o gubieniu pozycji.
    Drugą rzeczą jest wysyłanie danych do aplikacji:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Co 0,5 sekundy timer ustawia bit wyslij_dane_do_aplikacji na 1 wysyłana jest linijka tekstu o wartości pozycje.0.0.0.0.0.0. Jeżeli ruszyłbym którąś z na razie trzech osi, to któreś z pierwszych trzech zer by się zmieniło na bieżącą wartość przesuniętej osi.
    Na chwile obecną chciałbym jedynie uzyskać poprawny odczyt tego co wysyła ESP32 na aplikacji napisanej w C# w bezpłatnym środowisku Visual Studio. Aplikację tworzę w sposób pokazany na poniższym filmiku:

    Niestety jak widać odczyt nie zawsze jest poprawny, także tutaj już jest problem. Przerwania timera ustawione są na co 10 mikrosekund z tego względu, że później będę chciał wykorzystywać to do sterowania częstotliwością taktowania silników krokowych.