Open-source design and code for a 3D-printed pistol-grip RC transmitter.
A general-purpose RC transmitter designed to control multiple vehicles by swapping configuration profiles. Currently used with an RC snowblower and an engineering test rover.
- Wireless control via nRF24L01+ with bidirectional telemetry (acknowledge payloads)
- Touchscreen UI on a 240x320 TFT with resistive touch input
- Live telemetry display: battery voltage, board temperatures, motor currents
- Motor stop (M-Stop) soft button on the touchscreen
- Joystick input for throttle and steering
- Joystick calibration via touchscreen UI
- Physical button matrix (multiplexed)
- SD card configuration profiles for multi-vehicle support
- Settings/setup menu
- MCU with dual SPI buses (currently Teensy 4.1)
- Adafruit 2.8" TFT Touch Breakout — ILI9341 display with resistive touchscreen (SPI1)
- nRF24L01+ radio module (SPI0)
- Analog joystick (steering + throttle)
Receiver (Rover Test Platform)
- Arduino Mega
- nRF24L01+ radio module
- Basicmicro RoboClaw motor controller
RC Transmitter/
├── main/ # Transmitter firmware (Arduino IDE)
│ ├── main.ino # Setup, loop, radio, global state
│ ├── config.h # Pin assignments, constants, shared types
│ ├── touchInput.ino # Touch state machine
│ ├── screenManager.ino # Screen transitions and button management
│ └── drawScreens.ino # Screen drawing and UI updates
├── test_sketches/ # Standalone test/reference sketches
├── stl/ # 3D printed enclosure files
├── docs/ # Documentation and images
├── LICENSE # GPLv3
└── README.md
Active pin mapping for the current build. Also maintained in Google Sheets.
| Function | Pin | Notes |
|---|---|---|
| CLK | D27 | SPI1 clock |
| MISO | D1 | SPI1 data in |
| MOSI | D26 | SPI1 data out |
| TFT CS | D0 | Display chip select |
| TFT DC | D2 | Display data/command |
| Backlight | D3 | PWM brightness control |
| Touch Y+ | D24 | Analog (A10) |
| Touch X- | D25 | Analog (A11) |
| Touch X+ | D28 | Digital |
| Touch Y- | D29 | Digital |
| Function | Pin | Notes |
|---|---|---|
| SCK | D13 | SPI0 clock (default) |
| MISO | D12 | SPI0 data in (default) |
| MOSI | D11 | SPI0 data out (default) |
| CE | D9 | |
| CSN | D10 |
| Function | Pin | Notes |
|---|---|---|
| Steering | D14 | Analog (A0) — wheel input |
| Throttle | D15 | Analog (A1) — trigger input |
| Joystick X | D17 | Analog (A3) — e.g. chute aim L/R |
| Joystick Y | D16 | Analog (A2) — e.g. chute aim U/D |
| Function | Pin | Notes |
|---|---|---|
| Row A | D30 | Digital |
| Row B | D31 | Digital |
| Row C | D32 | Digital |
| Row D | D33 | Digital |
| Col 1 | D34 | Digital |
| Col 2 | D35 | Digital |
3D design for the transmitter enclosure is on OnShape.
Install via Arduino IDE Library Manager:
- RF24 (TMRh20 fork)
- Adafruit GFX Library
- Adafruit ILI9341
- Adafruit BusIO
Bundled with the Teensy board package:
- TouchScreen — included in
{teensy_package}/libraries/TouchScreen, API-compatible with Adafruit TouchScreen
Receiver also requires:
This project is developed with assistance from Claude (Anthropic), used for code architecture, refactoring, and documentation.
This project is licensed under the GNU General Public License v3.0 — see LICENSE for details.
