Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Ramię robotyczne - własna konstrukcja i oprogramowanie

krolikbest 28 Jan 2022 08:59 2190 2
Computer Controls
  • Geneza projektu
    Mając na co dzień do czynienia z zagadnieniami robotyki i automatyki oraz budowy własnych systemów sterowania, zacząłem zastanawiać się nad stworzeniem własnego eksperymentalnego manipulatora. Tak narodził się ten projekt, którego celem było i nadal jest rozwijanie oprogramowania sterującego robotem oraz zbieranie doświadczenia pozwalającego na stworzenie wersji do przemysłowego zastosowania.

    Założenia i budowa
    Praktycznie od razu zdecydowałem, że budować będę manipulator o czterech stopniach swobody, czyli ramie o trzech członach nazwanych odpowiednio R1, R2, R3 oraz obrót - O1, co ilustruje poniższy schemat:

    Ramię robotyczne - własna konstrukcja i oprogramowanie

    Kolejnym założeniem była architektura sprzętowa. Robot został wykonany z aluminium. Napędy R1,R2,R3 ramienia zostały zamontowane w korpusie, napęd O1 w ramie znajdującej się bezpośrednio pod korpusem robota. Przekazywanie ruchu odbywa się poprzez system przełożeń realizowanych przez aluminiowe koła pasowe i paski zębate. Logika sterująca została umieszczona w tej samej ramie aluminiowej co napęd od obrotu O1. Zasilanie elektryczne jest umieszczone w osobnej szafie. Całość ilustruje zdjęcie poniżej.

    Ramię robotyczne - własna konstrukcja i oprogramowanie


    Od strony napędowej ruch jest realizowany za pomocą silników krokowych o momencie: 4.5 Nm dla napędu R1, następnie 3Nm dla R2 i ostatni silnik dla R3 ma moment 2Nm, natomiast obrót jest realizowany przez silnik o momencie 4.5 Nm. Wszystkie silniki mają przełożenie co najmniej 1:3. Metodą empiryczną zmierzyłem maksymalny ciężar jaki może udźwignąć ramię bez utraty położenia i wynosi on około 0.4 [kg]. Test polegał na przenoszeniu ciężaru z jednego punktu do drugiego i trwał 60 minut.

    Każdy silnik posiada dołączony enkoder inkrementalny, który wykorzystuję w procesie odczytu położenia lub zadania ruchu. Logika sterująca pracą silników jest oparta o 4 moduły zgodne ze standardem Arduino Uno. Każda z tych płytek współpracuje z jednym sterownikiem silnika krokowego. Zadaniem modułu jest generowanie sygnału PWM do wykonania ruchu silnika przy równoczesnym odczycie impulsów enkodera oraz inne funkcje związane z ruchem robota. Generowanie PWM jest wykonane sprzętowo, odczyt impulsów enkodera odbywa się wykorzystując metodę przerwań sprzętowych. Istotne jest tutaj takie zoptymalizowanie kodu aby te dwa procesy nie zakłócały siebie nawzajem. Szczególnie dotyczy to dobrania takiej częstotliwości generowania PWM, aby odczyt impulsów enkoderowych był nie tylko możliwy ale aby działał poprawnie a samo ramię nie ruszało się z prędkością przysłowiowego ślimaka lub przy zbyt szybkim przemieszczeniu nie było utraty zliczania impulsów enkoderów. W następnym projekcie dotyczącym budowy manipulatora obecne podejście zostanie zmodyfikowane i rozdzielone na dwa układy.

    Rolę komputera głównego pełni Raspberry Pi 3B+ z systemem Raspbian Jessie. Na nim jest osadzona moja aplikacja która nadzoruje pracę manipulatora. Komunikuje się ona z modułami Uno za pomocą protokołu TWI (i2c) i portów I/O. Oprócz tych podstawowych układów, zastosowałem jeszcze nakładkę na Raspberry Pi z trzema wyjściami przekażnikowymi (Rpi Relay Board) do sterowania zewnętrznymi układami, jak np. chwytak pneumatyczny, oraz moduł wejść optoizolowanych do odczytu sygnałów generowanych przez np. czujniki indukcyjne. Schemat tego modułu zamieszczam poniżej

    Ramię robotyczne - własna konstrukcja i oprogramowanie


    Moduł ten pozwala na odczyt do 4 zewnętrznych źródeł sygnału. Każde wejście może pracować z napięciem do 36V. W zależności od napięcia dobiera się wartość rezystorów R1..R4.

    Oprogramowanie
    Moduły Arduino Uno zostały zaprogramowane w Bascomie. Tak jak wcześniej nadmieniłem, zadaniem ich jest generowanie PWM i odczyt enkodera, ale także komunikacja z Rpi. Podczas wykonywania zadanego skryptu większość czasu moduły Uno pracują autonomicznie a wymiana danych z Raspberry Pi zachodzi tylko wtedy, gdy silniki nie są w ruchu, inaczej mówiąc, gdy nie jest generowany sygnał PWM. Informacje wymieniane z Rpi mogą mieć postać bajtów – gdy wymiana przebiega po protokole TWI, lub sygnału wystawianego na dany port Uno lub Rpi. W tej ostatniej metodzie wymiany informacji konieczne jest zastosowanie konwerterów napięć, gdyż Arduino pracuje z poziomem napięć 5V, podczas gdy Rpi pracuje na napięciu 3.3V. Najważniejsze dane wymieniane między Uno i Rpi po magistarli TWI to informacja osiągnięcia pozycji przez dany silnik, przekroczenia zakresu ruchu danego silnika, wartości odczytu enkodera. Dwie pierwsze informacje również sygnalizowane są na odpowiednim porcie Uno – to tak dla pewności, że wszystko jest ok. Rpi wysyła po magistrali TWI nastawy do wykonania ruchu dla poszczególnych silników, wystawia na odpowiedni port sygnały do startu i do zatrzymania pracy silników. Po stronie Uno jest także wykonanie charakterystyki pracy silnika polegającej na rozruchu, pracy normalnej i wyhamowaniu. Tak jak wcześniej pisałem na forum, odcinek wznoszący (inaczej rozruch) i opadający (inaczej wyhamowanie) takiej rampy jest stałą określoną w impulsach enkoderowych. Algorytm testuje czy zadany ruch jaki ma wykonać silnik spełnia warunek:

    rampa_wznosząca + rampa_opadająca < zadane_przesunięcie


    i po jego spełnieniu opisana wyżej charakterystyka jest przez silnik wykonana. Jeżeli warunek nie jest spełniony to algorytm stosuje niską częstotliwość PWM dla której efekt szarpnięcia ramienia jest niewidoczny.

    Po stronie Raspberry Pi działa aplikacja napisana w zintegrowanym środowisku Lazarus, opartym na kompilatorze Free Pascal. Pisząc główną aplikację sterującą wraz z GUI operatora używałem środowiska zainstalowanego na Rpi, jednak kilka bibliotek jest pisanych na Win7 i kompilowanych do architektóry arm (czyli tej z Rpi). Główna aplikacja składa się z kilku części podstawowych:


    • tworzenie i edycja skryptu z ruchem manipulatora
    • załadowanie gotowego skryptu i współpraca z modułami Arduino podczas jego realizacji
    • edycja parametrów pracy aplikacji głównej, modułów Arduino, Rpi, edytor plików xml, itp
    • aktualnie rozwijana część do obliczenia położenia X,Y w płaszczyźnie kartezjańskiej mając dane o poszczególnych kątach lub wyznaczania kątów mając współrzędne X,Y dla płaszczyzny 2D




    Oprócz takiego podziału, aplikacja jest też wielowątkowa, na przykład nadzór nad wykonaniem zadanego skryptu jest prowadzony w osobnym wątku, dzięki czemu dostęp do elementów GUI nie jest blokowany przez aktualnie wykonujący się ruch ramienia. Dla skryptów które główna aplikacja przetwarza, zastosowałem format xml. Skrypty można edytować mając uruchomionego robota. Wybranie wtedy danej linii edytowanego skryptu powoduje ustawienie się ramienia w punkcie przestrzeni przez opisanego w tej linii skryptu. Oczywiście edycja w ten sposób może być wykonana jeżeli manipulator nie wykonuje w tym samym czasie jakiegoś innego skryptu. Skrypt może zawierać komendę wykonania przesunięcia (ruchu jednego silnika lub więcej), komendę wait, która stopuje ruch ramienia przez określony czas podany w milisekundach, komendę waitfor która stopuje ruch ramienia aż na odpowiednim wejściu modułu z wejściami optoizolowanymi pojawi się stan wysoki, komendę służącą do wyznaczania tymczasowej pozycji Home, komendę do powrotu do głównej pozycji Home.

    Ostatnim, aktualnie rozwijanym elementem aplikacji jest obliczenie położenia ramienia (człony R1,R2,R3) określone przez współrzędne X, Y na płaszczyźnie kartezjańskiej. Generalnie korzystałem ze wzorów dla 3-ch stopni swobody, nie biorę na razie pod uwagę obrotu ramienia. Równania te opisują tzw. kinematykę prostą (ang. forward kinematic)

    X = R1*cos(ϑ1)+R2*cos(ϑ1 +ϑ2)+R3*cos(ϑ1 +ϑ2 +ϑ3)

    Y = R1*sin(ϑ1)+R2*sin(ϑ1 +ϑ2)+R3*sin(ϑ1 +ϑ2 +ϑ3)

    φ = ϑ1 +ϑ2 +ϑ3




    gdzie:
    R1,R2,R3 to długości poszczególnych odcinków (członów) manipulatora. Kąty ϑ1, ϑ2, ϑ3 wyznaczam przez odczyt enkoderów. Wyniki przytaczam na poniższych zdjęciach:

    Ramię robotyczne - własna konstrukcja i oprogramowanie
    Ramię robotyczne - własna konstrukcja i oprogramowanie


    Biorąc pod uwagę luzy na przegubach oraz wszelkie techniczne niedostatki mojej konstrukcji (np. lekko niedopasowane zęby pasków do rowków kół – w następnym projekcie będą specjalnie do tych zadań paski z kołami), uważam że uzyskane wyniki nie są najgorsze. Wartość zmierzona jest podana jako „około” ze względu na metodę pomiaru i własnej konstrukcji przyrząd pomiarowy w oparciu o stalowe linijki kupione w dużym markecie budowlanym :)
    Obliczone XObliczone YZmierzone XZmierzone Y
    324,6339,3432837,5
    330,135,833286
    296,3138,2130141,5


    Potrafiąc wyznaczyć wartości współrzędnych X,Y w układzie 2D raczej nie będzie trudne obliczenie odwrotne, czyli mając X,Y policzyć poszczególne kąty. Jest to obecnie bieżące zadanie w tym projekcie. Film do obejrzenia: Link

    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    krolikbest
    Level 10  
    Offline 
    krolikbest wrote 84 posts with rating 42, helped 0 times. Live in city Ogrodzona. Been with us since 2006 year.
  • Computer Controls
  • #2
    maviozo
    Level 10  
    Wow, podoba mi się :) Super zajawka. świetna zabawa. Ile to daje fajnych możliwości teraz... Ile poświęciłeś na to czasu? Ja tam też coś sobie dłubię, ale dobieranie części, czas przesyłki, zmiana decyzji, bo jednak jakiś niewypał... lata lecą ;)
  • #3
    krolikbest
    Level 10  
    Update projektu:dopisałem część kodu do sterowania obrotnicą na detale do
    malowania proszkowego plus kilka innych poprawek, min. można z poziomu
    skryptu sterować załączaniem/wyłączaniem pistoletu proszkowego.
    Tutaj efekt