Część mechaniczną wykonano z dwóch serwomechanizmów połączonych ze sobą (sklejonych) jak na fotografii 1. Jeden odpowiada za ruch w płaszczyźnie poziomej, drugi w płaszczyźnie pionowej. W trakcie sklejania należy zwrócić uwagę czy serwomechanizmy mogą swobodnie poruszać się w całym zakresie, czy nie są blokowane przez pozostałe elementy mechaniczne oraz czy są równo ustawione. Do serwomechnizmów należy dołączyć duży, płaski element, który będzie pełnił rolę podstawki lub elementu mocującego oraz np. metalowy kątownik, na którym zostanie zamocowana sama kamera.
Serwomechanizm
Serwomechanizm to silnik z przekładnią i układem sterującym skonfigurowanymi w taki sposób, aby umożliwić ruch osi w pewnym zakresie, najczęściej 180 stopni. Serwomechanizm jest kontrolowany za pomocą przebiegu impulsowego o ściśle określonych parametrach. Położenie osi jest proporcjonalne do czasu trwania impulsu sterującego, co pokazano na rysunku 2.
Większość serwomechanizmów wymaga zasilania napięciem z zakresu 4,5...6 V. W stanie spoczynku pobiera niewielki prąd rzędu kilkudziesięciu miliamperów. W czasie przemieszczania się lub gdy ramie jest obciążone (nawet nie musi być w ruchu), silnik napędu może pobierać znaczny prąd, nawet kilka amperów.
Dlatego bardzo ważne jest zapewnienie odpowiednio wydajnego zasilania, a najlepszym rozwiązaniem jest zastosowanie oddzielnego zasilacza specjalnie dla serwomechanizmu. W proponowanym rozwiązaniu zastosowano serwomechanizmy modelarskie klasy "micro", a współpracująca kamera jest lekka, więc nie użyto odrębnego zasilacza. Całość należy jednak zasilać z zasilacza, a nie z portu USB, który może mieć zbyt małą wydajność prądową oraz dołączyć dodatkowy kondensator filtrujący zasilanie o dużej pojemności.
Panel sterujący
Jako panel sterujący zastosowano pokazany na fotografii 3 moduł AVT1618, który zawiera następujące elementy umożliwiające wygodną manipulację kamerą: joystick, dwa przyciski, dwie diody LED oraz wyprowadzone złącza dla serwomechanizmów.
Głównym elementem panelu sterującego manipulatora jest joystick analogowy, zbliżonych budową do stosowanych w padach do konsoli PS. Drążek joysticka jest sprzęgnięty z osiami dwóch potencjometrów umieszczonych prostopadle, a ruch drążka zmienia położenie suwaków tych potencjometrów. Jeśli do potencjometrów doprowadzimy zasilanie, to na wyjściach otrzymamy dwa napięcia, jedno odpowiadające położeniu na umownej osi x, a drugie na umownej osi y. Zasadę działania oraz wygląd panelu pokazano na rysunku 4.
Kontroler
"Mózgiem" urządzenia jest płytka Arduino Uno. Ma ona tę zaletę, że kupiona u sprawdzonego dostawcy, na pewno działa i nie trzeba marnować czasu na jej uruchomienie. Sposób połączenia poszczególnych komponentów pokazano na fotografii 5. Gdyby fotografie były niewystarczające, to można posiłkować się schematem zamieszczonym na rysunku 6.
Oprogramowanie
Oprogramowanie sterujące manipulatorem zostało wykonane w środowisku Arduino IDE. Do wygenerowania impulsów sterujących serwomechanizmem należałoby użyć timera zawartego w peryferiach procesora i uruchomić odpowiednie przerwania, ale Adruino ma gotowe rozwiązanie - jest nim biblioteka servo.h, którą dołączymy do projektu.
Odczyt położenia suwaków potencjometrów joysticka zostanie wykonany za pomocą funkcji analogRead.
W celu przetestowania pracy płytki tworzymy nieskomplikowany program, jak na listingu 1. Kompilujemy i przesyłamy do płytki Arduino.
Po załadowaniu programu urządzenie działa, ale można zauważyć, że ruch serwomechanizmów jest gwałtowny i szarpany, zwłaszcza przy szybszym ruchu joysticka. Dzieje się tak, ponieważ serwomechanizmy dążą do jak najszybszego osiągnięcia zadanego położenia.
Może się zdarzyć, że płytka "zawiesi się" - to właśnie efekt gwałtownego poboru prądu przez szybko pracujące serwomechanizmy. W kolejnym programie "zmusimy" je do nieco wolniejszej pracy, dzięki czemu ruch stanie się bardziej płynny i unikniemy zawieszania się płytki. Zmieniamy nieco główną pętlę programu, jak pokazano listingu 2.
Po załadowaniu programu z listingu 2, widzimy, że teraz serwomechanizmy pracują dużo wolniej, ich szybkość możemy regulować wartością opóźnienia na końcu głównej pętli programu. Ponadto, zamieniliśmy parametry polecenia map, dzięki czemu ruch w płaszczyźnie x jest zgodny z ruchem joysticka.
Na koniec sprawimy by nasz manipulator sam wykonywał zapamiętane sekwencje ruchów, co może przydać się do monitorowania obiektów.
Do tego celu przede wszystkim będzie potrzebny bardziej rozbudowany interfejs użytkownika, do którego dodamy obsługę dwóch przycisków i diod LED. Do programu dopisujemy linie kodu definiujące zmienne określające, do których wyprowadzeń są dołączone komponenty:
int led1_pin = 6;
int led2_pin = 5;
int button1_pin = 3;
int button2_pin = 4;
W sekcji setup() dopisujemy konfigurację nowych wyprowadzeń:
pinMode(led1_pin, OUTPUT);
pinMode(led2_pin, OUTPUT);
pinMode(button1_pin, INPUT_PULLUP);
pinMode(button2_pin, INPUT_PULLUP);
Tworzymy funkcje ButtonCheck() oraz LedState() obsługujące nowe komponenty - zamieszczono je na listingu 3.
Teraz potrzebujemy dodatkowych zmiennych, które zapamiętają sekwencje. Wykorzystamy do tego tablice oraz dwie zmienne pomocnicze:
int pos_go; //funkcja replay - gdy 1 to odtwarza sekwencje
int pos_step; //numer położenia
int pos_x[4]; //tablica położeń na płaszczyźnie poziomej
int pos_y[4]; //tablica położeń na płaszczyźnie pionowej
Ostatecznie główna pętla programu będzie wyglądała jak na listingu 4.
Procedury odpowiedzialne za wywoływanie sekwencji ruchów pokazano na listingu 5. PositionSet() służy do zapamiętania aktualnych wartości położenia x i y w tablicach sekwencji, natomiast PositionNext() służy do przełączania kolejnych sekwencji po określonym czasie, po wykonaniu ostatniej sekwencji powraca do pierwszej.
Po załadowaniu programu za pomocą joysticka sterujemy położeniem statywu. Gdy naciśniemy przycisk "1", to zostaje zapamiętane aktualne położenie, jako pierwsze położenie w sekwencji oraz zaświeci się dioda LED1 sygnalizując, że należy wprowadzić kolejne pozycje. Po wprowadzeniu czterech pozycji dioda LED1 zgaśnie. Teraz, przyciskając przycisk 2, uruchamiamy odtwarzanie sekwencji. Statyw będzie ustawiał się po kolei w czterech wcześniej ustawionych pozycjach.
Pełne źródło programu dostępne jest w materiałach dodatkowych do tego artykułu.
KS