Joystick analogowy pozwala odczytywać kierunek i wielkość wychylenia drążka oraz naciśnięcie przycisku. Z Arduino Uno łączy się go przez wejścia analogowe dla osi X i Y oraz wejście cyfrowe dla przycisku SW. Aby sterowanie działało poprawnie także po puszczeniu drążka, trzeba skalibrować położenie środkowe, ustawić martwą strefę i dopasować przeliczanie odczytów do napięcia odniesienia ADC.

Czym jest joystick analogowy i jak działa?

Pod drążkiem znajdują się dwa potencjometry połączone z mechanizmem kardana. Każdy odpowiada za jedną oś: X albo Y. Ruch drążka obraca odpowiedni potencjometr, a jego suwak podaje napięcie zależne od położenia. Mikrokontroler mierzy to napięcie za pomocą przetwornika analogowo-cyfrowego, czyli ADC.

Potencjometry pracują jako dzielniki napięcia. Dzięki temu joystick przekazuje informację o stopniu wychylenia, a nie tylko o wybranym kierunku. Sprężyny powrotne ustawiają drążek w położeniu spoczynkowym po jego zwolnieniu. Mechaniczny powrót do środka nie oznacza jednak idealnie powtarzalnego odczytu elektrycznego.

Naciśnięcie drążka uruchamia osobny przycisk. Jego stan odczytuje się niezależnie od napięć osi, dlatego można przypisać mu na przykład zatwierdzanie pozycji w menu. Osie pozostają sygnałami analogowymi, natomiast przycisk jest sygnałem cyfrowym.

Opis wyprowadzeń modułu

Typowe oznaczenia wyprowadzeń to GND, +5V, VRx, VRy i SW. Przed podłączeniem sprawdź napisy na swojej płytce, zamiast kierować się wyłącznie ułożeniem przewodów na ilustracji innego modułu.

WyprowadzenieFunkcjaCo oznacza dla programu?
GNDMasa modułuWspólny punkt odniesienia z Arduino.
+5VZasilanie modułuNapięcie zasilania określa zakres napięć z potencjometrów.
VRxWyjście analogowe osi XOdczyt położenia w jednej osi.
VRyWyjście analogowe osi YOdczyt położenia w drugiej osi.
SWWyjście przyciskuPrzy konfiguracji INPUT_PULLUP stan LOW oznacza wciśnięcie.

W położeniu środkowym napięcia VRx i VRy wynoszą w przybliżeniu połowę napięcia zasilania. Przy zasilaniu 5 V jest to około 2,5 V. Nie należy jednak zakładać, że obie osie mają dokładnie taki sam punkt spoczynkowy.

Podłączenie joysticka do Arduino Uno

Do uruchomienia wystarczą moduł, Arduino Uno i przewody połączeniowe. Poniższe przypisanie wejść jest przykładem podłączenia; program musi korzystać z tych samych oznaczeń, które wybrano podczas montażu.

Wyprowadzenie joystickaPołączenie z Arduino UnoObsługa
GNDGNDWspólna masa
+5V5VZasilanie 5 V
VRxA0analogRead(A0)
VRyA1analogRead(A1)
SWD2pinMode(2, INPUT_PULLUP), następnie digitalRead(2)

Wejście przycisku skonfiguruj w setup() z wewnętrznym rezystorem podciągającym, używając INPUT_PULLUP. Przycisk zwolniony odpowiada stanowi wysokiemu, a wciśnięty — niskiemu, czyli LOW. Jeśli program interpretuje stan wysoki jako naciśnięcie, działanie przycisku będzie odwrócone.

Najpierw obserwuj odczyty w monitorze portu szeregowego. Sprawdzenie każdej osi i przycisku osobno ułatwia wykrycie pomyłki w połączeniach, zanim wartości zostaną wykorzystane do sterowania ruchem.

Jak przeliczyć odczyt ADC na napięcie?

Przetwornik ADC Arduino Uno ma rozdzielczość 10 bitów i zwraca wartości od 0 do 1023. Przy napięciu odniesienia 5 V nominalny krok przetwarzania, oznaczany jako LSB, wynosi:

1 LSB = 5 V / 1024 ≈ 4,88 mV.

W mianowniku występuje 1024, ponieważ tyle poziomów obejmuje przetwornik. Liczba 1023 jest największą wartością kodu odczytu. Nie należy utożsamiać rozdzielczości ADC z dokładnością całego układu pomiarowego.

Przykład obliczeniowy: przy założeniu napięcia odniesienia 5 V i odczytu 768 napięcie wejściowe można oszacować jako U ≈ 768 × 5 V / 1024 = 3,75 V. Odczyt około 512 odpowiada natomiast napięciu około 2,5 V, czyli oczekiwanemu środkowi przy takim zasilaniu modułu.

Te wartości pomagają zrozumieć wskazania programu. Nie są wynikiem pomiarów konkretnego joysticka ani gwarancją jego położenia spoczynkowego. Do dalszego sterowania można używać bezpośrednio jednostek ADC, bez przeliczania każdej próbki na wolty.

Kalibracja środka i dobór martwej strefy

Rzeczywisty środek rzadko wypada dokładnie przy 512. Wynika to z rozrzutu mechanicznego i tolerancji potencjometrów. Dlatego podczas uruchamiania pozostaw drążek swobodnie i zapisz odczyt spoczynkowy osobno dla każdej osi w setup(). Kalibracja wykonana przy wychylonym drążku zapisze niewłaściwy punkt odniesienia.

Warto rozróżnić zmierzony środek oraz jego przesunięcie względem środka nominalnego. Dla osi X można zapisać korektaX = srodekX - 512. Odjęcie tej korekty od bieżącego odczytu przesuwa zmierzony punkt spoczynkowy do wartości nominalnej. Taką samą operację wykonuje się niezależnie dla osi Y.

Sama kalibracja nie zastępuje martwej strefy. Jest to przedział wokół zmierzonego środka, w którym program przyjmuje brak ruchu. Przykładowa, założona szerokość to ±20 jednostek ADC; trzeba ją dobrać podczas kalibracji konkretnego modułu. Nie jest to uniwersalny parametr joysticków.

Sprawdzaj, czy różnica między bieżącym odczytem a zapisanym środkiem mieści się w tym przedziale. Jeśli tak, ustaw polecenie ruchu na zero. Zbyt wąska strefa może pozostawić samoczynny ruch w spoczynku, a zbyt szeroka sprawi, że niewielkie wychylenia będą ignorowane.

Mapowanie odczytu na kierunek i prędkość

Po kalibracji można zamienić odczyt na umowną wartość sterującą. W przykładzie przyjmujemy zakres od −100 do 100: znak oznacza kierunek, a wartość bezwzględna — wielkość polecenia. Nie są to obroty silnika ani prędkość wyrażona w jednostkach fizycznych.

  1. Odczytaj oś i sprawdź martwą strefę względem jej zapisanego środka. W tej strefie wynik sterowania ma wynosić zero.
  2. Poza martwą strefą odejmij przesunięcie środka: wartoscX = odczytX - korektaX.
  3. Ogranicz skorygowany odczyt: wartoscX = constrain(wartoscX, 0, 1023).
  4. Przelicz go funkcją map(wartoscX, 0, 1023, -100, 100).

Funkcja map() powinna otrzymać wartość należącą do zadeklarowanego zakresu wejściowego. Jeśli odejmiesz cały zmierzony środek, otrzymasz wychylenie ze znakiem, więc zakres od 0 do 1023 przestanie pasować. W opisanej procedurze odejmujemy tylko przesunięcie względem 512. Ograniczenie przez constrain() zabezpiecza granice przyjętego zakresu po tej korekcie.

Jeśli kierunek ruchu jest odwrotny do oczekiwanego, zmień znak wartości sterującej. Zamiana VRx z VRy zamienia przypisanie osi, a nie odwraca kierunku pojedynczej osi.

Zasilanie 3,3 V a napięcie odniesienia ADC

Przy zasilaniu modułu napięciem 3,3 V zmniejsza się zakres napięcia na wyjściach potencjometrów. Przetwornik nadal interpretuje napięcie wejściowe względem swojego napięcia odniesienia. Samo zmniejszenie zasilania joysticka nie oznacza więc automatycznej zmiany skali ADC.

Nie przenoś bez sprawdzenia założeń obliczeń wykonanych dla zasilania i napięcia odniesienia 5 V. Dopasuj napięcie odniesienia do układu oraz uwzględnij je podczas przeliczania odczytu na napięcie. Następnie ponownie wyznacz położenie spoczynkowe i sprawdź zakres odczytów obu osi.

Rozróżnienie zasilania modułu i napięcia odniesienia jest istotne także podczas szukania przyczyn pozornie niepełnego wychylenia. Program powinien interpretować odczyty zgodnie z rzeczywistą konfiguracją układu.

Lista kontrolna pierwszego uruchomienia

  • Połączenia: porównaj oznaczenia na module z podłączonymi przewodami oraz wejściami wskazanymi w programie. Sprawdź wspólną masę.
  • Odczyty osi: poruszaj drążkiem oddzielnie wzdłuż osi X i Y. Obserwuj, które wskazanie się zmienia i w jakim kierunku.
  • Przycisk: sprawdź działanie INPUT_PULLUP i potwierdź, że naciśnięcie daje LOW.
  • Środek: uruchom kalibrację przy zwolnionym drążku. Zapisz osobne wartości dla obu osi.
  • Martwa strefa: sprawdź, czy po puszczeniu drążka polecenie ruchu wraca do zera, a zamierzone wychylenie jest rozpoznawane.
  • Mapowanie: skontroluj znak wartości sterującej oraz ograniczenie zakresu po odjęciu korekty.
  • Zasilanie: upewnij się, że przeliczenia odpowiadają użytemu napięciu odniesienia ADC.

Zastosowania i najczęstsze problemy

Joystick sprawdza się jako element sterowania robotem, położeniem kamery, serwomechanizmami lub kursorem w menu. Można go też wykorzystać w prostych grach i panelach HMI. W każdym zastosowaniu trzeba określić, co oznaczają kierunek, wielkość wychylenia i naciśnięcie przycisku.

  • Samoczynny ruch po puszczeniu drążka: sprawdź kalibrację i martwą strefę. Nie zakładaj od razu uszkodzenia potencjometru.
  • Skoki wskazań: sprawdź połączenia i zasilanie. Uśrednianie próbek może ograniczyć wahania odczytu, ale nie zastępuje naprawy wadliwego połączenia.
  • Wielokrotna reakcja na naciśnięcie: zastosuj programowe usuwanie drgań styków i wykrywanie zmiany stanu przycisku.
  • Brak reakcji osi: skontroluj przewód VRx lub VRy, lutowanie i zgodność wejścia ADC z programem.

Wskazówki dotyczące montażu na PCB

W projekcie docelowego kontrolera uwzględnij obciążenia mechaniczne przenoszone przez drążek. Przy elementach przewlekanych THT zadbaj o prawidłowe lutowanie wyprowadzeń i mocowań mechanicznych. Po zamontowaniu joysticka ponownie sprawdź jego powrót do środka i działanie przycisku.

Jeżeli przechodzisz od połączeń przewodowych do własnej konstrukcji, zaplanuj płytkę drukowaną wraz z mocowaniem joysticka. W sprawie montażu PCB możesz skontaktować się z OurPCB.

FAQ

Dlaczego joystick w spoczynku nie wskazuje dokładnie 512?

Położenie elektrycznego środka zależy od potencjometrów i mechaniki. Zmierz je osobno dla każdej osi, zapisz podczas uruchamiania i ustaw martwą strefę wokół rzeczywistego punktu spoczynkowego.

Czy martwa strefa ±20 jednostek ADC pasuje do każdego modułu?

Nie. To przykładowa wartość do sprawdzenia podczas kalibracji. Dobierz ją tak, aby drążek nie powodował ruchu po zwolnieniu, a potrzebne w danym zastosowaniu małe wychylenia nadal były wykrywane.

Dlaczego przycisk po naciśnięciu daje LOW?

Przy konfiguracji INPUT_PULLUP rezystor podciąga wejście do stanu wysokiego. Naciśnięcie przycisku zwiera sygnał SW do masy, dlatego program powinien uznawać stan niski za wciśnięcie.

Czy przy zasilaniu 3,3 V można zachować te same przeliczenia?

Nie bez sprawdzenia napięcia odniesienia ADC. Zmiana zasilania zmienia napięcia wyjściowe joysticka; należy dopasować skalę przeliczeń oraz ponownie skalibrować położenie środkowe.

Podsumowanie

Poprawna obsługa joysticka analogowego obejmuje odczyt potencjometrów, osobną interpretację przycisku i kalibrację obu osi. Przed wykorzystaniem odczytów do sterowania sprawdź napięcie odniesienia, dobierz martwą strefę i ogranicz zakres mapowania. Dzięki temu program będzie rozróżniał zamierzone wychylenie drążka od niewielkich odchyłek wokół środka.