DOCS/Poradnik MCS
|

Rozdział 3: Konfiguracja Wejść i Urządzeń USB

Część 1: Przyjazna Encyklopedia (Dla Każdego)

Kierownice USB i kontrolery są obsługiwane bezpośrednio przez komputer pokładowy RPi 5. Aby sterowanie było precyzyjne, należy wykonać wstępne mapowanie.

🛠️ 1. Procedura Kalibracji Kierownic USB

Podłącz kierownicę (np. Thrustmaster T128X, Logitech G29, Fanatec) do portu USB w Raspberry Pi 5.

  1. Tryb pedałów (Separate Mode): Pedały muszą bezwzględnie pracować w trybie niezależnych osi (Separate). W kierownicach Thrustmaster (np. T128X) należy ustawić to w oficjalnym Panelu Sterowania na komputerze z Windows przed podłączeniem do Raspberry Pi. W domyślnym dla niektórych konsol trybie Combined, sygnał pedałów koliduje na Linuxie z główną osią skrętu kierownicy (ABS_X).
  2. Kreator mapowania: W WebUI na telefonie kliknij "Uruchom Kreator Detekcji". Postępuj zgodnie z instrukcjami na ekranie (skręć kierownicę, wciśnij gaz, wciśnij hamulec). Nawet twarde pedały typu Load-Cell (o skoku rzędu kilku milimetrów) zostaną bezbłędnie wykryte.
  3. Przypisanie przycisku ARM: Wybierz przycisk na kierownicy (np. logo PlayStation/Xbox) jako fizyczny wyłącznik awaryjny (Kill-Switch / ARM-DISARM).

⚠️ Złota zasada stabilności

Po przypisaniu osi konfiguracja zostaje powiązana z unikalną nazwą sprzętową kontrolera (device_name). Możesz go odpinać, zmieniać porty USB – system zawsze poprawnie rozpozna kierownicę po włączeniu zasilania, eliminując problem losowych ścieżek /dev/input/event*.


Część 2: Inżynieryjny Deep Dive (Dla Specjalistów)

Odczyt joysticków i kierownic pod systemem Linux realizowany jest niskopoziomowo przez system plików /dev/input/event* za pomocą interfejsu evdev.

1. Niskopoziomowy odczyt (evdev API)

Kod w evdev_reader.py odpytuje deskryptor pliku urządzenia w pętli asynchronicznej. Aby uniknąć problemów z dynamicznymi ścieżkami systemowymi (gdzie kierownica raz zgłasza się jako event2, a po restarcie jako event4), system paruje konfigurację po stabilnym identyfikatorze device_name. Zapytanie o nazwę urządzenia realizowane jest za pomocą ioctl:

import evdev
device = evdev.InputDevice('/dev/input/event2')
device_name = device.name # Zwraca np. "Thrustmaster T128X Wheel"

2. Algorytm Detekcji i Progi Czułości w /api/wizard/detect

Wiele kierownic i profesjonalnych pedałów hamulcowych (np. Load-Cell) charakteryzuje się ogromną rozdzielczością (16-bitową), ale bardzo małym fizycznym zakresem skoku (np. hamulec generujący zaledwie zakres 0-732 przy pełnym 16-bitowym przetworniku 65535, co stanowi tylko 1.1% rozpiętości). Aby kreator detekcji nie ignorował ruchu takich osi, algorytm w input_manager.py oblicza względne i bezwzględne delty sygnału:

  • Próg relatywny: Zmiana wartości osi o więcej niż 0.5% pełnego zakresu: $$\frac{|x_t - x_{t-1}|}{x_{\text{max}} - x_{\text{min}}} > 0.005$$
  • Próg absolutny: Zmiana wartości o deltę większą niż 20 jednostek: $$|x_t - x_{t-1}| > 20$$ Zabezpiecza to przed ignorowaniem sztywnych pedałów hamulca, jednocześnie odrzucając minimalne szumy elektryczne (noise) i dryfowanie drążków (stick drift).

3. Pętla Nadawcza CRSF Direct (100 Hz Streaming & RF Sleep Guard)

Gdy MCS współpracuje z modułem USB ExpressLRS (RadioMaster Nomad):

  • Wątek nadawczy _write_loop nieprzerwanie generuje i wysyła ramki TYPE_RC_CHANNELS_PACKED z częstotliwością 100 Hz.
  • W stanie rozbrojenia (DISARM) transmisja nie jest wstrzymywana – moduł otrzymuje ramki z wartościami neutralnymi (1500 µs), co zapobiega wyzwoleniu fałszywego Failsafe na odbiorniku w pojeździe.
  • Dodatkowo MCS cyklicznie co 100 ms wysyła ramkę 0x0B (Link Statistics Heartbeat). Brak tego pakietu powodowałby przejście modułu ExpressLRS w energooszczędny tryb uśpienia (pomarańczowa dioda RF Idle) i utratę synchronizacji łącza radiowego.