top of page

Artykuły

Szukaj

Na przełomie lat 2022 oraz 2023 przystąpiłem do projektu budowy prototypu ramienia robota planarnego. Ideą było stworzenie projektu opartego na platformie Arduino Uno oraz platformie .NET.

Założenia projektowe:

- Stworzyć ramię robota z trzema ogniwami oraz efektorem końcowym w postaci chwytaka.

- Stworzyć algorytm sterowania oraz zaimplementować go na microkontrolerze.

- Stworzyć aplikacje do zapisu pozycji w jakiej aktualnie znajduje się ramię.


Projekt:

  1. Stworzenie platformy, na której będzie opierać się cały projekt:


Platforma, na której opiera się manipulator została zamodelowana w programie ArchiCad. Jest to kwadrat o wymiarach 20x20cm z otworem w środku, w który wchodzić będzie jedno z ogniw robota. Całość została wykonana ze sklejki o grubości 8mm.




Do projektu została również dołączona makieta. W powyższej makiecie będzie umieszczony wyświetlacz LCD 16x2 z wyświetloną pozycją w jakiej znajduje się manipulator oraz switch, który zabezpieczy ogniwa (serwomechanizmy) przed nie pożądanym działaniem użytkownika.



2. Schematy poszczególnych modułów:

- Moduł ogniw:


Za ogniwa w manipulatorze będą odpowiadać poszczególne serwomechanizmy przedstawione na powyższym schemacie. Zasilanie będzie doprowadzone przez stabilizatory napięcia, dzięki temu na wyjściu otrzymamy stabilne 5[V] zasilania.


- Moduł sterowania:

Sterować robotem będzie można za pomocą czterech przycisków oraz Joysticka, który przesuwa się względem osi X oraz Y. Za zwiększenie liczby wyjść cyfrowych w płytce Arduino UNO będzie odpowiadać układ PCF8574N, komunikacja między układem a microkontrolerem odbędzie się po magistrali I2C. Dodatkowo do układu został dołączony buzzer. Aby wzmocnić sygnał na wyjściu układu PCF, został dołączony tranzystor.


- Moduł bezpieczeństwa:

Za manualne zabezpieczenie konstrukcji będzie odpowiadać switch. Gdy przełącznik ustawi się w pozycję 1 dopiero zostanie podany sygnał PWM sterujący poszczególnymi ogniwami.


- Moduł wyświetlacza:

Do wyświetlenia aktualnej pozycji zostanie wykorzystany wyświetlacz LCD 16x2 przedstawiony na powyższym schemacie.


3. Projekt algorytmu sterowania:


Algorytm sterowania został stworzony na bazie diagramów stanu. Pełna implementacja w kodzie dostępna jest na moim github'ie (link poniżej).



Jeżeli użytkownik wychyli joystick w którąś ze stron, zmienia się wtedy wartość jaka jest odczytywana z wejścia analogowego, do którego jest podłączony joystick. Wtedy na podstawie tej wartości jest określany ruch, w którą stronę został wychylony powyższy kontroler. Gdy wiadomo, w którą stronę został wychylony joystick, algorytm zwiększa lub zmniejsza wartość zmiennej, która odpowiada za poruszanie się poszczególnych ogniw. Podobna sytuacja ma miejsce gdy, użytkownik naciśnie, któryś z czterech przycisków. Jeżeli dany przycisk zostanie wciśnięty, wartość zmiennej odpowiadającej za poruszanie się serw zostaje zwiększona lub zmniejszona natomiast gdy zostaną naciśnięte dwa wyznaczone przyciski jednocześnie, ogniwa ustawiają się do pozycji bazowej.


4. Projekt aplikacji opartej na platformie .NET


Aplikacja służąca do zapisu pozycji została wykonana za pomocą narzędzia Visual Studio. Jak można zobaczyć na poniższych rysunkach program dzieli się na trzy okienka:

Main, Configuration oraz Information.

- Main:

W tym oknie jest wyświetlana pozycja w jakiej znajduje się robot. Można również za pomocą przycisku "save position" zapisać aktualną pozycję. Taki plik zostaje zapisany w formacie .csv w folderze Data (główny katalog z programem).


- Configuration:

W tej zakładce użytkownik ma możliwość wpisania odpowiedniego portu pod którym znajduje się microkontroler. Cała transmisja jest realizowana za pomocą protokołu RS232.


- Information:

Zakładka ta zawiera informacje o autorze programu.




Kod aplikacji dostępny na platformie github (link poniżej).


5. Implementacja sprzętowa:

Cały projekt wygląda jak na zdjęciu poniżej. Do zasilenia makiety został użyty zasilacz laboratoryjny.

Film z działania robota, jest opublikowany na stronie.


6. Testy końcowe:

W trakcie pierwszego uruchomienia ramienia, robot wpadł w stan nie ustalony. Spowodowane było to zjawiskiem rezonansu mechanicznego, wykres poniżej:

Skąd pojawiło się owe zjawisko i jak do tego doszło? Otóż, w pierwotnej wersji konstrukcji, źle dopasowany był krok o jaki zmienia się pozycja serwa z każdym obiegiem pętli programu oraz częstotliwość odświeżania danej pozycji, co więcej nie było dodanego żadnego tłumienia na przeciwwadze ramienia oraz w miejscu styku pierwszego ogniwa z ramieniem. Skutkowało to tym, że z każdą zmianą pozycji dochodziło do przeregulowania układu. Po konfiguracji algorytmu oraz dodaniu tłumienia, manipulator po podaniu sygnału wejściowego odpowiadał zgodnie z przewidywaniami.









  1. Czym są Programowalne sterowniki logiczne PLC

Sterowniki PLC są przedstawicielami szeroko rozumianej rodziny komputerów. Sterowniki programowalne wykorzystywane są głownie w zastosowaniach przemysłowych. W tym artykule skupimy się głównie na sterowniku firmy SIEMENS S7 - 1200 DC/DC/DC.


2. PLC - Specyfikacja pracy


Sterowniki logiczne za pomocą modułów wejściowych zbierają pomiary z cyfrowych i analogowych czujników oraz z różnej rodzaju urządzeń pomiarowych. Na podstawie zebranych danych pomiarowych mogą realizować program zadany przez użytkownika, a następnie zgodnie z wynikami obliczeń danych programów mogą podejmować decyzję i generować sygnały sterujące. Mogą również wykonywać funkcje diagnostyczne oraz za pomocą modułów oraz łączy komunikacyjnych realizują funkcję transmisji danych.


3. Gdzie stosujemy PLC ?


- Technika instalacyjna

- Proste maszyny i urządzenia przemysłowe

- Pozycjonowanie osi

- regulatory PID

- Bezprzewodowe sieci sensorowe

- i wiele wiele innych ;)

4. Języki programowania


Z racji tego, że w przemyśle ważnym czynnikiem jest uniwersalność stąd w roku 1993 została opracowana i wydana przez międzynarodową komisję elektroniki norma IEC 1131 "Programmable Controllers". Składa się ona z pięciu części, ale najważniejsze jest to, że ujednolica strategie programowania sterowników logicznych co znacznie ułatwia wdrożenie się w dany sterownik.

Sterownik PLC możemy programować używając:

- Języka listy instrukcji IL (Instruction List)


- Języka strukturalnego ST (Structured List)



- Języka schematów drabinkowych LD (Ladder diagram)




- Języka schematów blokowych FBD (Function block diagram)




W powyższym artykule skupimy się na pokazaniu języka drabinkowego LD.

Jest to najpopularniejszy, a zarazem najprostszy do zrozumienia i opanowania język programowania sterowników PLC. Należy on do grupy języków graficznych i umożliwia realizację zadania sterowania za pomocą standaryzowanych symboli graficznych.

Jak to wygląda w praktyce ?

Załóżmy, że naszym zadaniem jest wysterowania naszego wyjścia po załączeniu wejścia:

- Po pierwsze musimy zdefiniować nasze zmienne w tzw. Tag_table, wygląda to następująco


Rys.I. Tag table w programie Tia Portal

Gdy już zdefiniujemy nasze zmienne czas przejść do naszego programu.


Rys.II. Szkielet programu w środowisku Tia Portal

Widzimy, że w naszym 'networku' pojawiły się dwie cewki, wej oraz wyj. Zadaniem naszego programu jest wysterowanie wyjścia %Q0.0 na on gdy wejście %I0.0 będzie załączone.


Rys.III. Zrzut symulacyjny pokazujący działanie programu

Jak widzimy na (Rys.III) gdy na wejściu %I0.0 jest wartość True to również na wyjściu %Q0.0 jest wartość True.

Zajmijmy się teraz trochę bardziej skomplikowanymi zagadnieniami. Załóżmy że pracujemy jako automatyk w jakiejś renomowanej firmie. Dostaliśmy zadanie przygotowania programu który będzie sterować prasą. Aby uchronić operatora prasy przed utratą rąk potrzebujemy zastosować układ wyzwalający. Uruchomienie prasy może nastąpić tylko w przypadku wciśnięcia obu przycisków (S1 oraz S2) jednocześnie. Następnie gdy oba przyciski są włączone to po upływie 5 sec załączana jest prasa. Sterowana jest ona silnikiem Y, który jest załączany stycznikiem K.

Aby zrealizować to zadanie musimy:

- Zdefiniować co jest wyjściem a co wejściem w naszym programie.


Rys.IV. Zmienne wyjściowe oraz wejściowe

Jak możemy wywnioskować z zadania dwa przyciski muszą być jednocześnie wciśnięte jest to inaczej zastosowanie w praktyce bramki logicznej AND więc na wejścia %I0.0 oraz %I0.1 ustawiamy nasze przyciski, a gdy przyciski są wciśnięte po 5 sec załączy nam się prasa, wiec stycznik K będzie naszym wyjściem które załączy silnik prasy.


Rys.V. Praktyczna realizacja programu w środowisku Tia Portal

W praktycznej realizacji programu widzimy iż został użyty timer TON ponieważ dzięki niemu po 5 sec zostaje wysterowane wyjście %Q0.1 i prasa się załącza.


Rys.VI. Symulacja działania programu.

Jak widzimy na przeprowadzonej symulacji kolorem niebieskim są zaznaczone dla nas interesujące wartości. Widzimy, że Timer TON odliczył nam 5 sec przez co nasze wyjście K zostało wysterowane na True i prasa się załączyła.

Pokazałem już działanie Timera, podniosłem delikatnie trudność naszego zadania więc czas podstawić poprzeczkę jeszcze wyżej.

W ostatnim zadaniu skupimy się na wykorzystaniu operatorów logicznych, zmiennych pomocniczych oraz licznika inaczej Counter'a.

W tej części zajmiemy się stworzeniem linijki diodowej. Po zadaniu jedynki na wejście %I0.0 nasze diody będą odpalać się cyklicznie co jedną sekundę i tak w kółko, dopóki %I0.0 ma wartość True.

Schemat działania pozostaje ten sam zatem zdefiniujmy nasze zmienne:


Rys.VII. Definicja zmiennych w Tag table

Na (Rys.VII) widzimy, że włącznik czyli zmienna Start/stop jest przypisana do adresu %I0.0 ponieważ to ona załącza nam działanie linijki. Poniżej widzimy zmienna pomocniczą w której będziemy zapisywać daną wartość, a na wyjściach zdefiniowaliśmy nasze diody.


Rys.VIII. Schemat programu cz.I

Jak widzimy na (Rys.VIII) przy załączeniu zmiennej Start/stop w pierwszym kroku jest załączana i wyłączana zmienna pom1 co 1 sec, dalej te impulsy z Timer'a są przekazywany na licznik zliczający w górę Counter Up, gdy licznik doliczy do 3 jego wartość jest resetowana dzięki czemu cała operacja działa w pętli (wiem, że na ten moment brzmi to trochę chaotycznie, ale wszystko rozwiąże się z kolejnym zdjęciem).


Rys.IX. Schemat programu cz.II

W części drugiej widzimy, że jeżeli wartość Counter'a jest większa lub równa zero włącza się dioda1, jeżeli wartość Counter'a jest większa lub równa 1 to włącza się dioda2 i tak samo z diodą trzecią w ten sposób załączana jest cała linijka diodowa.


Rys.X. Załączenie pierwszej diody


Rys.XI. Załączenie drugiej diody


Rys.XII. Załączenie trzeciej diody

Jak możemy zauważyć na rysunkach (Rys.X-XII) wszystkie 3 diody są cyklicznie zapalane co jedną sekundę więc linijka działa poprawnie.

Tym sposobem przeszliśmy ostatnie zadanie opisane w tym artykule jak możemy zauważyć Programowalne Sterowniki Logiczne - PLC w prosty sposób dla użytkownika realizują zaprogramowane zadania. Zachęcam również do szerszego zgłębienia się w temat za co odpowiadają pozostałe Timer'y lub Counter'y lub co to są 'resety' 'sety' i wiele wiele innych instrukcji, których nie zaprezentowałem w tym artykule, a mogą być przydatne w późniejszej pracy automatyka.

Zaktualizowano: 14 kwi 2021

Witajcie, w tym artykule chciałbym podjąć temat jakim jest przekształcenie Laplace'a. Pierre Simon de Laplace (ur. 23 marca1749 w Beaumont-en-Auge, zm. 5 marca1827 w Paryżu) – francuski matematyk, astronom, geodeta i fizyk, jeden z twórców teorii prawdopodobieństwa, zwolennik subiektywnej interpretacji prawdopodobieństwa, na podstawie której dokonał m.in. obliczeń masy Saturna, które odbiegają od współcześnie uznanej wartości o mniej niż 1%.



Czym jest owe przekształcenie słynnego matematyka i do czego się je stosuje ?


Teraz przejdę do rzeczy, a więc gdy mamy do czynienia z układem opisanym równaniem różniczkowym i potrzebujemy odpowiedzieć na pytania czy układ jest stabilny po podaniu na jego wejście skoku jednostkowego ( {H(t) = 0 dla t < 0 ; H(t) = 1 dla t >= 0}), jaki jest to rodzaj układu lub czy występują jakieś oscylacje w trakcie narastania oraz wiele innych ciekawych zagadnień (to wszystko w dalszej części artykułu), użyjemy do tego przekształcenia Laplace'a.

Jak wykonać owe przekształcenie ?

- Pierwszym krokiem jest uszeregowanie naszego równania tak aby nasze zmienne y(t) były po jego lewej stronie a pozostałe wyrazy po prawej.


- Następnie za stopień naszej różniczki oraz parametr 't', podstawiamy oznaczenie 's':


- Kolejnym krokiem jest wyłączenie parametru 'y(s)' przed nawias:


- Na końcu parametry 'y(s)' zostawiamy po lewej stronie równania, a całość przerzucamy na prawą stronę równania i finalnie otrzymujemy postać:


- Aby doprecyzować formalny zapis 'y(s)' zamieniamy na 'G(s)' i otrzymujemy gotową transformatę Laplace'a.


Gdy mamy już wyznaczą naszą transformatę układu, możemy zająć się analizą i badaniem jak będzie się zachowywać podany układ w praktyce, w tym celu użyjemy przydatnego narzędzia jakim jest środowisko 'matlab' firmy 'mathworks'. (https://www.mathworks.com/products/matlab.html)


- Sprawdzamy jaka jest odpowiedź układu na skok jednostkowy:

W tym celu piszemy w naszym mPliku (Pliki z rozszerzeniem .m w środowisku matlab przechowują nasze skrypty)


Następnie generujemy wykres naszej funkcji i badamy jego parametry:


Podczas analizy naszej charakterystyki po podaniu na wejście skoku jednostkowego możemy dojść do wniosku iż układ wzrasta jednostajnie stabilnie, jego wzmocnienie czyli poziom na którym się stabilizuje wynosi 0.5. Widzimy również, że styczna która została poprowadzona do wykresu funkcji przecina się z naszym wzmocnieniem w punkcie (0.5,0.5) co z rzutowałem na oś 'x' czyli 'Time (seconds)' więc stała czasowa naszego układu wynosi 0.5 sekundy. Zielona oraz bordowa przerywana linia rzutuje nam 90% oraz 10% maksymalnego wzmocnienia, odległość między nimi definiuje nam czas narastania, czyli jak szybko nasz układ zbliża się do swojego punktu na którym się stabilizuje, w powyższym przypadku widzimy, że jest to około (1.2 - 0.2 = 1) 1 sec.

Aby poprawnie określić rodzaj układu którym się zajmujemy nie możemy ograniczać się do pobudzenia go tylko skokiem jednostkowym. Zupełnie inną odpowiedź na wyjściu uzyskamy gdy układ na wejście przyjmie tzw 'deltę Diraca', jest to inaczej wyidealizowany impuls którego pole powierzchni wynosi 1:


Po podaniu go na wejście otrzymamy odpowiedź impulsową, gdzie będziemy badać czas opadania naszej charakterystyki.

- Zaczynamy od dopisania do naszego skryptu funkcji która wygeneruje nam odpowiedź impulsową naszego układu:


- Generujemy charakterystykę:



Analizując powyższą odpowiedź impulsową widzimy, że czas opadania również wynosi około 1 (tak samo jak czas narastanie przy odpowiedzi skokowej) stąd też możemy wnioskować że mamy do czynienia z układem inercyjnym.

Jako, że żyjemy w 21 wieku i mamy do dyspozycji specjalistyczne środowiska, możemy również w szybki sposób sprecyzować i sprawdzić nasze rozważania.

Do powyższego kodu dodamy funkcje 'stepinfo' i odczytamy z dokładnością do czterech cyfr po przecinku jakie wartości mają nasze parametry.



Widzimy, że powyższe rozważania oraz obliczenia pokrywają się z tym co wyświetla nam komputer jednak z wykresów nie jesteśmy wstanie dojść do takiej precyzji - jest na to pewna rada.

Pewne parametry możemy obliczyć algebraicznie, mowa tutaj o stałej czasowej oraz wzmocnieniu jakim charakteryzuje się układ, wróćmy do naszej transformaty:


Aby obliczyć algebraicznie stałą czasową oraz wzmocnienie musimy zrobić pewne przekształcenie tj. w mianowniku naszego ułamka wyrazem wolnym (w tym przypadku jest to 2) musi być cyfra '1', wtedy współczynnik kierunkowy, który będzie stał przy 's' określi nam naszą stałą czasową, a licznik ułamka wykaże nam jaka jest wartość wzmocnienia układu, zatem podzielmy cały ułamek przez '2'


Widzimy, że stała czasowa = 1/2 (tak samo jak w przypadku wykresów), oraz wzmocnienie = 1/2 (tak samo jak w przypadku wykresów).

Na koniec, tego artykułu dokonamy rozkładu naszej transformaty na zera i bieguny. Jest to nic innego jak tam gdzie mamy 'nie wiadome' (w powyższym przypadku mianownik) przyrównujemy do zera tj.:


Po przekształceniu naszego prostego równania widzimy, że nasz biegun jest równy -2, takiego samego rozkładu oraz zobrazowanie tego na osi rzędnych oraz odciętych możemy dokonać po przez funkcję 'pzmap' w środowisku 'matlab', zatem rozszerzmy kod o nowe algorytmy:



* - Biegun o wartości - 2

Widzimy, iż nasz biegun po rozkładzie znajduje się po lewej stroni osi liczb rzeczywistych to oznacza, że układ jest stabilny, bazując o kryterium stabilności.


Podsumowując powyższy wpis, można dojść do wniosku jakim przydatnym narzędziem może być przekształcenie Laplace'a i jak wiele parametrów możemy ustalić dzięki niemu, Pozdrawiam.

Źródła:


Informacje Kontaktowe

  • Facebook Social Ikona
  • Instagram

Dziękuję za przesłanie wiadomości!

©2023 by Hubert Derbis. Proudly created with Wix.com

bottom of page