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.
- 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). - 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.
- 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_loopnieprzerwanie generuje i wysyła ramkiTYPE_RC_CHANNELS_PACKEDz 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.