

ForZero
Sterownik fizycznego zestawu wskaźników Audi A4 B6, pozwalający wyświetlać telemetrię z Forza Horizon 6 przy użyciu STM32, CAN, USB i autorskiej aplikacji Qt.
- Size
- 74.2 × 80 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 109
- Nets
- 111
- Pads
- 366
- Tracks, vias
- 743, 168
- Pours
- 2
- Routed
- Yes
- KiCad
- KiCad 9.0 (file 20241229)
- Created
- 23 Jun 2026
- Updated
- 11 Sep 2026
Overview
ForZero is an open-source printed circuit board by MikolajDIY, from the MikolajDIY/ForZero repository on GitHub. It is a 2-layer board of 74.2 × 80 mm with 109 parts on 111 nets, routed with 743 tracks and 168 vias.
It is built around the STM32F105RBT6, AO3400A and SS23, with the USBLC6-2SC6Y among its other parts. Its parts include 52 resistors, 26 capacitors, 11 transistors, 5 ICs and 5 connectors. It belongs with the STM32 boards of this library.
Main components
4STM32F105RBT6
LQFP-64(10x10)-40℃~+85℃ 128KB 12bit 12bit 2V~3.6V 32 Bit 51 64KB 72MHz ARM Cortex-M3 Built-in FLASH LQFP-64(10x10) Microcontrollers (MCU/MPU/SOC) ROHSSTMicroelectronicsMicrocontrollers (MCU/MPU/SOC)AO3400A
SOT-23-55℃~+150℃ 1 N-channel 1.45V 1.4W 30V 48mΩ@2.5V 5.7A 50pF 630pF 75pF 7nC@10V N-Channel SOT-23 MOSFETs ROHSAlpha & Omega SemiconductorMOSFETsSS23
SMB(DO-214AA)-65℃~+125℃ 1 Independent 2A 30V 400uA@30V 500mV@2A 50A SMB(DO-214AA) Schottky Diodes ROHSonsemiSchottky DiodesUSBLC6-2SC6Y
SOT-23-6-55℃~+125℃ 0.6pF、1pF 12V 150W@8/20us 5V 6.5V 80nA 9A@8/20us IEC 61000-4-2、IEC 61000-4-5、IEC 61000-4-4 SOT-23-6 ESD and Surge Protection (TVS/ESD) ROHSTECH PUBLICESD And Surge Protection (TVS/ESD)
README
README.mdForZero
Sterownik fizycznego zestawu wskaźników Audi A4 B6, pozwalający wyświetlać telemetrię z Forza Horizon 6 przy użyciu STM32, CAN, USB i autorskiej aplikacji Qt.
ForZero powstał jako próba wykorzystania fizycznego zestawu wskaźników jako elementu stanowiska simracingowego. Projekt obejmuje rozpoznanie sposobów sterowania licznikiem, zaprojektowanie i uruchomienie własnej PCB, firmware mikrokontrolera oraz aplikację komputerową.
Film prezentujący projekt
Możliwości
- Wyświetlanie prędkości i obrotów silnika na fizycznym liczniku.
- Sterowanie wskazaniami poziomu paliwa i temperatury płynu chłodzącego.
- Obsługa wybranych kontrolek i komunikatów ostrzegawczych.
- Przybliżona symulacja stanów ABS, TCS i AIRBAG oraz temperatury płynu chłodzącego na podstawie dostępnej telemetrii.
- Odbiór danych UDP z gry i przesyłanie przetworzonych wartości do sterownika przez USB VCP.
- Pomiar opóźnień komunikacji na podstawie potwierdzeń wykonania ramek.
- Zerowanie prędkości i obrotów po 500 ms bez poprawnej ramki danych.
Gra nie udostępnia bezpośrednio wszystkich odwzorowywanych stanów. Algorytmy symulacji kontrolek i temperatury służą do przybliżonego odtworzenia ich zachowania; nie są modelami fizycznymi układów pojazdu.
Jak to działa
Gra wysyła telemetrię przez UDP. Aplikacja Qt odbiera i parsuje pakiety, wykonuje dodatkową logikę oraz przesyła dane przez USB VCP do STM32F105. Mikrokontroler generuje sygnały elektryczne wymagane przez zestaw wskaźników.
Badany licznik wykorzystuje kilka różnych sposobów sterowania:
| Funkcja | Sposób sterowania |
|---|---|
| Obrotomierz | Ramki CAN |
| Prędkościomierz | Sygnał impulsowy o regulowanej częstotliwości |
| Poziom paliwa i temperatura | Emulacja rezystancji czujników |
| Wybrane kontrolki i ostrzeżenia | Sygnały logiczne 12 V |
Wskazania paliwa i temperatury skalibrowano eksperymentalnie. Zmierzone charakterystyki opracowano z wykorzystaniem interpolacji PCHIP w MATLAB-ie.
Sprzęt

- Autorska dwuwarstwowa PCB zaprojektowana w KiCad.
- Mikrokontroler STM32F105 z jednoczesną obsługą USB i CAN.
- Transceiver CAN MCP2562 z osobnym zasilaniem interfejsu logicznego.
- Układy emulacji rezystancji oparte na potencjometrze cyfrowym MCP4661, wzmacniaczach operacyjnych i tranzystorach MOSFET.
- Tranzystorowe stopnie sterujące wejściami 12 V licznika.
- Złącze USB-C, zewnętrzne zasilanie 12 V i złącza Molex Micro-Fit 3.0.
- Zabezpieczenie ESD linii USB oraz bezpieczniki polimerowe na liniach zasilania.
Oprogramowanie
Aplikacja PC — C++ / Qt

Aplikacja ma trzy wątki: GUI, odbiór UDP oraz komunikację USB. Oddzielenie komunikacji od interfejsu użytkownika pozwala odbierać telemetrię i obsługiwać sterownik bez wykonywania tych operacji w wątku GUI.
Aplikacja odpowiada za parsowanie telemetrii, symulację wybranych wskazań, przygotowanie ramek dla sterownika i wyznaczanie statystyk opóźnień.
Firmware — C / STM32 HAL
Firmware powstał w STM32CubeIDE z wykorzystaniem bibliotek HAL. Zadania w pętli głównej są wyzwalane zdarzeniowo lub w ustalonych interwałach:
| Sygnał | Aktualizacja |
|---|---|
| Prędkość i kontrolki | Po otrzymaniu nowych danych, gdy wartość się zmieni |
| Obroty silnika | Ramka CAN co 20 ms |
| Temperatura | Co 2 s |
| Poziom paliwa | Co 5 s, jeżeli odebrano nowe dane |
Własny protokół przesyłany przez USB VCP wykorzystuje znaczniki ramki, CRC8, numer sekwencyjny i potwierdzenie wykonania Exec Ack. Parser posiada timeout odbioru, a brak poprawnych danych przez 500 ms powoduje wyzerowanie prędkości i obrotów.
Opóźnienia
Aplikacja mierzy czas przejścia danych w pętli PC–sterownik–PC (RTT), wykorzystując numery ramek i odpowiadające im potwierdzenia. Statystyki obejmują ostatnie 20 000 pomiarów.
W zestawach pomiarowych opisanych w dokumentacji średnie RTT zazwyczaj wynosiło poniżej 1 ms, a P99 poniżej 4 ms. W najbardziej skrajnym zarejestrowanym zestawie P99 osiągnął 17 ms. Są to wyniki przeprowadzonych testów, a nie gwarantowane limity czasowe.
RTT nie jest pomiarem czasu od zdarzenia w grze do mechanicznego wychylenia wskazówki. Poszczególne wyjścia mają własne okresy odświeżania, a licznik dodatkowo filtruje wskazania. Projekt pracuje jako system soft real-time.
Zawartość repozytorium
| Folder | Zawartość |
|---|---|
| Aplikacja Qt | Kod źródłowy aplikacji komputerowej |
| Oprogramowanie sterownika | Projekt firmware mikrokontrolera STM32 |
| Schematy | Materiały dotyczące części sprzętowej |
| Obrazy | Zdjęcia i grafiki wykorzystywane w README |
| Dokumentacja | Szczegółowa dokumentacja projektu |
Uruchomienie
Wymagania
- Zestaw wskaźników zgodny z egzemplarzem wykorzystanym w projekcie.
- Zmontowany sterownik ForZero, przewody połączeniowe i zasilanie 12 V.
- Przewód USB obsługujący transmisję danych.
- Komputer z aplikacją ForZero oraz Forza Horizon 6.
- Do samodzielnego zbudowania oprogramowania: środowisko Qt z kompilatorem C++ oraz STM32CubeIDE.
Kolejność czynności
- Przy odłączonym zasilaniu połącz sterownik z licznikiem zgodnie ze schematem połączeń w dokumentacji. Uwzględnij numerację pinów obu złączy licznika.
- Zbuduj firmware z folderu Oprogramowanie sterownika i wgraj go do STM32. Programowanie jest możliwe przez USB z wykorzystaniem wbudowanego bootloadera.
- Aby wejść w tryb bootloadera: naciśnij RESET, przytrzymując go naciśnij BOOT, zwolnij RESET, a następnie BOOT.
- Po zaprogramowaniu uruchom sterownik w zwykłym trybie pracy i podłącz zasilanie zestawu.
- Zbuduj i uruchom aplikację z folderu Aplikacja Qt, a następnie wybierz port COM sterownika.
- Włącz wysyłanie telemetrii UDP w grze. Ustaw adres IP komputera odbierającego dane oraz port zgodny z konfiguracją aplikacji.
- Uruchom jazdę i sprawdź odbiór danych oraz działanie wskazań.
Zgodność i ograniczenia
- Projekt sprawdzono z licznikiem Audi A4 B6 RB4 o oznaczeniu 8E0920900H, z monochromatycznym wyświetlaczem FIS. Zgodność z innymi wersjami licznika nie została potwierdzona.
- W badanym egzemplarzu po rozpoczęciu jazdy wskazanie paliwa zmieniało się wyłącznie w dół, z tempem około jednej czwartej skali w ciągu 7–10 minut. Ograniczenie to utrudnia szybkie odwzorowanie zmian poziomu paliwa w grze.
- Kontrolki i komunikaty mają zachowanie wynikające z wewnętrznej logiki licznika. Symulacja ABS nie oznacza pełnej emulacji sterownika ABS ani niezależnego sterowania samą lampką ABS.
- Poziom 12 V dla wybranych wejść kontrolek przyjęto na podstawie testów używanego egzemplarza; nie potwierdzono go dokumentacją producenta.
Dokumentacja
Dokumentacja projektu opisuje pinout licznika, schemat połączeń ze sterownikiem, układy elektroniczne, kalibrację wskazań, protokół USB oraz przeprowadzone testy.
Autor
M.Ratajczak — MikolajDIY
Parts
109| Qty | Value | Footprint | References |
|---|---|---|---|
| 24 | 9.1k | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R10, R11, R17, R20, R22, R24, R26, R28, R30, R32, R34, R35, R41, R43, R44, R45 +8 |
| 18 | 100n | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C3, C4, C11, C12, C13, C14, C15, C16, C17, C20, C21, C22, C23, C24, C25, C26 +2 |
| 11 | 100R | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R1, R4, R18, R19, R21, R23, R25, R27, R29, R31, R42 |
| 11 | AO3400A | Package_TO_SOT_SMD:SOT-23 | Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11 |
| 4 | 5.1k | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R7, R8, R14, R15 |
| 3 | 10u | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C5, C6, C7 |
| 3 | 270R | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R36, R37, R38 |
| 3 | LED | LED_SMD:LED_0603_1608Metric_Pad1.05x0.95mm_HandSolder | ERROR, OK, POWER |
| 2 | 10n | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C1, C2 |
| 2 | 10p | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C18, C19 |
| 2 | 1k | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R2, R5 |
| 2 | 22R | Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolder | R3, R6 |
| 2 | 22R | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R12, R13 |
| 2 | SW_Push | Button_Switch_SMD:SW_SPST_PTS645Sx43SMTR92 | BOOT, RESET |
| 1 | 0R | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R33 |
| 1 | 1.25A | Fuse:Fuse_1812_4532Metric_Pad1.30x3.40mm_HandSolder | F2 |
| 1 | 120R | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R16 |
| 1 | 1n | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C10 |
| 1 | 25MHz | Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm | Y1 |
| 1 | 33k | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R39 |
| 1 | 43045-0400 | SamacSys_Parts:43045-04_00,01,02,10_ | J4 |
| 1 | 43045-0621 | SamacSys_Parts:43045-06YY_212223 | J3 |
| 1 | 43045-0800 | SamacSys_Parts:43045-08_00,01,02,10_ | J2 |
| 1 | 500mA | Fuse:Fuse_1206_3216Metric_Pad1.42x1.75mm_HandSolder | F1 |
| 1 | 82k | Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | R40 |
| 1 | AP7347DQ-33W5-7 | SamacSys_Parts:SOT95P280X145-5N | IC4 |
| 1 | Barrel_Jack_Switch | Connector_BarrelJack:BarrelJack_GCT_DCJ200-10-A_Horizontal | J5 |
| 1 | MCP2562-E_SN | SamacSys_Parts:SOIC127P600X175-8N | IC5 |
| 1 | MCP4661-103E_ST | SamacSys_Parts:SOP65P640X120-14N | IC2 |
| 1 | NCV21872DMR2G | SamacSys_Parts:SOP65P490X110-8N | IC1 |
| 1 | SS23 | Diode_SMD:D_SMA | D2 |
| 1 | STM32F105RBT6 | SamacSys_Parts:QFP50P1200X1200X160-64N | IC3 |
| 1 | USBLC6-2SC6Y | SamacSys_Parts:SOT95P280X145-6N | D1 |
| 1 | USB_C_Receptacle_USB2.0_16P | Connector_USB:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal | J1 |
Questions
How big is the ForZero PCB?
It measures 74.2 × 80 mm and has 2 copper layers, 1.6 mm thick.
What parts does the ForZero use?
109 parts, built around the STM32F105RBT6, AO3400A, SS23 and USBLC6-2SC6Y. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
Where can I download the ForZero KiCad files?
From the MikolajDIY/ForZero repository on GitHub, at the commit this page was made from: the board is Schematy/forZero_schematy_1v0/forZero.kicad_pcb and its schematic Schematy/forZero_schematy_1v0/Speed_and_tell-tales.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the ForZero design in my own project?
Its repository states no licence, so its author keeps all rights: ask MikolajDIY before reusing the design.
Similar boards
- 4 layers77.7 × 41 mm

- 2 layers104 × 76 mm

- 4 layers145.2 × 141.2 mm

CLANKERS ROVER V1
yergefoltz/-Rover-PCB-for-XRC-Xplore-rover-challenge-
My first PCB made for rover challenge at my university was designed to connect all electronics for out rover.
57 parts - 2 layers90 × 90 mm

Ykts power
cansat-ptl/cubesat-boards
YKTSAT Kicad board files - mirror of https://git.yktaero.space/yktaero-dev/cubesat-boards
132 parts - 2 layers95 × 116 mm

OpenFlops
silvervest/OpenFlops-W1D
Modified OpenFlops specifically to replace Citizen W1D drives
63 parts26 - 2 layers111.6 × 59.4 mm

HenryFlops
hmerrett/HenryFlops
OpenFlops is an Open Hardware implementation of such an emulator, inspired from the ubiquitous Gotek hardware. It is designed to run the FlashFloppy firmware, which gives it several improvements over the original Gotek…
89 parts16 - 4 layers51 × 42 mm

Nano Tek
stefanskotte/Nano-Tek
A tiny, modern reimagining of the classic Gotek floppy-disk-drive emulator. Nano-Tek keeps the full feature set of a Gotek-style FDD emulator but packs it onto a board that is a fraction of the size, hence the name…
58 parts7 - 4 layers60 × 60 mm

LMS8001 Companion
myriadrf/reference-development-kit
The Myriad-RF Reference Hardware design files and firmware
628 parts49
