|

Rozdział 5: Perfekcyjne Sterowanie (Kalibracja, Mapowanie Kanałów i ESC)

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

Masz już połączenie z autem? Koła skręcają? Świetnie! Ale pewnie zauważyłeś, że auto nie zachowuje się tak idealnie jak w grach na konsoli. Może lekko "ściąga" w lewo, albo gaz reaguje zbyt nerwowo?

W tym rozdziale ustawiamy tor sterowania tak, aby sygna?y z pada, aparatury lub kierownicy by?y przewidywalne. Cz??? mechanizm?w dzia?a w tle, na przyk?ad autokalibracja PCA9685, gdy jest w??czona w konfiguracji RPi i poprawnie okablowana, ale mapowanie osi, martwe strefy i limity ESC ustawiasz r?cznie w GCS.

🔄 1. Mapowanie Sterowania (Przypisanie Przycisku ARM)

Zanim skalibrujesz pada, system musi wiedzieć, który guzik to gaz, a który to kierownica.

  • Uruchom stację GCS i wejdź w zakładkę Konfiguracja -> Mapowanie Sterowania.

  • Znajdź akcję, którą chcesz zmapować (np. „Oś: Kanał 1” - czyli kierownicę).

  • Kliknij przycisk Przypisz w danej linii. Wyświetli się okno nasłuchiwania.

  • Wychyl do oporu gałkę na padzie lub skręć kierownicę aparatury. System automatycznie wykryje przypisane urządzenie i wyświetli czytelną nazwę producenta (np. [Xbox/Microsoft Controller] Oś 0).

  • ODWRACANIE KIERUNKU (Inwersja): Jeśli skręcasz gałkę w prawo, a koła pojazdu skręcają w lewo – po prostu zaznacz checkbox w kolumnie Odwróć przy wybranej akcji.

[!IMPORTANT] WIRTUALNY KILL-SWITCH: Znajdź pozycję "Uzbrój / Rozbrój (ARM)" i przypisz do niej łatwo dostępny przycisk (np. START lub BACK na padzie). To Twój najważniejszy przycisk bezpieczeństwa! Pozwoli Ci on błyskawicznie odciąć zasilanie silnika w razie awarii, uderzenia w przeszkodę lub utraty kontroli nad pojazdem. Dodatkowo pamiętaj, że na klawiaturze stacji GCS działa globalny wyłącznik bezpieczeństwa pod klawiszem SPACJA – jego naciśnięcie natychmiastowo rozbraja pojazd!

🎯 2. Martwe Strefy i Czułość (Koniec z dryfem drążków!)

Tanie kontrolery oraz intensywnie używane pady cierpią na tzw. dryfowanie drążków (stick drift). Oznacza to, że po puszczeniu gałki, nie wraca ona idealnie do matematycznego zera. Auto może przez to samo powoli toczyć się lub lekko skręcać na prostej.

  • Przejd? do Konfiguracja -> Martwe Strefy.

  • Zwiększ wartość suwaka martwej strefy (zalecane: 0.05 do 0.10, czyli 5% - 10%). System zignoruje minimalne ruchy wokół środka drążka.

  • Jeśli chcesz, aby auto płynniej reagowało przy delikatnych ruchach, a pełną moc osiągało dopiero przy maksymalnym wychyleniu drążka – przejdź do zakładki Krzywe Expo i zwiększ parametr nieliniowości (np. ustaw wartość 1.5 - 2.0 dla kierownicy).

⚡ 3. Kalibracja Regulatora Obrotów (ESC Calibration)

Regulator obrotów (ESC) steruje silnikiem pojazdu. Musi on precyzyjnie wiedzieć, jaka wartość z nadajnika oznacza pełne hamowanie, luz (brak ruchu) oraz maksymalny gaz.

[!WARNING] BEZPIECZEŃSTWO PRZEDE WSZYSTKIM! Przed przystąpieniem do kalibracji ESC bezwzględnie postaw pojazd na podstawce tak, aby koła napędowe nie dotykały podłoża! Jeżeli silnik gwałtownie ruszy, pojazd nie odjedzie i nie wyrządzi szkód.

Wejd? w Diagnostyka -> Autotesty i Diagnostyka Sprz?tu, do panelu narz?dzi PWM i sekcji kalibracji ESC:

  • Krok 1 (Gaz Maksymalny): Wyłącz zasilanie pojazdu (wyłącz przełącznik ESC, akumulator może pozostać wpięty). Kliknij przycisk Krok 1: Gaz Maksymalny (2000µs). System GCS zacznie nadawać sygnał pełnego gazu. Włącz zasilanie ESC. Usłyszysz serię krótkich dźwięków (beeps) z silnika – regulator wykrył punkt maksymalny.

  • Krok 2 (Gaz Minimalny): Kliknij natychmiast przycisk Krok 2: Gaz Minimalny (1000µs). Silnik piknie kilkukrotnie, zatwierdzając minimalny punkt gazu (hamulec/wsteczny).

  • Krok 3 (Pozycja Neutralna): Kliknij przycisk Krok 3: Pozycja Neutralna (1500µs). ESC zagra dłuższą melodyjkę uzbrojenia. Kalibracja zakończona! Wyłącz i włącz ponownie ESC, aby zapisać ustawienia.

Część 2: Deep Dive (Dla Inżynierów i Zaawansowanych Twórców)

W tej części przyjrzymy się matematycznym i sprzętowym szczegółom implementacji warstwy wejść, przetwarzania sygnałów i sterowania na poziomie niskopoziomowym systemu operacyjnego stacji GCS oraz miksera I2C na RPi 5.

1. Matematyczny Model Normalizacji i Przetwarzania Sygnału

Każda fizyczna oś jest poddawana rygorystycznemu potokowi matematycznemu w module AxisNormalizer. Wartość surowa ($x_{\text{raw}}$) z kontrolera USB (API SDL2/Pygame) jest przekształcana na znormalizowaną wartość wyjściową ($y$) zgodnie z poniższymi algorytmami.

Rzutowanie na przedział jednostkowy:

$$x_{01} = \text{clamp}\left(\frac{x_{\text{raw}} - x_{\text{min_raw}}}{x_{\text{max_raw}} - x_{\text{min_raw}}}, 0.0, 1.0\right)$$

Jeśli parametr inwersji jest aktywny ($I = \text{True}$):

$$x_{01} = 1.0 - x_{01}$$

Przetwarzanie dwukierunkowe (Bidirectional):

$$x = (x_{01} \times 2.0) - 1.0 \quad \in [-1.0, 1.0]$$

W przypadku aktywnej dynamicznej martwej strefy (redukcja fizycznego dryfu potencjometru), bufor próbek wokół środka dynamicznie oblicza próg szumu $D$:

$$D = \max\left(D_{\text{base}}, \max(S) + 0.01\right)$$

Gdzie $S$ to zbiór 100 ostatnich próbek zebranych, gdy $|x| < 2 \times D_{\text{base}}$.

Zastosowanie martwej strefy i skalowanie do punktu nasycenia ($S_{\text{sat}}$):

$$\text{if } |x| < D: \quad y = 0.0$$$$\text{else}: \quad x_{\text{scaled}} = \text{clamp}\left(\frac{|x| - D}{S_{\text{sat}} - D}, 0.0, 1.0\right)$$

Zastosowanie nieliniowości wykładniczej (Expo) lub interpolacji z tabeli LUT:

$$y_{\text{mag}} = x_{\text{scaled}}^{L} \quad (L = \text{linearity})$$

Ostateczna wartość wyjściowa zachowująca znak kierunku:

$$y = \text{sgn}(x) \times y_{\text{mag}}$$

Filtrowanie dynamiczne w ChannelProcessor (LPF & Slew Rate):

Aby zapobiec gwałtownym skokom pochodnej sygnału, stosowany jest cyfrowy filtr dolnoprzepustowy (Low-Pass Filter) pierwszego rzędu z parametrem wygładzania $\alpha \in [0, 1)$:

$$y_t = y_{t-1} \times \alpha + y_{\text{raw}, t} \times (1.0 - \alpha)$$

Następnie aplikowany jest sprzętowy filtr narastania zbocza (Slew Rate Limiter), który ogranicza maksymalną zmianę sygnału PWM ($\Delta PWM_{\max}$) w czasie $dt$:

$$\Delta PWM_{\max} = R_{\text{slew_limit}} \times dt$$

Jeśli różnica między docelowym sygnałem $PWM_{\text{target}}$ a poprzednim stanem wyjściowym $PWM_{t-1}$ przekracza limit, wyjście jest przycinane:

$$PWM_t = PWM_{t-1} + \text{sgn}(PWM_{\text{target}} - PWM_{t-1}) \times \Delta PWM_{\max}$$

2. Logika Miksowania Osi Dzielonej (Split Axis) ze Wsparciem Skrzyni Biegów

Algorytm miksowania sygnału silnika z osi dzielonej (Split Axis) w klasie SplitAxisProcessor integruje wejścia akceleratora ($V_{\text{gas}}$), hamulca ($V_{\text{brake}}$) oraz biegu wirtualnego ($G$) w jeden sygnał PWM ($PWM_{\text{motor}}$):

Struktura Decyzyjna Miksowania

[ START ]

|

+------+------+

| Bieg (G)? |

+------+------+

|

+------------------------+------------------------+

| | |

[ G == 0 ] [ G == -1 ] [ G >= 1 ]

| | |

v v v

[ PWM = 1500 ] +------+------+ +------+------+

(Sygnał luzu) | Hamowanie? | | Hamowanie? |

+------+------+ +------+------+

| |

+----------+----------+ +----------+----------+

| | | |

[ Hamulec > 0 ] [ Gaz > 0 ] [ Hamulec > 0 ] [ Gaz > 0 ]

| | | |

v v v v

PWM > 1500 PWM < 1500 PWM < 1500 PWM > 1500

(W przód) (Wstecz) (Wstecz) (W przód)

Matematyczny opis stanów wyjściowych procesora:

  • Luz ($G = 0$): $$PWM_{\text{motor}} = PWM_{\text{neutral}}$$

  • Jazda do przodu ($G \ge 1$):

  • Przy wciśniętym hamulcu ($V_{\text{brake}} > 0.01$): $$PWM_{\text{motor}} = \text{map}(V_{\text{brake}}, 0.0, 1.0, PWM_{\text{neutral}}, PWM_{\text{min}})$$

  • Przy wciśniętym gazie ($V_{\text{gas}} > 0.01$): $$V_{\text{eff}} = V_{\text{gas}} \times K_{\text{gear_limit}}$$$$PWM_{\text{motor}} = \text{map}(V_{\text{eff}}, 0.0, 1.0, PWM_{\text{neutral}}, PWM_{\text{max}})$$

  • Bieg wsteczny ($G = -1$):

  • Przy wciśniętym hamulcu ($V_{\text{brake}} > 0.01$): $$PWM_{\text{motor}} = \text{map}(V_{\text{brake}}, 0.0, 1.0, PWM_{\text{neutral}}, PWM_{\text{max}})$$

  • Przy wciśniętym gazie ($V_{\text{gas}} > 0.01$): $$V_{\text{eff}} = V_{\text{gas}} \times K_{\text{gear_limit}}$$$$PWM_{\text{motor}} = \text{map}(V_{\text{eff}}, 0.0, 1.0, PWM_{\text{neutral}}, PWM_{\text{min}})$$

3. Autokalibracja Oscylatora PCA9685 – Analiza Pętli Sprzężenia Zwrotnego

Rzeczywista częstotliwość wewnętrznego generatora PCA9685 ($f_{\text{osc}}$) rzadko wynosi dokładnie $25\text{ MHz}$. Pętla autokalibracji sprzętowej na RPi (autocalibrate_oscillator) dynamicznie dopasowuje rejestr referencyjny zegara na podstawie fizycznego pomiaru czasu impulsu na pinie GPIO przy użyciu precyzyjnych przerwań systemowych czasu rzeczywistego.

Blokowy schemat pętli sprzężenia zwrotnego wygląda następująco:

+------------------+ Impuls 1500 us +------------------+

| Kontroler RPi |----------------------->| Sterownik I2C |

| (GPIO 17 / | | PCA9685 |

| Pin 11) |<-----------------------| (Kanał 15) |

+------------------+ Fizyczna Zworka +------------------+

| |

| Mierzy czas (Wait For Edge) | Generuje fizyczny impuls

v | na podstawie f_osc

+------------------+ v

| Wyliczenie błędu | +------------------+

| e = 1500 - t |<-----------------------| Fizyczny Impuls |

+------------------+ +------------------+

|

| Korekcja: f_new = f_old * (1500 / t)

v

+------------------+

| Ustawienie I2C |

| reference_clock |

+------------------+

Wzór na korektę częstotliwości w kolejnej iteracji pętli ($i+1$):

$$f_{\text{target}, i+1} = f_{\text{osc}, i} \times \frac{T_{\text{target}}}{T_{\text{measured}, i}}$$

Zastosowanie współczynnika tłumienia w celu zapobieżenia oscylacjom numerycznym i przesterowaniu pętli regulacji:

$$f_{\text{osc}, i+1} = f_{\text{osc}, i} \times 0.4 + f_{\text{target}, i+1} \times 0.6$$

Dozwolony zakres dynamicznego strojenia częstotliwości jest sprzętowo ograniczony:

$$f_{\text{osc}, i+1} \in [15.0\text{ MHz}, 35.0\text{ MHz}]$$

Pętla wykonuje do 10 iteracji lub kończy bieg sukcesem w momencie, gdy błąd bezwzględny $|T_{\text{target}} - T_{\text{measured}}| \le 6\ \mu\text{s}$.

4. Sprzętowa Architektura Zabezpieczenia Failsafe (OE Pin)

W przypadku utraty ramek steruj?cych warstwa PCA9685 ma watchdog PWM z domy?lnym progiem $500\text{ ms}$. Je?eli pin OE jest skonfigurowany, sterownik wykorzystuje fizyczny Output Enable uk?adu PCA9685; w aktualnej konfiguracji RPi hardware.pca9685.oe_pin wskazuje GPIO 27. GPIO 17 jest u?ywane jako wej?cie pomiarowe autokalibracji oscylatora.

Fizyczna architektura połączenia OE w pojeździe RC prezentuje się następująco:

+--------------------------------------+

| Raspberry Pi |

| |

| SDA/SCL (Magistrala I2C) |

| GPIO (Pin OE - Failsafe Active High)|

+--------------------------------------+

| |

Szyna I2C | | Fizyczna linia OE

(Komendy) | | (Active-Low)

v v

+--------------------------------------+

| PCA9685 Driver |

| |

| Rejestry wejściowe PWM (16 kanałów) |

+--------------------------------------+

|

| 16x Wyjść PWM (Serwo, ESC)

v

+------------------+ +------------------+

| Serwomechanizm | | Regulator ESC |

| (Kierownica CH1) | | (Silnik CH0) |

+------------------+ +------------------+

  • Stan normalny (Armed): RPi wymusza stan LOW na linii GPIO (OE). Tranzystor wyjściowy PCA9685 przewodzi, a impulsy PWM są generowane zgodnie z rejestrami wypełnienia.

  • Stan awaryjny (Failsafe): RPi wystawia stan HIGH na linii OE. Wyj?cia PWM uk?adu PCA9685 przechodz? w stan wysokiej impedancji (High-Z), a wcze?niej logika ustawia kana?y sterowania w neutralne zakresy. Reakcja ESC zale?y od jego w?asnej konfiguracji failsafe, dlatego ka?dy kana? gazu trzeba zweryfikowa? na stojaku, bez kontaktu k?? z pod?o?em.