Skip to the content
PCBKitNew board
2 layers51 × 62.1 mmTm dial pcb, the printed circuit board in 3D

Dial style steering device design for Trackmania 2020

Size
51 × 62.1 mm
Copper layers
2
Thickness
1.6 mm
Parts
51
Nets
61
Pads
189
Tracks, vias
332, 41
Pours
6
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
2 Jun 2026
Updated
2 Jun 2026

Overview

Tm dial pcb is an open-source printed circuit board by Cbeniaris, from the Cbeniaris/TM_Dial repository on GitHub. It is a 2-layer board of 51 × 62.1 mm with 51 parts on 61 nets, routed with 332 tracks and 41 vias.

It is built around the RP2040, W25Q128JVSIQ and AP2112K-3.3. Its parts include 18 capacitors, 9 resistors, 5 connectors, 4 ICs and 1 diode. It belongs with the RP2040 boards of this library.

Main components

3

README

README.md

TM_Dial

⚠️ This project is archived and will not be developed further. The hardware is functional as a steering dial only. The 4-button matrix was designed but never implemented. The firmware reflects the current working state: dial axis only, with automatic calibration on startup. PCB files were designed but never manufactured and included an rp2040 and AS5600 for all features.

A 3D printed, mechanically self-centering USB HID steering dial built for Trackmania 2020. Driven by QMK firmware on an RP2040 Pro Micro, it presents as a standard joystick — no drivers needed.


Dial Built

Hardware

ComponentDetails
MCURP2040 Pro Micro (USB-C)
Angle sensorAS5600 carrier board (I2C, 12-bit, 0–359.9°)
Magnet4mm × 2mm N52 diametrically magnetized disc
Bearings1x 50mm ID / 65mm OD deep groove ball bearing
Center return2× extension springs
Hard stops3D printed mechanical stops
Steering travel60° total — 30° left and 30° right of center

Wiring

AS5600 → RP2040 Pro Micro

AS5600 PinRP2040 PinNotes
VCC3.3VRP2040 is not 5V tolerant — do not use 5V
GNDGND
SDAGP29I2C0 data, 400kHz fast mode
SCLGP28I2C0 clock

The AS5600 has internal I2C pull-ups — no external resistors needed in most cases. Most carrier boards include an onboard regulator and are safe at 3.3V.


Steering Axis

The dial exposes a single USB HID joystick axis (Axis 0).

ParameterValue
Total travel60° (30° each side of center)
AS5600 counts per side341 (341/4096 × 360 ≈ 30°)
HID output range-127 (full left) to +127 (full right)
Sensor poll rate250Hz (every 4ms)
USB HID report rate125Hz

Extension springs provide passive center return. The 3D printed hard stops enforce the 30° limit physically; the firmware also clamps in software as a secondary safety. Wrap-around at the 0/4095 AS5600 boundary is handled, so the magnet can be mounted at any rotational position.


Calibration

The dial calibrates automatically on every startup — the AS5600 reading at power-on is treated as center. Let the dial rest at its physical center position (held by the springs) before plugging in USB.

The firmware also supports EEPROM-based calibration via BTN4 as designed, but since the buttons were never wired, startup calibration is the effective method in the current build.


Building & Flashing

Copy the keyboard folder into your QMK install:

bash
cp -r keyboards/tm_dial/ /path/to/qmk_firmware/keyboards/

Build:

bash
qmk compile -kb tm_dial -km default

Flash:

bash
qmk flash -kb tm_dial -km default

RP2040 boot mode: Hold BOOT on the Pro Micro while plugging in USB. The board mounts as a USB mass storage device. QMK flash will copy the .uf2 automatically, or drag-and-drop it manually.


File Structure

text
TMDial/
├── README.md
├── tm_dial.FCStd              — FreeCAD source file for all printed parts
│
├── print_files/
│   └── tm_dial-v1-1.bgcode    — PrusaSlicer sliced output ready to print
│
├── firmware/
│   ├──tm_dial_default.uf2     - Compiled firmware ready for flashing
│   └── tm_dial/               — QMK keyboard folder (copy into qmk_firmware/keyboards/)
│       ├── keyboard.json      — USB identity (VID 0x4144 / PID 0x544D), matrix pins, layout
│       ├── rules.mk           — MCU, bootloader, feature flags
│       ├── config.h           — I2C pins, steering range, poll rate, EEPROM offset
│       ├── halconf.h          — Enables HAL I2C driver for ChibiOS/RP2040
│       ├── mcuconf.h          — Enables I2C0, disables I2C1 on RP2040
│       ├── as5600.h           — Sensor driver public API
│       ├── as5600.c           — Sensor I2C read implementation
│       └── keymaps/default/
│           └── keymap.c       — Axis mapping, wrap-around, calibration
│
└── pcb/                       — KiCad PCB project (designed, never fabricated)
    ├── tm_dial_pcb.kicad_pro  — Project file
    ├── tm_dial_pcb.kicad_sch  — Schematic
    ├── tm_dial_pcb.kicad_pcb  — Board layout

Tuning Reference

ConstantFileDefaultEffect
STEERING_RANGE_COUNTSconfig.h341Travel range in AS5600 counts (341 ≈ 30° each side)
AS5600_POLL_MSconfig.h4Sensor read interval in ms — lower = faster response
JOYSTICK_AXIS_RESOLUTIONconfig.h8HID axis bit depth (8-bit = -127 to +127)
STEERING_CENTER_DEFAULTconfig.h2048Fallback center if EEPROM is blank
EEPROM_STEERING_CENTERconfig.h32EEPROM byte offset for stored center value
I2C1_CLOCK_SPEEDconfig.h400000I2C bus speed in Hz (400kHz fast mode)

Parts

51
QtyValueFootprintReferences
120.1uFCapacitor_SMD:C_0402_1005MetricC1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C13, C14
41uFCapacitor_SMD:C_0402_1005MetricC15, C16, C17, C18
3MountingHole_3.2mm_M3MountingHole:MountingHole_3.2mm_M3H1, H2, H3
21k ΩResistor_SMD:R_0402_1005MetricR7, R15
227 ΩResistor_SMD:R_0402_1005MetricR11, R12
227pFCapacitor_SMD:C_0402_1005MetricC11, C12
24.7k ΩResistor_SMD:R_0402_1005MetricR9, R10
25.1k ΩResistor_SMD:R_0402_1005MetricR1, R2
2Conn_01x04Connector_PinHeader_2.00mm:PinHeader_1x04_P2.00mm_HorizontalJ2, J3
112MhzCrystal:Crystal_SMD_Abracon_ABM3-2Pin_5.0x3.2mmY1
1680 ΩResistor_SMD:R_0603_1608MetricR13
1AP2112K-3.3Package_TO_SOT_SMD:SOT-23-5U3
1AS5600-ASOM_SOIC8_LF_T&RDPAS5600:SOIC8_AS5600_OSR-LU2
1BOOTSELButton_Switch_SMD:SW_Push_SPST_NO_Alps_SKRKSW1
1DebugConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_HorizontalJ4
1GPIO_18TestPoint:TestPoint_Pad_D1.5mmTP8
1GPIO_19TestPoint:TestPoint_Pad_D1.5mmTP7
1GPIO_20TestPoint:TestPoint_Pad_D1.5mmTP6
1GPIO_21TestPoint:TestPoint_Pad_D1.5mmTP5
1LEDLED_SMD:LED_0603_1608MetricD1
1RP2040Package_DFN_QFN:QFN-56-1EP_7x7mm_P0.4mm_EP3.2x3.2mmU1
1ResetConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_HorizontalJ5
1TP_+3.3VTestPoint:TestPoint_Pad_D1.5mmTP3
1TP_GNDTestPoint:TestPoint_Pad_D1.5mmTP4
1TP_SCLTestPoint:TestPoint_Pad_D1.5mmTP1
1TP_SDATestPoint:TestPoint_Pad_D1.5mmTP2
1TP_USB_PWRTestPoint:TestPoint_Pad_D1.5mmTP9
1USB_C_Plug_USB2.0Connector_USB:USB_C_Receptacle_GCT_USB4110J1
1W25Q128JVSPackage_SO:JEITA_SOIC-8_3.9x4.9mm_P1.27mmU4

Questions

How big is the Tm dial pcb PCB?

It measures 51 × 62.1 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Tm dial pcb use?

51 parts, built around the RP2040, W25Q128JVSIQ and AP2112K-3.3. 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 Tm dial pcb KiCad files?

From the Cbeniaris/TM_Dial repository on GitHub, at the commit this page was made from: the board is pcb/tm_dial_pcb.kicad_pcb and its schematic pcb/tm_dial_pcb.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Tm dial pcb design in my own project?

Its repository states no licence, so its author keeps all rights: ask Cbeniaris before reusing the design.

Similar boards

  • 2 layers312.5 × 122.3 mmSHEGO75-V5, the printed circuit board in 3D

    SHEGO75-V5

    Charading/Shego75HE

    My endgame 75% hall effect keyboard

    392 parts75
  • 2 layers120 × 25 mmGrooveboard rp, the printed circuit board in 3D

    Grooveboard rp

    ianklug/grooveboard

    A four-key mechanical keyboard for rhythm games.

    47 parts58CC-BY-SA-4.0
  • 2 layers220 × 70 mmBemini rp, the printed circuit board in 3D

    Bemini rp

    ianklug/bemini

    A miniature mechanical keyboard controller with a rotary encoder for staggered-key rhythm games.

    70 parts55CC-BY-SA-4.0
  • 2 layers84.2 × 100 mmFabpack out v5 8, the printed circuit board in 3D

    Fabpack out v5 8

    yuz207/agentpad13

    agentpad13 — open-source 13-key macropad for agentic work (RP2040, vial-qmk, planar joystick, Raw HID agent-status protocol)

    126 parts41
  • 2 layers100 × 90 mmEncoderPad RP2040, the printed circuit board in 3D

    EncoderPad RP2040

    jpconstantineau/EncoderPad_RP2040

    The EncoderPad RP2040 is a Video Editing Macropad with a 60mm Encoder Wheel. This encoder is made of metal and feels like it will last forever. The EncoderPad uses 9 mechanical switches (Cherry MX type).

    62 parts29
  • 2 layers75 × 55 mmWellfed bench, the printed circuit board in 3D

    Wellfed bench

    Isaac-Duarte/wellfed

    Open firmware that runs the PETLIBRO Granary PLAF103 pet feeder on your own Wi-Fi: no cloud, no account. Early and in testing.

    93 parts8MIT
  • 2 layers19.9 × 29 mmRpipico, the printed circuit board in 3D

    Rpipico

    ambraglow/proto2040

    41 parts6