POLITECHNIKA WROCŁAWSKA WYDZIAŁ ELEKTRONIKI Kierunek: Specjalność: Automatyka i Robotyka (AIR) Robotyka (ARR) PROJEKT INŻYNIERSKI Implementacja i badanie wybranych działań w układzie sterowania obiektem Implementation and testing of selected actions in an object control system Autor: Michał Dziergwa Prowadzący projekt: dr inż. Marek Wnuk, I-6 Ocena projektu: WROCŁAW 2011
Spis treści 1 Wstęp 3 2 Opis obiektu 5 2.1 Część mechaniczna............................... 5 2.2 Rozważane metody pomiaru momentu.................... 6 2.2.1 Pomiar za pomocą silnika....................... 6 2.2.2 Pomiar za pomocą dedykowanego czujnika.............. 6 2.2.3 Pomiar za pomocą belki tensometrycznej............... 7 2.3 Wybrana metoda pomiaru........................... 7 2.4 Zastosowanie.................................. 9 3 Implementacja 11 3.1 Gostai Urbi................................... 11 3.1.1 Urbiscript................................ 12 3.1.2 UObject................................. 12 3.1.3 Gostai Lab............................... 13 3.2 Serwomechanizmy Dynamixel......................... 13 3.2.1 Zasilanie................................. 14 3.2.2 Komunikacja z serwomechanizmami.................. 14 3.2.3 Połączenie z Urbi............................ 16 3.3 Pomiar...................................... 17 4 Aplikacja 19 4.1 Widgety odpowiadające za uruchomienie aplikacji.............. 20 4.2 Widgety uruchamiające zaprogramowane zachowania............ 20 4.3 Widgety informujące o stanie serwomechanizmów.............. 21 4.4 Widgety odpowiadające za parametry symulacji............... 22 5 Sterownik w Gostai Urbi 23 5.1 Przegląd całego zakresu serwomechanizmu.................. 23 5.2 Dokonywanie pomiaru w wybranych punktach................ 24 5.3 Metoda przeglądu zupełnego dla trzech łopat................. 24 5.4 Format plików wyjściowych.......................... 25 6 Podsumowanie 29
Rozdział 1 Wstęp W wielu praktycznych sytuacjach występuje potrzeba elastycznej implementacji zachowań w układach sterowania aby umożliwić modyfikowanie algorytmów bezpośrednio na obiekcie. W przypadku dobierania sterowania niezwykle ważna jest możliwość przeprowadzania badań oraz swobodnej modyfikacji sterownika. Jest to jeszcze ważniejsze, gdy dokładny model obiektu nie jest znany. W niniejszej pracy opisane zostanie stanowisko do badania własności turbiny wiatrowej z pionową osią obrotu, tworzonej przez firmę Cad-Mech. Zjawiska aerodynamiczne należą do najbardziej skomplikowanych zjawisk w przyrodzie, w związku z czym stworzenie modelu matematycznego lub fizycznego a co za tym idzie prowadzenie badań symulacyjnych jest utrudnione. W związku z tym zdecydowano się na stworzenie prototypu wyżej wymienionej turbiny i przeprowadzenie na nim odpowiednich badań. Zakres prac projektu obejmuje implementację działania w postaci ruchu łopat turbiny, oraz stworzenie algorytmów pozwalających na możliwie jake najdokładniejsze wyznaczenie takiego sposobu ich ułożenia aby moment obrotowy uzyskany na osi turbiny był jak największy. Głównym celem prowadzonych prac jest jednak zaprogramowanie działania napędów łopat turbiny w taki sposób, by możliwe było badanie wpływu ich nastawienia na maksymalny moment. Kolejnym ważnym aspektem jest stworzenie aplikacji integrującej pomiar, oraz kontrolę nad łopatami w taki sposób, by maksymalnie ułatwić programowanie nowych, nie przewidzianych wcześniej zachowań. Wybranym do tego celu środowiskiem programistycznym jest Urbi firmy Gostai.
Rozdział 2 Opis obiektu 2.1 Część mechaniczna Turbina wiatrowa, tworzona przez firmę Cad-Mech jest prototypem w małej skali obiektu, który ma zostać wdrożony do produkcji w przyszłości. Posiada ona pionową oś obrotu oraz dwa do czterech ramion odchodzących od niej w poziomie. Z każdego z ramion wyprowadzona jest pod kątem prostym w dół łopata, która może obracać się wokół własnej osi za pomocą serwomechanizmu Dynamixel RX-64 firmy Robotis. Całość zamontowana do ramy, pozwalającej na zawieszenie turbiny w powietrzu i umożliwiającej swobodny obrót, za pomocą ramienia zawierającego czujnik siły. Model graficzny turbiny stworzony przez firmę Cad-Mech przedstawia rys. 2.1. Rysunek 2.1 Model turbiny stworzony za pomocą programu Autodesk Inventor [4]
6 2. Opis obiektu Tworzony prototyp ma docelowo zostać przetestowany w powstającym równolegle do turbiny tunelu hydrodynamicznym. Zmiana ośrodka z powietrza na wodę jest podyktowana faktem, iż tunel wodny jest o wiele prostszy w wykonaniu niż tunel aerodynamiczny. Ponadto znając parametry wody, w której przeprowadzana jest symulacja możliwe jest wyznaczenie zachowania turbiny w innym ośrodku, korzystając z tzw. liczby Reynoldsa [15]. 2.2 Rozważane metody pomiaru momentu Podczas realizacji projektu ważne było stworzenie jak najdokładniejszego stanowiska pomiarowego, które pozwoliłoby na zmierzenie momentu obrotowego w zakresie ± 70 Nm. Od początku prac nad projektem rozważano trzy koncepcje realizacji pomiaru momentu. 2.2.1 Pomiar za pomocą silnika Pierwszym pomysłem był pośredni pomiar momentu obrotowego przez pomiar prądu na silniku prądu stałego sprzężonym z osią turbiny. Zalety: Wady: Zrealizowanie pomiaru jest proste - sprowadza się do pomiaru prądu. Silnik DC z przekładnią jest tanią, łatwodostępną i prostą w montażu propozycją. Wykorzystanie przekładni może wprowadzać dodatkowe błędy pomiarowe. Silnik bez przekładni, zapewniający moment 70 Nm jest za duży (ok. 30x30x50cm) i za ciężki (ok. 170 kg). 2.2.2 Pomiar za pomocą dedykowanego czujnika Kolejny rozważanym pomysłem było zakupienie dedykowanego czujnika momentu obrotowego. Rozważano dwa czujniki - CL 22 [6] produkowany przez ZEPWN oraz DFM22-75S [7] firmy Megatron. Zalety: Wady: Najdokładniejszy pomiar. Napięciowy sygnał wyjściowy. Wygodny w montażu. Najdroższe z rozwiązań - ceny takich czujników wahają się od 2 do 4 tys. zł.
2.3. Wybrana metoda pomiaru 7 2.2.3 Pomiar za pomocą belki tensometrycznej Ostatnim z proponowanych rozwiązań było zastosowanie belki tensometrycznej. Jest to czujnik, który na wyjściu daje sygnał napięciowy proporcjonalny do przyłożonej do niego siły. Pozwala to na zaprojektowanie układu pomiarowego, w którym dzięki zastosowaniu ramienia o znanej długości możliwe jest wyliczanie momentu bezpośrednio z jego definicji: gdzie: M - moment r - promień wodzący F - przyłożona siła Zalety: Wady: Najtańsze z wszystkich dostępnych rozwiązań. M = r F, (2.1) Dokładność pomiaru porównywalna do dedykowanego czujnika. Napięciowy sygnał wyjściowy. Dostępny dedykowany układ elektroniczny. Do montażu potrzebne jest wykonanie wielu dodatkowych elementów mechanicznych. 2.3 Wybrana metoda pomiaru Ostatecznie wybrano trzecie z zaprezentowanych powyżej rozwiązań - pomiar za pomocą belki tensometrycznej. Przykładową belkę tensometryczną ilustruje rys. 2.2. Rysunek 2.2 Przykładowa belka tensometryczna Zawiera ona mostek zbudowany z jednakowych tensometrów (1 rozciągany, 1 ściskany, 2 bez odkształceń). Dzięki symetrii układu mostek jest dobrze skompensowany temperaturowo. jedna z przekątnych mostka jest zasilana napięciem 10V, z drugiej pobiera się napięcie wyjściowe. Przy braku odkształceń belki jest ono zerowe. Belką wybraną do zastosowania w modelu jest Vishay Tedea, model 1022 [5]. W celu przetworzenia i odczytania sygnału wyjściowego belki zastosowano układ elektroniczny służący oryginalnie do pomiaru siły ciągu wirnika robota typu quadrocopter. Jest on elementem pracy dyplomowej mgr. inż. Artura Muraszkowskiego [1]. Układ ten składa się z zasilacza oraz płytki z mikrokontrolerem MC9S08 firmy Freescale. Pomiar realizowany jest w następujący sposób: na wyjściu belki tensometrycznej otrzymywany jest sygnał napięciowy o wartości maksymalnie ± 2mV/V, co przy zasilaniu 10V daje zakres ± 20mV. Sygnał zostaje wzmocniony wzmacniaczem różnicowym AD620 ok.
8 2. Opis obiektu 80 razy, co daje zakres ± 1.6V. Aby umożliwić pomiar, sygnał podawany jest na wzmacniacz AD8057, w celu przesunięcia poziomu napięcia tak by mieściło się ono w przedziale 0V -3.3V. Tak przygotowany sygnał jest podawany na wejście przetwornika analogowocyfrowego mikrokontrolera a następnie przesyłany przez port szeregowy do komputera. Mikrokontroler przesyła aktualne wyniki pomiaru bez przerwy, co pozwala na odczytanie ich z poziomu aplikacji w dowolnym momencie. Dane przesyłane są w formacie "wxxx", gdzie "w" jest znakiem informującym, że trzy kolejne znaki są wynikiem pomiaru. Wynik mieści się w przedziale 0-255. Schemat części elektronicznej przedstawiono na rys. 2.3 [1]. Rysunek 2.3 Schemat układu elektronicznego [1]
2.4. Zastosowanie 9 2.4 Zastosowanie Na podstawie badań przeprowadzonych przy użyciu stanowiska stworzonego w ramach tego projektu powstać ma w przyszłości turbina wiatrowa w pełnej skali. Docelowo turbina tego typu będzie miała do 30m wysokości i zostanie wykorzystana jako przydomowa, niskoobrotowa (ok. 3 obroty na minutę) elektrownia wiatrowa. Konstrukcja taka będzie ze względu na niską prędkość obrotową cicha i nie będzie zakłócała spokoju żyjących w pobliżu ludzi. Ponadto rozwiązanie takie będzie tanie i ekologiczne.
Rozdział 3 Implementacja 3.1 Gostai Urbi Środowiskiem, w którym zdecydowano się stworzyć aplikację sterującą ruchem serwomechanizmów jest Gostai Urbi [2]. Jest to oprogramowanie pozwalające na kontrolowanie złożonych, wielofunkcyjnych systemów robotycznych, oparte na komunikacji klient/serwer. Architekturę Urbi przedstawia rys. 3.1 Rysunek 3.1 Architektura środowiska Gostai Urbi [2]
12 3. Implementacja Najważniejszym elementem architektury jest serwer Urbi. Zarządza on wszelkimi modułam,i a komunikacja z nim odbywa się poprzez język Urbiscript. W przypadku, gdy korzystamy ze zdalnych modułów, komunikacja między nimi a serwerem odbywa się poprzez sockety TCP. Platformę tę wybrano ze względu na następujące jej właściwości: Pełna przenośność dzięki językowi skryptowemu Urbiscript. Modularna budowa oparta na tzw. UObjectach. Łatwość w manipulowaniu danymi dzięki zmiennym typu Uvar. Możliwość równoległego zarządzania zdarzeniami. Oprogramowanie open source (GNU AGPL v3) [8]. Możliwość prostego tworzenia aplikacji graficznych za pomocą Gostai Lab. Środowisko jest nieustannie rozwijane przez firmę Gostai. 3.1.1 Urbiscript Urbiscript jest językiem zorientowanym zdarzeniowo, o składni zbliżonej do C++. Umożliwia on tworzenie skryptów pozwalających na komunikację z serwerem Urbi. Dodatkowo umożliwia on programowanie współbieżne, dzięki operatorom ";", " ", "," oraz "&". Działają one w następujący sposób: A;B - Zadanie B rozpocznie się po zakończeniu zadania A A B - Zadanie B rozpocznie się dokładnie w momencie zakończenia zadania A A,B - Zadanie B rozpocznie się po rozpoczęciu zadania A A&B - Zadanie B rozpocznie się dokładnie w momencie rozpoczęcia zadania A 3.1.2 UObject Urbi cechuje się budową modułową - składa się z tzw. Uobjectów, które są bibliotekami napisanymi w języku C++. Mogą one zostać w dowolnym momencie dołączone do serwera Urbi za pomocą polecenia loadmodule(). Po dołączeniu modułu możliwe jest korzystanie z metod i zmiennych, które on udostępnia. Udostępniane mogą być jedynie zmienne typu Uvar. Jest to specjalny typ zmiennej, który może zawierać dane dowolnego typu. Obie poniższe deklaracje zmiennych są poprawne: var Zm1 = 42; var Zm2 = "Hello world!" Możliwe jest oczywiście tworzenie własnych modułów. W tym celu należy stworzyć klasę dziedziczącą po klasie UObject. Wszystkim zmiennym, które będą udostępniane należy nadać typ Uvar. Następnie zmienne należy dołączyć za pomocą funkcji UBindVar() a metody za pomocą UBindFunction().
3.2. Serwomechanizmy Dynamixel 13 3.1.3 Gostai Lab Gostai Lab pozwala na szybkie tworzenie aplikacji graficznych poprzez układanie zdefiniowanych wcześniej widgetów. Jest to główny powód dla którego został wybrany do zrealizowania tworzonej w ramach niniejszego projektu aplikacji. Szególnie przydatnymi z punktu widzenia tworzonej aplikacji są następujące widgety: Button - Tworzy przycisk i umożliwia zdefiniowanie osobnych akcji dla naciśnięcia i zwolnienia przycisku. Akcje są zdefiniowane za pomocą języka Urbiscript Float - Widget służący do wyświetlania oraz zmieniania wartości zmiennej typu float. W przypadku gdy dla wyświetlanej zmiennej ustawimy parametry rangemin i rangemax możemy również kontrolować wartość zmiennej za pomocą suwaka String - Służy do kontrolowania zawartości zmiennej typu string 3.2 Serwomechanizmy Dynamixel Napęd łopatek turbiny został zrealizowany za pomocą serwomechanizmów Dynamixel RX-64 (rys. 3.2) firmy Robotis [3]. Są to profesjonalne serwomechanizmy znajdujące zastosowanie w wielu projektach robotycznych. Posiadają następujące parametry: Waga [g] - 125 Wymiary [mm] - 40.2 x 61.1 x 41.0 Przekładnia - 1:200 Napięcie zasilania [V] - 12-21 Moment (przy zasilaniu 18V) - 64 [Ncm] Zakres obrotu [ ]- 300 Rozdzielczość [ ]- 0.29 (1024 impulsy) Komunikacja za pomocą prostego protokołu przez interfejs RS485 Rysunek 3.2 Serwomechanizm Dynamixel RX-64 [3]
14 3. Implementacja 3.2.1 Zasilanie Serwomechanizmy oraz konwerter RS232 <-> RS485 zasilane są za pomocą dostarczonego przez firmę Cad-Mech zasilacza DR-60-15 firmy Mean Well [16]. Parametry zasilacza: Wejście: 100-240 V AC, 1.8A Wyjście: 15 V DC (z możliwością regulacji w zakresie 13.5-17 V), 4A Zasilacz przedstawia rys. 3.3 Rysunek 3.3 Zasilacz Mean Well DR-60-15 3.2.2 Komunikacja z serwomechanizmami Serwomechanizmy Dynamixel są łączone szeregowo za pomocą połączenia nazwanego przez producenta "Daisy Chain". Komunikacja może się odbywać poprzez różne protokoły - zależnie od modelu może być to TTL, RS485 lub CAN. W przypadku Dynamixel RX- 64 wykorzystywanym standardem jest RS485. Ponieważ produkowane obecnie komputery przeważnie nie posiadają już portu szeregowego, w celu nawiązania komunikacji pomiędzy komputerem a serwomechanizmami zastosowano dwa konwertery. Pierwszy z nich (przedstawiony na rys. 3.4 [9]) pozwala na przejście z popularnego standardu USB na RS232, wykorzystując w tym celu układ Prolific2303 [10]. Następnie dokonywana jest konwersja ze standardu RS232 na RS485 (rys. 3.5). Drugi z konwerterów [11] wykorzystuje układ MAX232 [12] w celu zamiany poziomu napięć z odpowiadającego standardowi RS232 na akceptowany przez standard TTL. Następnie kolejny układ - MAX485 [13] zamienia poziom napięć z odpowiadającego standardowi TTL na akceptowany przez RS485.
3.2. Serwomechanizmy Dynamixel 15 Rysunek 3.4 Konwerter USB <-> RS232 [9] Rysunek 3.5 Konwerter RS232 <-> RS485 [11] Nawiązanie komunikacji z serwomechanizmem ogranicza się do przesłania do niego konkretnego pakietu z instrukcjami. Strukturę takiego pakietu przedstawiono poniżej: 0xFF 0xFF ID DŁUGOŚĆ INSTR PARAM 1... PARAM N SUM KONTR
16 3. Implementacja 0xFF 0xFF Znacznik początku pakietu ID Numer identyfikacyjny serwomechanizmu, do którego wysyłana jest instrukcja DŁUGOŚĆ Długość ramki wyliczana jako liczba parametrów + 2 INSTR Instrukcja przesyłana do serwomechanizmu (spis wszystkich instrukcji można znaleźć w [3]) PARAM 1...N Parametry, w przypadku gdy przesyłana instrukcja ich wymaga SUM KONTR Suma kontrolna pozwalająca sprawdzić, czy podczas przesyłania pakietu nie nastąpiło przekłamanie Zarządzanie serwomechanizmem jest możliwe poprzez modyfikację tablicy kontrolnej za pomocą pakietów. W tablicy kontrolnej umieszczone są wszystkie informacje o serwomechanizmie. Dzieli się ona na obszar EEPROM i RAM. W pierwszym z nich znajdują się informacje, które muszą pozostać zapisane po odcięciu zasilania, takie jak model serwa, jego ID, wersja Firmware u czy też różnego rodzaju limity. W drugim obszarze znajdują się dane tymczasowe, takie jak zadana i aktualna pozycja czy prędkość, aktualna wartość napięcia zasilania czy też temperatura serwomechanizmu. 3.2.3 Połączenie z Urbi W celu integracji serwomechanizmów z serwerem Urbi wymagany jest UObject będący w stanie realizować komunikację z serwami. Moduł taki, o nazwie Dynamixel, został stworzony przez mgr. inż. Adama Oleksego oraz mgr. inż. Jana Kędzierskiego w ramach prac prowadzonych nad projektem unijnym LIREC [14]. Pozwala on na wykorzystanie wszystkich funkcjonalności serwomechanizmów z poziomu Urbiscriptu. Oparty jest on w dużym stopniu na stworzonym przez autorów modułu Dynamixel module Dynlink, który z kolei umożliwia obsługę serwomechanizmów z poziomu języka C++. Poniżej zamieszczono przykład wykorzystania modułu z wykorzystaniem Urbiscript: loadmodule("dynamixel"); var dyn=dynamixel.new(); dyn.open("com1",57600); dyn.findservos(0,10); dyn.setgoalposition(0,100); dyn.setgoalposition(1,200); Kod ten realizuje po kolei następujące zadania: Dołączenie modułu Dynamixel do jądra Urbi. Deklaracja zmiennej typu Dynamixel. Otwarcie dla danej zmiennej typu Dynamixel odpowiedniego portu szeregowego i ustawienie odpowiedniej prędkości transmisji szeregowej - baudrate. Wyszukanie serwomechanizmów, których ID mieści się w przedziale (0,10). Przestawienie serwomechanizmu o ID = 0 do pozycji 100. Przestawienie serwomechanizmu o ID = 1 do pozycji 200.
3.3. Pomiar 17 W wersji pierwotnej moduł posiada metody pozwalające na wykorzystanie wszystkich możliwych funkcjonalności serwomechanizmów, oraz nie posiada żadnych widocznych z poziomu Urbiscriptu zmiennych. W celu przystosowania go do programowania zachowań turbiny wiatrowej z trzema łopatami, wprowadzono dodatkowe zmienne typu Uvar odpowiadające za położenie oraz identyfikatory każdej z łopat. 3.3 Pomiar Kolejnym krokiem było podłączenie do serwera Urbi modułu pomiarowego. W tym celu stworzono własny UObject o nazwie Pomiar odpowiadający za pobranie wyników pomiaru, udostępnienie ich na poziomie Urbiscriptu a następnie zapis w przystępnej postaci. Moduł posiada następujące metody: OpenInput(), CloseInput() - odpowiadają za nawiązanie oraz zakończenie komunikacji z mikrokontrolerem. ReadData(), WriteData() - odpowiadają za odczytanie pomiaru oraz jego zapis do pliku. OpenOutput(), CloseOutput() - odpowiadają za otwarcie oraz zamknięcie pliku do którego zapisane mają zostać pomiary. Dodatkowo moduł zawiera zmienną moment typu Uvar, do której zapisywane są wyniki pomiarów. Poniżej zamieszczono przykład wykorzystania modułu z wykorzystaniem Urbiscript: loadmodule("pomiar"); var pom=pomiar.new(); pom.openinput("com7",600); pom.readdata(); pom.openoutput("output.csv"); pom.writedata(turbpos,l1_pos,l2_pos,l3_pos); pom.closeoutput(); pom.closeinput(); Kod ten realizuje kolejno następujące zadania: Dołączenie modułu Pomiar do jądra Urbi. Deklaracja zmiennej typu Pomiar. Otwarcie dla danej zmiennej typu Pomiar odpowiedniego portu szeregowego i ustawienie odpowiedniej prędkości transmisji szeregowej - baudrate. Wczytanie wyniku pomiaru do zmiennej moment. Otwarcie pliku wyjściowego o nazwie output.csv. Zapisanie wyniku pomiaru razem z pozycjami wszystkich trzech łopat oraz kątem obrotu całej turbiny, który jest ustawiany ręcznie. Zamknięcie pliku wyjściowego oraz portu szeregowego.
Rozdział 4 Aplikacja Wykorzystanie środowiska Gostai Lab do tworzenia aplikacji pozwoliło na połączenie wszystkich elementów projektu w jedną spójną całość oraz zaprogramowanie w pełni parametryzowalnych zachowań. Rys. 4.1 przedstawia okno utworzonej aplikacji. Rysunek 4.1 Aplikacja utworzona w Gostai Lab Aplikacja składa się widgetów podzielonych zgodnie z ich przeznaczeniem na cztery grupy. W lewym górnym narożniku znajdują się widgety odpowiadające za prawidłowe uruchomienie aplikacji. W prawym górnym narożniku znajdują się widgety uruchamiające zaprogramowane zachowania. Pośrodku okna znajdują się widgety informujące o stanie serwomechanizmów. W dolnej części okna umieszczono parametry symulacji.
20 4. Aplikacja 4.1 Widgety odpowiadające za uruchomienie aplikacji W lewym górnym narożniku znajduja się cztery widgety. Dwa z nich odpowiadają za kontrolowanie zmiennych typu string. W zmiennej port przechowywana jest nazwa portu do którego podłączany jest konwerter USB <-> RS232. W zmiennej OutFile przechowywana jest nazwa pliku do którego zapisane mają być wyniki badania. Przycisk Set port powoduje ustawienie nowej nazwy portu po wpisaniu jej do okna obok. Najważniejszym widgetem w tej części ekranu jest jednak przycisk Connect. Odpowiada on za załadowanie modułów Dynamixel oraz Pomiar, poprawne utworzenie wszystkich zmiennych globalnych (zmienna utworzona w jednym z widgetów nie będzie widziana w żadnym innym, o ile nie zostanie zadeklarowana jako zmienna globalna), otwarcie odpowiednich portów i wyszukanie serwomechanizmów. 4.2 Widgety uruchamiające zaprogramowane zachowania W przypadku pomiaru momentu dla turbiny tego rodzaju niezwykle ważny jest odpowiedni dobór metody sterowania łopatami. Dana konfiguracja turbiny powoduje, iż możliwe jest aby zakłócenia ośrodka spowodowane przez jedną z łopat wpływały na inne łopaty a więc i na generowany moment obrotowy. Bardzo pożądanym jest aby wyznaczyć wpływ tych zakłóceń. W tym celu zaprogramowano dwa różne wzorce zachowań. Pierwsza metoda sterowania (przycisk Run1) ma za zadanie wyznaczyć moment obrotowy tylko i wyłącznie dla jednej łopaty. Dzięki temu możliwe jest wyznaczenie momentu generowanego przez łopaty w chwili, gdy nie ma żadnych zakłóceń ośrodka. Zaprogramowane zachowanie polega na obrocie łopaty wokół własnej osi w zakresie 180. Następnie należy odwrócić mocowanie łopaty o 180 i powtórzyć ten sam schemat w celu pokrycia 60, które byłyby normalnie nieosiągalne z powodu ograniczenia zakresu serwomechanizmów. Następnie należy obrócić całość turbiny o zadany przyrost kąta wału głównego i powtórzyć tę samą operację aż do przebadania zależności momentu obrotowego od kąta nachylenia łopaty dla wszystkich żądanych położeń wału. Zakres obrotu serwomechanizmów Dynamixel przedstawia rys. (4.2). Druga metoda sterowania (przycisk Run2) pozwala na zaobserwowanie momentu generowanego przez wszystkie łopaty jednocześnie. Serwomechanizmy ustawiane są w wyznaczonych w poprzednim kroku punktach charakterystycznych, tak by generowały możliwie
4.3. Widgety informujące o stanie serwomechanizmów 21 Rysunek 4.2 Dozwolony zakres obrotu serwomechanizmów Dynamixel [3] największy moment. Wpływ zakłóceń ośrodka na generowany moment jest badany za pomocą metody przeglądu zupełnego. Łopaty są obracane zgodnie i przeciwnie do wskazówek zegara w zadanym zakresie i z zadaną rozdzielczością. W poszukiwaniu układu łopat generującego największy moment obrotowy sprawdzana jest każda permutacja położenia łopat. Taka metoda jest niestety czasochłonna ponieważ obrócenie łopaty samo w sobie generuje zakłócenia przepływu wody w tunelu hydrodynamicznym, w związku z czym po każdym ruchu niezbędne jest odczekanie aż przepływ się uspokoi. Największą zaletą takiego sposobu postępowania jest fakt, że w ten sposób zostaje sprawdzona cała charakterystyka. W momencie, gdy charakterystyka ta jest początkowo nieznana stosowanie innych metod może zaskutkować przeoczeniem optymalnego ustawienia. 4.3 Widgety informujące o stanie serwomechanizmów W środkowej części okna aplikacji znajdują się widgety informujące użytkownika o aktualnym stanie trzech parametrów serwomechanizmów. W pierwszej kolumnie znajduje się informacja o aktualnej pozycji serwomechanizmu. W drugiej kolumnie widnieje informacja o obciążeniu, przy czym maksymalna wartość 1024 oznacza, że pomimo wykorzystania maksymalnego momentu serwomechanizmu oś nadal się nie porusza. Znak stojący przed tym parametrem informuje użytkownika czy dane obciążenie wystąpiło podczas ruchu zgodnie, czy też przeciwnie do ruchu wskazówek zegara. Ostatnia kolumna zawiera ID wszystkich serwomechanizmów i pozwala zastąpić pracochłonną operację zamieniania miejscami serwomechanizmów podstawieniem odpowiednich wartości w aplikacji.
22 4. Aplikacja 4.4 Widgety odpowiadające za parametry symulacji Ostatnia grupa widgetów to parametry symulacji. Znajdują się tu wspominane już zakres, rozdzielczość oraz czas ustalenia ośrodka, wymagane przez zaprogramowane zachowania. Parametr TurbPos to kąt między obecnym a początkowym ustawieniem całej turbiny. W tej grupie widgetów znajduje się także zmierzony moment.
Rozdział 5 Sterownik w Gostai Urbi W poprzednich rozdziałach opisano strukturę aplikacji stworzonej przy użyciu Gostai Lab oraz użyte w niej moduły. W niniejszym rozdziale przedstawione zostaną ze szczegółami przykłady zachowań stworzonych przy użyciu Urbi. 5.1 Przegląd całego zakresu serwomechanizmu Jednym z najprostszych do zaimplementowania zachowań jest przegląd całego zakresu serwomechanizmu z zadanym krokiem podanym w stopniach. Zachowanie to realizuje poniższy kod (przy założeniu, że nastąpiło poprawne uruchomienie modułu, co opisano w rozdziale 3.2.3): var polozenie; var krok=20; for(polozenie=0; polozenie < 1023; x+=(krok*1024+180)/360) { dyn.setgoalposition(dyn.l1_id, polozenie), sleep(czasustalenia); }; Kolejno wykonywane polecenia to: Na początku następuje zadeklarowanie zmiennych polozenie i krok typu UVar, oraz zainicjalizowanie zmiennej krok wartością 20. Następnie wykonywana jest pętla for w której zmienna polozenie przyjmuje wartości od 0 do 1023 (jest to zakres ruchu serwomechanizmów liczony w impulsach kodera). Skok wartości tej zmiennej jest obliczany tak, by wartość znajdująca się w zmiennej krok była żądanym przemieszczeniem kątowym mierzonym w stopniach. Wewnątrz pętli następuje ustawianie serwomechanizmu o numerze ID zapisanym w zmiennej dyn.l1_id na pozycji zależnej od aktualnej wartości zmiennej polozenie. Za pomocą polecenia sleep(czasustalenia) wprowadzone zostaje opóźnienie (o długości zależnej od wartości zmiennej CzasUstalenia), które umożliwia zaobserwowanie zaimplementowanego zachowania.
24 5. Sterownik w Gostai Urbi 5.2 Dokonywanie pomiaru w wybranych punktach Kolejnym zachowaniem jest dokonywanie pomiaru momentu obrotowego po ustawieniu serwomechanizmu w wybranych przez użytkownika punktach, w ośrodku wodnym, dla turbiny posiadającej trzy łopaty. Założono, że moduły Pomiar oraz Dynamixel zostały poprawnie uruchomione zgodnie z instrukcją przedstawioną w rodziałach 3.3 oraz 3.2.3. Ponadto założono również, że wartości zmiennych x oraz y to zadane przez użytkownika pozycje łopaty. pom.openoutput("output.csv"); dyn.setgoalposition(dyn.l1_id, x), sleep(czasustalenia); pom.writedata(turbpos, dyn.l1_pos,dyn.l2_pos,dyn.l3_pos); dyn.setgoalposition(dyn.l1_id, y), sleep(czasustalenia); pom.writedata(turbpos, dyn.l1_pos,dyn.l2_pos,dyn.l3_pos); pom.closeoutput(); Kolejno wykonywane polecenia to: Najpierw otwierany jest plik wyjściowy o nazwie output.csv. Dalej następuje ustawienie serwomechanizmu o ID zapisanym w zmiennej dyn.l1_id w wybranej przez użytkownika pozycji zapisanej w zmiennej x. Za pomocą polecenia sleep(czasustalenia) wprowadzone zostaje opóźnienie. W tym wypadku jest ono wymagane w celu uzyskania przepływu wody niezaburzonego ruchem łopaty. Pomiar momentu zostaje zapisany do otwartego wcześniej pliku wraz z pozycjami wszystkich trzech łopat oraz pozycją głównego wału wiatraka. Operacja jest powtarzana w wybranym przez użytkownika położeniu zapisanym w zmiennej y. Plik wyjściowy zostaje zamknięty. 5.3 Metoda przeglądu zupełnego dla trzech łopat Ostatnim z opisanych przykładów jest drugie z zaimplementowanych w aplikacji zachowań. Pozwala ono na sprawdzenie wszystkich permutacji ułożeń łopat w zadanym przedziale, z zadaną rozdzielczością. Niestety, ze względu na dużą złożoność obliczeniową metoda ta powinna być stosowana jedynie dla niewielkich przedziałów i rozdzielczości. var StartPos1; var StartPos2; var StartPos3; StartPos1=StartPos2=StartPos3=500;
5.4. Format plików wyjściowych 25 dyn.setgoalposition(dyn.l1_id,startpos1); dyn.setgoalposition(dyn.l2_id,startpos2); dyn.setgoalposition(dyn.l3_id,startpos3); var i; var j; var k; pom.openoutput("output.csv"); for(i= -Zakres ; i < Zakres ; i +=Rozdzielczosc){ dyn.setgoalposition(dyn.l1_id, StartPos1+(i/360)*1023); for(j= -Zakres ; j < Zakres ; j += Rozdzielczosc){ dyn.setgoalposition(dyn.l2_id, StartPos2+(j/360)*1023); for(k= -Zakres ; k < Zakres ; k +=Rozdzielczosc){ dyn.setgoalposition(dyn.l3_id, StartPos3+(k/360)*1023); sleep(czasustalenia); pom.writedata(turbpos, dyn.l1_pos,dyn.l2_pos,dyn.l3_pos); }; }; }; pom.closeoutput(); Kolejno wykonywane polecenia to: Na początku zadeklarowane zostają zmienne odpowiadające za położenie początkowe łopat. Wcześniej zadeklarowane zmienne zostają zainicjalizowane wartością 500 - docelowo położenie początkowe ma być zależne od obecnego kąta obrotu wału głównego turbiny. Następnie serwomechanizmy ustawiane są w pozycji początkowej Zadeklarowane zostają zmienne pomocnicze oraz otwierany jest plik wyjściowy o nazwie output.csv. Trzy zagnieżdżone pętle for realizują algorytm przeszukiwania zupełnego w danym zakresie (zapisanym w zmiennej Zakres oraz z daną rozdzielczością (zmienna Rozdzielczość). W ostatniej z pętli dokonywany jest pomiar wartości momentu, oczywiście po ustaleniu się przepływu wody. Na końcu zamykany jest plik wyjściowy 5.4 Format plików wyjściowych Dane są zapisywane do pliku w formacie.csv (Comma Separated Values - wartości rozdzielone przecinkami). Jest to bardzo popularny format zapisu danych, w którym kolejne wartości są oddzielone przecinkami zaś średnik oznacza koniec linii. Przykładowy plik w tym formacie otwarty za pomocą programu Notatnik przedstawia rys. (5.1).
26 5. Sterownik w Gostai Urbi Rysunek 5.1 Przykładowy plik w formacie.csv W tym przypadku pierwsza wartość to kąt skręcenia głównego wału wiatraka, następne trzy to pozycje wszystkich serwomechanizmów, ostatnia z nich to zmierzony moment. Wielką zaletą plików zapisanych w tym formacie jest łatwość z jaką można je importować w programach takich jak np Microsoft Excel czy też OpenOffice. Rys. (5.2) przedstawia przykład zaimportowanego w ten sposób pliku: Rysunek 5.2 Plik w formacie.csv zaimportowany do programu Microsoft Excel
5.4. Format plików wyjściowych 27 Takie podejście pozwala na proste i szybkie generowanie wykresów najważniejszych przebiegów. Przykładowy wykres zależności momentu od położenia łopaty przedstawia rys. (5.3). Rysunek 5.3 Wykres przykładowej zależności momentu obrotowego generowanego przez turbinę od położenia pierwszej łopaty.
Rozdział 6 Podsumowanie W ramach niniejszego projektu powstać miały narzędzia pozwalające na stworzenie w pełni funkcjonalnego stanowiska do pomiaru momentu obrotowego turbiny wiatrowej. Oprócz tego powstałe narzędzia należało wykorzystać do stworzenia odpowiednich zachowań w celu udowodnienia ich funkcjonalności i sprawdzenia założeń projektu. W celu zrealizowania pomiaru momentu dokonano połączenia kilku istniejących już elementów w jedną całość. Było to możliwe dzięki platformie Gostai Urbi, która spełniła stawiane wobec niej oczekiwania. Modułowa budowa oprogramowania Urbi okazała się być idealnie przystosowana do sterowania zróznicowanych systemów oraz implementowania ich współpracy. Interfejs graficzny stworzonej aplikacji jest przystępny i co najważniejsze łatwo rekonfigurowalny, co jest niezwykle ważne w przypadku obiektu o tak dużej liczbie nieznanych parametrów. Zaimplementowane zachowania wraz z zaproponowanym układem pomiarowym pozwalają w teorii na maksymalnie dokładny pomiar momentu na osi turbiny. Przeprowadzenie badań na rzeczywistym obiekcie okazało się niestety niemożliwe. Jest to związane z faktem, iż firma Cad-Mech nie zdążyła na czas skonstruować w pełni funkcjonalnego prototypu turbiny ani tunelu hydrodynamicznego w którym prowadzone miały być badania. Niemniej jednak prace te są na ukończeniu i w najbliższej przyszłości planowane jest przetestowanie stanowiska oraz stworzonych zachowań na prototypie turbiny. Po rozpoczęciu badań i wstępnym zapozananiu się z charakterystykami momentu dla różnych konfiguracji łopat planowane jest też wprowadzenie zachowań pozwalających na wyznaczanie maksimum w jak najkrótszym czasie.
Bibliografia [1] Artur Muraszkowski, Rejestracja i analiza ruchu obiektu w przestrzeni trójwymiarowej [2] http://www.gostai.com/products/urbi/ [3] Robotis Co., Ltd., Dynamixel RX-64 Users Manual [4] www.autodesk.pl/inventor [5] http://www.simex.pl/produkt/2513 [6] http://zepwn.com.pl/_upload/products_files/karta_cl22.pdf [7] http://www.wobit.com.pl/download/pdf/czujniki_momentu/dfm2x_datasheet_pl.pdf [8] http://www.gnu.org/licenses/agpl.html [9] http://assets.mhint.s3.amazonaws.com/downloads/3707/205146_datasheet.pdf [10] http://www.prolific.com.tw/support/files//io%20cable/pl- 2303HX/Documents/Datasheet/ds_pl2303HX_v1.6.pdf [11] http://sklep.avt.pl/photo/_pdf/avt530.pdf [12] http://www.datasheetcatalog.org/datasheet/texasinstruments/max232.pdf [13] http://www.datasheetcatalog.org/datasheet/maxim/max1487-max491.pdf [14] http://lirec.eu/ [15] http://wwwnt.if.pwr.wroc.pl/kwazar/mtk2/fizycy/126784/liczba.html [16] http://www.meanwell.com/search/dr-60/dr-60-spec.pdf