Dawno, dawno temu... w czasach, gdy rozpoczynałem swoją przygodę z komputerami, podstawowym wyposażeniem gracza był joystick. Takie nieduże sprytne urządzenie, które umożliwiało sterowanie postaciami z gier w sposób wygodny, dokładny i przede wszystkim nie niszczyło cennej klawiatury komputera. Joystick był obsługiwany przez komputery Atari, Commodore, czy nawet Sinclair (z dodatkowym interfejsem). Komputery PC jako profesjonalne kalkulatory długo musiały czekać na swoje gamepady i inne urządzenia uprzyjemniające rozrywkę. Dzisiaj czasy się trochę zmieniły, PC-ty to w warunkach domowych rozbudowane konsole do gier, a o Amidze, czy ZX Spectrum prawie nikt już nie pamięta... prawie.... W poniższym artykule pokażę jak w prosty sposób wykonać interfejs umożliwiający podłączenie joysticka od Amigi do współczesnego komputera  i przenieść się na chwilę do początku lat 90-tych dwudziestego wieku ;)

Dzisiaj Hobbyści mają bardzo duże możliwości, mogą zbudować w zaciszu domowym urządzenia, o których kiedyś można było tylko pomarzyć. Z pomocą układów Arduino w kilkanaście minut można zbudować interfejs, który pozwoli podłączyć stary cyfrowy joystick do portu USB komputera.

UWAGA!!! Nie ponoszę odpowiedzialności za ewentualne szkody związane z wykonaniem poniższego urządzenia. Wszelkie modyfikacje sprzętowo programowe wykonujecie na własną odpowiedzialność.

Krok 1 - niezbędne materiały

Do zbudowania interfejsu niezbędne będą  dwa komponenty:

  • Arduino Pro Micro,
  • Złącze Cannon D-SUB DB9 - męskie

Dodatkowo przyda się lutownica i kilkanaście centymetrów przewodu połączeniowego. Zwracam uwagę, że w projekcie wykorzystuję Arduino Pro Micro, które wyposażono w procesor Atmega32U4. Jest to bardzo ważne, ponieważ układ ten posiada wbudowaną obsługę USB, co podstawą projektu. Możemy wykorzystać również pełną wersję Arduino Leonardo, ale wtedy interfejs będzie odrobinę większy..;)

Krok 2 - podłączenie elementów

 Trochę teorii na początek. Złącza umożliwiające podłączenie joysticka miały różne standardy. W przypadku komputerów Commodore i Atari wyprowadzenia sygnałów znajdują się w tym samym miejscu, dzięki temu można korzystać z tych urządzeń zamiennie. W poniższej tabelce przedstawiono poszczególne wykorzystywane sygnały:

Numer pinu Nazwa sygnału
1  UP
2  DOWN
3  LEFT
4  RIGHT
5  Button3 (PotX)
6  FIRE
7 VCC(+5V)
8  GND
9  Button2 (PotY)

Piny 7 i 8 to zasilanie układów joysticka, piny 1-4 to informacja o kierunku wychylenia (góra, dół, lewo, prawo). Sygnał jest aktywny, gdy jest zwarty do masy. Pin 6 to tzw. Fire czyli podstawowy przycisk w każdym joysticku. Piny 5 i 9 rzadko wykorzystywane jako dodatkowe przyciski lub wejścia analogowych manipulatorów (potencjometrów). W naszym projekcie wykorzystamy piny 1-4, 6-8. W przypadku joysticka podłączenie do niego zasilania (5V) ma sens, gdy dysponuje on układem "Auto-Fire" czyli symulującym szybkie ciągłe naciskanie przycisku Fire. Dysponując wiedzą na temat funkcji poszczególnych pinów możemy przejść do montażu całego układu. Montaż sprowadza się do podłączenia poszczególnych pinów do pinów układu Arduino Pro Micro. Listę połączeń przedstawiono w tabelce poniżej:

Nazwa sygnału Złącze D-SUB Arduino Pro Micro
UP 1 D9
DOWN 2 D8
LEFT 3 D7
RIGHT 4 D6
Button3 (PotX) 5 -
FIRE 6 D5
VCC(+5V) 7 5V
GND 8 GND
Button2 (PotY) 9 -

Do wykonania połączeń  wykorzystujemy dostępne materiały - ja skorzystałem z kilku fragmentów skrętki. Jak widać na poniższym zdjęciu wszystko trzyma się całkiem solidnie. Po zamknięciu w obudowie posłuży długo....

W międzyczasie zaprojektowałem obudowę. Można ją wydrukować na drukarce 3d. Nie jest może piękna, ale spełni swoje zadanie - zabezpieczy naszą cenną konstrukcję przed uszkodzeniem. Gdyby ktoś chciał sobie wydrukować taką obudowę, to można ją pobrać >>tutaj<<.

Po wykonaniu połączeń i sprawdzeniu ich poprawności możemy przystąpić do wgrania "super skomplikowanego programu", który ożywi nasze dzieło...

 Krok 3 - software

Pora na napisanie programu, który odczyta dane z joysticka i przekaże je do naszego komputera. W pierwszym kroku musimy zaopatrzyć się w bibliotekę, która wykona większość skomplikowanych operacji za nas. Ściągamy ze strony GitHub bibliotekę ArduinoJoystickLibrary i dodajemy ją do naszego środowiska ArduinoIDE. Następnie przechodzimy do napisania prostego programu.

 

#include <Joystick.h>
Joystick_ Joystick;    
      //Utworzenie nowego obiektu joysticka
#define P_UP 9
#define P_DOWN 8
#define P_LEFT 7
#define P_RIGHT 6
#define P_FIRE 5
void setup() {
  pinMode(P_UP, INPUT_PULLUP);
  pinMode(P_DOWN, INPUT_PULLUP);
  pinMode(P_LEFT, INPUT_PULLUP);
  pinMode(P_RIGHT, INPUT_PULLUP);
  pinMode(P_FIRE, INPUT_PULLUP);
  Joystick.begin();     // start emulacji joysticka
  Joystick.setYAxisRange(-127,127); 
        // ustawienie wartości granicznych dla osi X
  Joystick.setXAxisRange(-127,127);
       // ustawienie wartości granicznych dla osi Y
  delay(100);
}

void loop() {
  Joystick.setButton(0, !digitalRead(P_FIRE));
  if(!digitalRead(P_UP))
   Joystick.setXAxis(127);
  else if(!digitalRead(P_DOWN))    
   Joystick.setXAxis(-127);
  else
   Joystick.setXAxis(0);    
  if(!digitalRead(P_LEFT))
   Joystick.setYAxis(127);
  else if(!digitalRead(P_RIGHT))    
   Joystick.setYAxis(-127);
  else
   Joystick.setYAxis(0);    
  delay(50);
}

W funkcji setup() ustawiamy piny jako wejścia z podciągnięciem do zasilania. Następnie korzystając z biblioteki uruchamiamy obsługę joysticka (Joystick.begin()). Funkcje Joystick.setXAxisRange(),Joystick.setYAxisRange() ustawiają zakres dopuszczalnych wartości dla poszczególnych osi.

W funkcji loop() odczytujemy stany poszczególnych linii naszego urządzenia i przesyłamy go do komputera. Stany UP/DOWN i LEFT/RIGHT zapisane są w taki sposób, że nie może jednocześnie wystąpić sygnał góra i dół, co jest oczywiste z punktu widzenia budowy joysticka.

Opis wykorzystanych funkcji z biblioteki joystick:

  • Joystick.setButton - ustaw stan przycisku - pierwszy argument to numer przycisku, drugi to jego stan (1- naciśnięty, 0- zwolniony)
  • Joystick.setXAxisRange - ustawienie przedziału wartości przesyłanych w ramach osi X - domyślnie 0 - 1023. W naszym wypadku od -127 do 127.
  • Joystick.setYAxisRange - jak wyżej, ale dla osi Y.
  • Joystick.setXAxis - ustawienie pozycji X  - W przypadku naszego joysticka ustawiamy wartość -127,0,127 w zależności od pozycji.
  • Joystick.setYAxis - jak wyżej, ale dla osi Y.

 Prawidłowo zmontowane i zaprogramowane urządzenie widoczne jest zarówno w systemie Windows jak i Linux bez dodatkowych sterowników. Poniżej pokazano urządzenie podłączone do komputera z systemem Windows10.

Podsumowanie

Wykonanie układu, który umożliwia podłączenie starego joysticka do komputera nie wymaga wiele pracy. Zarówno część programowa, jak i sprzętowa są proste w wykonaniu. Możemy powyższy interfejs rozbudować o obsługę manipulatorów analogowych oraz większej ilości przycisków, ale to pozostawię na kolejny artykuł. Teraz można zająć się testowaniem wykonanego urządzenia:)