Wrocław, 14 czerwca 2012 Sterowniki Robotów Projekt Gostai URBI Power Swith Michalina Kotyla 180460 Opiekun projektu mgr inż. Jan Kędzierski 1 Cel projektu Celem projektu było utworzenie modułu dla URBI obsługującego istniejący już projekt Power Swith autorstwa Damiana Kowalskiego. Power Swith to urządzenie pozwalające na zdalne sterowanie stanem 8 diod. Zadanie polegało na dostosowaniu do wymogów UObjectów posiadanych kodów źródłowych projektu i przetestowanie gotowego UObjectu na platformie Gostai URBI. 2 Środowisko programistyczne URBI to platforma programistyczna zorientowana obiektowo używana do tworzenia aplikacji dla robotyki oraz systemów złożonych. Jest to oprogramowanie typu multiplatform. Bazuje na UObjectach architekturze rozproszonych komponentów. Platforma URBI zapewnia użytkownikom język programowania umożliwiający równoległe zarządzanie zdarzeniami, stworzenie modułu zgodnego z jej wymogami oraz pozwala na wykorzystywanie go do różnych robotów bez znajomości dokładnej specyfikacji użytego kodu. 3 Hardware Obsługiwane urządzenie wyposażone jest w mikrokontroler ATmega8A ze złączem zgodnym ze standardem KANDA służącym do jego programowania. Użytkownik ma możliwość sterownia jedną z 8 diod, ostatnia dziewiąta dioda sygnalizuje podłączenie i pracę urządzenia, nie ma możliwości sterowania jej stanem. Urządzenie komunikuje się z komputerem za pomocą standardu USB (Universal Serial Bus). Szczegółowa specyfikacja techniczna sprzętu dostępna jest w dokumentacji projektu Power Swith utworzonej przez Damiana Kowalskiego. 1
Rysunek 1: Urządzenie Power Swith i rozmieszczenie diod 4 Oprogramowanie projektu bazowego Twórca projektu dostarczył aplikację umożliwiającą sterowanie urządzeniem. Sterowniki niezbędne do poprawnej komunikacji między urządzeniem a komputerem to ogólnodostępne w internecie drivery Libusb dla systemu Windows. Po instalacji powyższego oprogramowania można rozpocząć testowanie urządzenia. Autor projektu dostarczył kod źródłowy programu, zatem utworzenie modułu URBI zostało znacznie ułatwione. Pierwszym etapem realizacji projektu było utworzenie UObjectu. 5 Jak stworzyć nowy UObject? Pracując z URBI w środowisku Windows można skorzystać z Visual Studio (2008 lub 2005), które podczas instalacji URBI zostaje wyposażone w szablon UObjectów. Poszczególne kroki tworzenia nowego UObjectu oraz otrzymany szablon przedstawiono poniżej. 2
Rysunek 2: Pierwszy krok tworzenie nowego Projectu Visual Studio Rysunek 3: Wybór typu nowego projektu 3
#include <urbi / uobject. hh> Listing 1: Szablon nowego UObjectu class ULedy : public urbi : : UObject { public : ULedy( const std : : s t r i n g& s t r ) ; int i n i t ( ) ; } ; ULedy : : ULedy( const std : : s t r i n g& s ) : urbi : : UObject ( s ) { UBindFunction (ULedy, i n i t ) ; } ; int ULedy : : i n i t ( ) { return 0 ; } ; UStart (ULedy ) ; 6 Modyfikacja funkcji autora na funkcje rozpoznawane przez URBI Pierwszym o czym należy pamiętać przy tworzeniu UObjectu dla Power Swith jest dodanie do projektu libusb.lib, czyli biblioteki odpowiedzialnej za obsługę portu USB oraz jej pliku nagłówkowego usb.h (koniecznie trzeba przekopiować go do folderu projektu). Tworząc nową funkcję dla URBI trzeba zadeklarować ją w klasie tworzonego UObjectu. Następnie każdą funkcję należy zbindować, tak jak funkcję init(), po to by można z niej później korzystać. Aby zrealizować wszystkie cele projektu należało zapewnić w URBI pełną funkcjonalność projektu bazowego. 6.1 myusbopendevice Funkcja odpowiadająca za otwarcie portu. Zmiana wprowadzona w stosunku do funkcji oryginalnej wymagała zmiany wartości zwracanej przez funkcję ze wskaźnika na void. Po analizie kodu okazało się, że wszystkie parametry wywoływane przez tę funkcje są zdefiniowane na sztywno w pętli głównej programu, zatem można zmienić to tak by można było ją wywoływac bez żadnych parametrów. Funkcja była oryginalnie wywoływana z parametrami: int vendor = 0x16C0; const char *vendorname = DamKow - company ; 4
int product = 0x05DC; const char *productname = USBeSwith ; Używany jest licencjonowany przez OBdev identyfikator dostawcy (vendor) i produktu (product) dane pozostają bez zmian, jak podane na stronie OBdev. Dostosowano nazwę producenta (vendorname) oraz produktu(productname). 6.2 usb c ontrol m sg Funkcja z biblioteki libusb. Wysyła wiadomość kontrolną do urządzenia. Wywołanie funkcji z parametrami: dev wskaźnik do urządzenia USB, do którego trzeba wysłać wiadomość, pipe punkt końcowy do wysyłania wiadomości, request komunikat USB, żądana wartość, requesttype komunikat USB, żądany typ wartości, value wartość komunikatu USB, index komunikat USB, wartość indeksu, data wskaźnik do danych do wysłania, size długość w bajtach danych do wysłania, timeout czas w ms czekania na wiadomość do zakończenia przed upływem czasu(jeżeli 0 to czekanie w nieskończoność). 6.3 usbgetdescriptor Funkcja pomocnik, odpowiedzialna za pobieranie deskryptorów służacych do identyfikacji urządzenia. 6.4 logo Funikcja odpowiada za wyświetlanie zdefiniowanych komunikatów/nagłówków w postaci loga zamiast zwykłego tekstu. Wywoływana jest z jednym parametrem numerem loga, którego chcemy użyć. 6.5 on Funkcja odpowiada za włączenie danego portu. Funkcja wywoływana jest z jednym parametrem numerem diody, która ma zostać włączona. 6.6 off Funkcja odpowiada za wyłączenie danego portu. Funkcja wywoływana jest z jednym parametrem numerem diody, która ma zostać wyłączona. 5
6.7 opoznij Funkcja odpowiada za wyłączenie danego portu i włączenie go z zadanym parametrem. Funkcja wywoływana jest z dwoma parametrami numerem diody, która ma zostać załączona z opóźnieniem oraz czasem opóźnienia podanym w sekundach. 6.8 zapisz Funkcja zapisująca w urządzeniu obecne stany portów, wywoływana bez żadnego parametru. Po wyłączeniu i ponownym podłączeniu urządzenie znajduje się w ostatnoi zapamiętanym stanie. 6.9 help Funkcja wyświetlająca pomoc, wywoływana bez żadnego parametru. 6.10 koniec Funkcja odpowiadająca za bezpieczne odłączenie urządzenia. Wywoływana z parametrem : 1 stan diod jest zapamiętywany(zapisywany w pamięci urzadzenia), 0 zamknięcie portu bez zapamiętywania stanu. 7 Kompilacja i ładowanie modułu Po utworzeniu potrzebnych funkcji należy skompilować projekt w trybie Release. Po kompilacji zakończonej sukcesem należy otworzyć folder zawierający plik projektu, odnaleźć folder Release a w nim plik z rozszerzeniem.dll i nazwie zgodnej z nazwą projektu. Plik kopiuje się do folderu zawierającego URBI. Po przekopiowaniu modułu uruchamia się serwer URBI. Dobrym pomysłem jest zainstalowanie oprócz serwera URBI aplikacji Gostai Console. Pozwala ona w łatwy sposób komunikować się z serwerem. Po odpaleniu serwera włącza się konsolę, która domyślnie ma ustawiony adres i port do komunikacji z serwerem, następnie należy kliknąć połącz (przycisk z zieloną kropką znajdujący się na prawo od paska adresu serwera, po ustanowieniu połączenia przycisk zmienia barwę na czerwoną). 6
Rysunek 4: Włączony serwer URBI oraz połączona z nim konsola Po ustanowieniu połączenia można przejść do załadowania modułu za pomocą komendy: => loadmodule ( NazwaModulu ) ; Należy pamiętać o średniku na końcu komendy (średnik oznacza sekwencyjny tryb wykonywania komend). 8 Zdalne sterowanie urządzeniem Po załadowaniu modułu do URBI oraz podłączeniu urządzenia do portu USB komputera można przystąpić do sterowania. Pierwszą czynnością jaką należy wykonać jest stworzenie zmiennej służacej do komunikacji z modułem, np.: => var l = ULedy.new ( ) ; Teraz należy otworzyć port wywołując funkcje myusbopendevice: => l. myusbopendevice ( ) ; Po wykonaniu tych czynności można przystąpić do zapalenia i gaszenia wybranych diod, zapamiętywania stanów i bezpiecznego odłączania urządzenia. Diod jest 8, a wybranie opcjii 11 tyczy się do wszystkich. => l. on ( 1 1 ) ; 7
Rysunek 5: Wywołanie komend z konsoli Rysunek 6: Efekt po wywołaniu komend Poniższy kod spowoduje zgaszenie co drugiej diody. => l. o f f ( 7 ) ; => l. o f f ( 5 ) ; => l. o f f ( 3 ) ; => l. o f f ( 1 ) ; Rysunek 7: Co druga dioda zgaszona Poniższy kod zaświeci diody nr 1 i 3 oraz bezpiecznie odłączy urządzenie zapamiętując stan. Po ponownym podłączeniu urządzenia obserwuje się stan, w którym diody nr 1 oraz 3 są włączone. 8
=> l. o f f ( 1 1 ) ; => l. on ( 1 ) ; => l. on ( 3 ) ; => l. koniec ( 1 ) ; Rysunek 8: Stan diod po ponownym włączeniu zasilania W analogiczny sposób wywołuje się pomoc, która wyświetlana jest w terminalu URBI. => l. pomoc ( ) ; Rysunek 9: Wyswietlanie menu pomocy w terminalu URBI Poniższy kod powoduje wyłączenie diody nr 5(jeśli jest włączona) oraz jej załączenie po 10s. => l. o p o z n i j (5, 1 0 ) ; 9
9 Podsumowanie Realizacja projektu zakończyła się pełnym sukcesem. Utworzono moduł URBI dedykowany dla systemu Windows, obsługujący pełną funkcjonalność urządzenia. Projekt pozwolił na poszerzenie własnej wiedzy programistycznej. Wystąpiły pewne problemy przy dołączaniu zewnętrznych bibliotek jednak zostały one rozwiązane co pozwoliło ukończyć postawione zadanie. 10 Bibliografia 1. Dokumentacja projektu Power Swith autorstwa Damiana Kowalskiego czerwiec 2012 2. http://www.gostai.com/downloads/urbi/2.x/doc/urbi-sdk.pdf kwiecień czerwiec 2012 3. http://codeandlife.com/2012/01/29/avr-attiny-usb-tutorial-part-3/ czerwiec 2012 4. http://www.learncpp.com/cpp-tutorial/a2-using-libraries-with-visual-studio-2005-express/ czerwiec 2012 5. http://en.wikipedia.org/wiki/urbi marzec 2012 6. http://www.gostai.com/doc/urbi-quickstart-1.5.pdf kwiecień czerwiec 2012 7. http://forum.urbiforge.org/ kwiecień czerwiec 2012 8. http://www.obdev.at/products/vusb/index-de.html czerwiec 2012 10