Kontroler frezarki CNC: pad do gier z QjoyPad

Bardzo często, pracując przy frezarce, zachodzi potrzeba ręcznego ustawienia osi, do tego z różnych stron maszyny. Chodzenie dookoła z ogromną klawiaturą jest niewygodne, a sterowanie w powietrzu odpada. Można zrobić od zera własny kontroler oparty np. o sterownik klawiatury. Takie były nasze pierwsze koncepcje, dopóki nie trafiliśmy na sterownik QjoyPad dla padów do gier komputerowych. Pod ręką mieliśmy joystick od PS3, który okazał się kompatybilny ze sterownikiem, więc zabraliśmy się do działania.
Najnowszy LinuxCNC oparty jest na Debianie i na nim opisany będzie przykład instalacji i użytkowania urządzenia. Urządzenie powinno działać bez problemu na innych dystrybucjach Linuksa. Instalacja jest bardzo prosta, wystarczy tylko wklepać do terminala kolejne komendy i klikać Enter. Informacje dotyczące instalacji znajdziemy na stronie http://ubuntnt.blogspot.com/2011/07/how-to-setup-sixaxis-controller-with.html. Na stronie http://qjoypad.sourceforge.net/ jest do pobrania paczka z najnowszym oprogramowaniem, opisane są wszystkie wymagania oraz informacje o obsługiwanych padach.
Instalacja QjoyPad
Na początku musimy zainstalować driver do naszego przyszłego kontrolera. Możemy pobrać paczkę ze strony http://atrey.karlin.mff.cuni.cz/~vojtech/joystick/, tam znajdziemy też informacje o obsługiwanych padach. Żeby było szybciej, możemy zamiast tego wpisać w terminal komendę:
sudo apt-get install joystick
QjoyPad używa Qt, dlatego musimy zainstalować paczki z ich oprogramowaniem. Kopiujemy całą poniższą linijkę, wklejamy w terminal i zatwierdzamy Enterem:
sudo apt-get install libqt4-core libqt4-dev qt4-dev-tools qt4-designer qt4-doc
W wymaganiach do poprawnego działania QjoyPad jest zawarta instalacja X Window, np. z www.x.org. Aby było łatwiej, możemy wklepać w terminal poniższą komendę:
sudo apt-get install libxtst6 libxtst-dev
Teraz pobieramy i instalujemy program QjoyPad. Komendą „cd” ustawiamy ścieżkę dostępu do pliku pobranego ze strony głównej QjoyPad. W przykładzie folder downloads:
cd ~/downloads
Poniższa komenda rozpakuje plik qjoypad-4.1.0. W przypadku innej wersji musimy podać jej nazwę:
tar xzf qjoypad-4.1.0.tar.gz
I po ustawieniu odpowiedniej ścieżki kompilujemy nasz program:
cd qjoypad-4.1.0/src
./config
make
sudo make install
Gotowe!!! Po tej katordze czas na zabawę. My używamy pada od Playstation 3 Sixaxis, czyli pełen wypas z akcelerometrami chyba w sześciu osiach :P Przed rozpoczęciem pracy warto dodać zainstalowany program do autostartu. Wchodzimy w Programy/Ustawienia/Sesja i uruchamianie. Klikamy przycisk Dodaj, w nazwie wpisujemy, co chcemy, np. QjoyPad, a w poleceniu dodajemy ścieżkę Usr/local/bin/qjoypad. Jeżeli chcemy go uruchamiać ręcznie, wystarczy, że wciśniemy Alt+F2 i wpiszemy w okno „qjoypad”.

Ilustracja 1. Dodanie programu qjoypad do autostartu
Konfiguracja
Instalacja zakończona! Czas więc przejść do skonfigurowania programu. Nie polecam używania przycisku „quick set” do konfigurowania klawiszy w Sixaxis. Do przycisków dość łatwo przypisują się czułe osie z akcelerometrami.

Ilustracja 2. Okno główne programu QjoyPad
W trakcie konfigurowania osi (axis) możemy ustawić suwakami jej czułość maksymalną i minimalną. Osie mogą sterować przyciskami lub myszą. W przypadku przycisków nie mamy żadnych dodatkowych ustawień, natomiast dla myszy można ustawić szybkość, czułość oraz funkcję działania: liniową, kwadratową, potęgową itp.

Ilustracja 3. Konfiguracja osi w programie QjoyPad
Ustawienie przycisków (buttons) jest prostsze. Wybieramy tylko przycisk na klawiaturze, któremu ma odpowiadać klawisz pada. Opcjonalnie możemy zaznaczyć dwa pola, które zmieniają odpowiedź na kliknięcie:
- STICKY – klawisz po wciśnięciu „przykleja się”, czyli trzyma, a po ponownym wciśnięciu puszcza,
- RAPID FIRE – pulsowanie przycisku, szybkie przełączanie, do gier typu strzelanki.

Ilustracja 4. Konfiguracja przycisku w programie QjoyPad
Dla ułatwienia poniżej znajduje się tabelka z rozpiską wszystkich klawiszy pada Sixaxis i przykładowe przypisanie przycisku.
Konfiguracja osi i przycisków dla pada Playstation 3:
| Klawisz lub oś w QjoyPad | Klawisz lub oś w Sixaxis | Przykładowa funkcja w programie | Opis działania |
|---|---|---|---|
| AXIS1 | Lewy analog poziomo | Mouse (Hor.) | Ruch myszy poziomy |
| AXIS2 | Lewy analog pionowo | Mouse (Vert.) | Ruch myszy pionowy |
| AXIS3 | Prawy analog poziomo | No key, No key | -, - |
| AXIS4 | Prawy analog pionowo | KP_Page up(9), KP_Page down(3) | Ruch osi Z góra, dół |
| Axis 24 | Ruch padem prawo/lewo | KP_5, KP_7 | Klawisze 5, 7 |
| Axis 25 | Ruch padem przód/tył | ENTER, ESC | ENTER, ESC |
| Axis 26 | Ruch padem góra/dół | No key, No key | -, - |
| Axis 27 | Obrót padem wokół osi | No key, No key | -, - |
| B1 | SELECT | r | Start programu |
| B2 | Przycisk lewy analog | LEFT MOUSE BUTTON | Lewy klik myszą |
| B3 | Przycisk prawy analog | l | Ignoruj zakresy |
| B4 | START | F9 | Start/stop wrzeciona |
| B5 | UP | KP_UP(8) | Ruch osią Y w górę |
| B6 | RIGHT | KP_RIGHT(6) | Ruch osią X w prawo |
| B7 | DOWN | KP_DOWN(2) | Ruch osią Y w dół |
| B8 | LEFT | KP_LEFT(4) | Ruch osią X w lewo |
| B9 | L2 | c | Ruch ciągły osią |
| B10 | R2 | k | Zmniejszenie podziału kroku |
| B11 | L1 | F2 | Start/stop LinuxCNC |
| B12 | R1 | i | Zwiększenie podziału kroku |
| B13 | Trójkąt | 2 | Zwiększenie prędkości osi |
| B14 | Kółko | KP_0 | Czyszczenie ekranu |
| B15 | X | 1 | Zmniejszenie prędkości osi |
| B16 | Kwadrat | END | Ustawienie zakresu wybranej osi |
| B17 | Guzik PlayStation | HOME | Bazowanie wybranej osi |
Przy konfiguracji jak w tabeli mamy dostęp do wszystkich ważnych funkcji maszyny, a dodatkowo, przez wykorzystanie klawiszy numerycznych do ruchu osi, do wszystkich cyfr od 0 do 9. Musimy tylko zapamiętać, gdzie je przypisaliśmy. Ruchem do przodu zatwierdzamy wybór, natomiast w tył anulujemy. Joystickiem analogowym prawym można sterować tylko osią Z w górę i w dół. Ustawienie innych klawiszy pod lewo i prawo powodowało dużą niestabilność w odczycie. Do przycisku w tym analogu jest przypisany klawisz „l”, czyli ignorowanie limitów, używany najczęściej, gdy oś jest zablokowana. Na wszelki wypadek mamy możliwość sterowania myszką i dostępny lewy przycisk.
Aby sterowanie frezarką w ten sposób było możliwe, będziemy musieli zmodyfikować nieco nasz plik axis z LinuxCNC. W Debianie wciskamy Alt+F2 i wpisujemy gksu Thunar, po wpisaniu hasła otworzy nam się przeglądarka plików z uprawnieniami roota (administratora). Szukamy w katalogu systemu usr/bin pliku axis. Otwieramy plik w edytorze gedit, ponieważ jest najwygodniejszy w obsłudze. W Debianie nie jest zainstalowany standardowo, więc wpisujemy w terminal:
sudo apt-get install gedit
Po otwarciu pliku w edytorze gedit zmieniamy definicje klawiszy, aby wygodnie obsługiwać się naszym padem. W pliku axis szukamy linijek:
1. root_window.bind("<Escape>", commands.task_stop)
2. root_window.bind("i", lambda event: jogspeed_incremental())
3. root_window.bind("I", lambda event: jogspeed_incremental(-1))
4. root_window.bind("<Home>", commands.home_axis)
5. root_window.bind("<KP_Home>", kp_wrap(commands.home_axis, "KeyPress"))
6. root_window.bind("<Control-Home>", commands.home_all_axes)
7. root_window.bind("Control-k", commands.clear_live_plot)
Konieczna jest zmiana wszystkich użytecznych klawiszy, aby dało się je wcisnąć bez Shifta lub Ctrl. Czyli klawisz „duże I” zmienimy na „k”, „Ctrl+K” na zero numeryczne, dodatkowo bazowanie wszystkich osi można ustawić na po prostu „Home”, a pojedynczej na „Ctrl+Home”. Klawisz Escape wyłączamy z działania, aby nie przerywał pracy przy ruchu padem w tył. Wprowadzamy zmiany do linijek:
1. root_window.bind("<Escape>", "#nothing")
2. root_window.bind("i", lambda event: jogspeed_incremental())
3. root_window.bind("k", lambda event: jogspeed_incremental(-1))
4. root_window.bind("<Home>", commands.home_all_axes )
5. root_window.bind("<KP_Home>", kp_wrap(commands.home_all_axes, "KeyPress"))
6. root_window.bind("<Control-Home>", commands.home_axis)
7. root_window.bind("KP_0", commands.clear_live_plot)
Wygodne będzie też ustawienie zmiany prędkości przejazdu za pomocą dwóch klawiszy, np. „1” zmniejsza prędkość, a „2” ją zwiększa. Zmieniamy zawartość funkcji activate_axis_or_set_feedrate(n):
def activate_axis_or_set_feedrate(n):
ustawiona_predkosc = widgets.feedoverride.get()
if n == 0:
set_feedrate(0)
if n == 1:
ustawiona_predkosc -= 5
if ustawiona_predkosc < 0:
ustawiona_predkosc = 0
set_feedrate(ustawiona_predkosc)
if n == 2:
ustawiona_predkosc += 5
if ustawiona_predkosc > 100:
ustawiona_predkosc = 100
set_feedrate(ustawiona_predkosc)
if n>2:
set_feedrate(n*10)
W ten sposób mamy w pełni funkcjonalny kontroler do naszej maszyny. Pełne sterowanie w 3 osiach, regulacja prędkości, skoku, bazowanie, ustawienie offsetów, włączenie wrzeciona. Do tego dostęp do pełnej klawiatury numerycznej, zatwierdzanie wyboru, anulowanie. Jedyną wadą jest spora cena nowych padów do PS3, ale zawsze można kupić coś używanego. Po skonfigurowaniu Bluetootha pad można używać jako bezprzewodowy, my tego jeszcze nie zrobiliśmy. Czego chcieć więcej od takiego małego, poręcznego kontrolera?
