A Linux-Powered Touchscreen Macro Deck & Virtual Input Device
Features β’ Architecture β’ Getting Started β’ User Manual β’ License
Starkpad is a physical, open-source hardware interface that transforms a Linux-based touchscreen into a fully customizable virtual keyboard, precision touchpad, and programmable macro deck.
Built on the Arduino UNO Q running Yocto Linux, Starkpad renders its interface using the LVGL graphics library. It translates user input into a custom serial protocol (SHIDP) which is sent to a Seeed XIAO RP2040 dongle that emulates a standard USB HID device on the target computer.
π‘ No drivers required β works with any PC, Mac, or Linux machine out of the box.
| Feature | Description |
|---|---|
| πΉ Virtual Keyboard | Full QWERTY layout with multiple language support (US, Colemak, BE-nl). |
| π±οΈ Precision Touchpad | Smooth, relative mouse movement with dedicated click buttons. |
| β¨οΈ Macro Grid | 60 customizable buttons per page with complex key sequences. |
| π± App Profiles | Tailored layouts for Figma, Blender, VS Code, and more. |
| π Web Config UI | Configure everything via browser on your network. |
| π SHIDP Protocol | 8-byte frames with XOR checksums for reliable communication. |
| π‘οΈ Watchdog Safety | Auto-releases keys if connection lost for >80ms. |
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ ββββββββββββ
β Starkpad App β β MCU Bridge β β USB Receiver β β Your PC β
β (Linux/LVGL) βββββββΆβ (ATmega4809) βββββββΆβ (Seeed RP2040) βββββββΆβ β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ ββββββββββββ
/dev/ttyHS1 Passthrough USB HID Output Keyboard
115200 baud (transparent) (TinyUSB) Mouse
| Component | Hardware | Role |
|---|---|---|
| Linux Host | Arduino UNO Q | Runs LVGL touchscreen UI, sends SHIDP frames |
| MCU Bridge | ATmega4809 | Transparent serial passthrough |
| USB Receiver | Seeed XIAO RP2040 | Parses frames β USB HID output |
- Hardware: Arduino UNO Q, Seeed XIAO RP2040, Waveshare 12.3" Display
- Software: Git, CMake, GCC, Python 3, Arduino IDE
- Full parts list: BOM.md
# 1. Clone the repository
git clone https://github.com/BlommeJan/starkpad.git
cd starkpad
# 2. Follow the installation guide
# β installation-manual.mdOnce running, open in any browser:
http://starkpad-uno-q.local/
| Credential | Value |
|---|---|
| Username | admin |
| Password | starkpad123 |
starkpad/
βββ Starkpad/
β βββ lv_port_linux/ # Main LVGL application
β β βββ src/starkpad/ # Custom C modules
β β βββ ui-config/ # JSON config files
β βββ web-server/ # Python Flask backend
β βββ shidp_receiver/ # RP2040 firmware
β βββ uno-q-echo/ # MCU bridge firmware
β βββ scripts/ # Install scripts
β
βββ images/ # Schematics
βββ docs/ # Academic docs
βββ starkpad-case-003.stl # 3D printable case
βββ BOM.md # Bill of Materials
βββ installation-manual.md # Setup guide
βββ README.md # This file
| Document | Description |
|---|---|
| π Installation Manual | Hardware assembly & software setup |
| π SHIDP Protocol Spec | Technical protocol details |
| π Bill of Materials | Components with pricing |
| π Web UI Quick Start | Web configuration guide |
Serial Human Interface Device Protocol β a lightweight 8-byte frame protocol.
[SYNC] [TYPE] [ACTION] [P1] [P2] [P3] [P4] [CHECKSUM]
0xAA 0x01 0x00 ... ... ... ... XOR(0-6)
| Field | Values |
|---|---|
| Types | 0x01 Keyboard, 0x02 Mouse, 0x03 Media |
| Actions | 0x00 Tap, 0x01 Hold, 0x02 Release |
| Safety | 80ms watchdog auto-releases all inputs |
- Connect Starkpad to power via USB-C
- Plug the RP2040 receiver dongle into your target PC
- Wait ~15-30 seconds for boot
- Device is ready when the UI appears
β οΈ Important: Runsudo systemctl stop arduino-routeron the UNO Q after each boot.
βββββββββββββββββββββββββββββββββββββββββββββββββ
β [Keyboard] [Touchpad] [Grid] [Status] β β Top Bar
βββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β MAIN CONTENT AREA β β Changes per mode
β β
βββββββββββββββββββββββββββββββββββββββββββββββββ
Tap any tab to switch modes.
A full virtual keyboard that sends keystrokes to your computer.
How to use:
- Single key: Tap to send
- Combo (e.g., Ctrl+C): Hold modifier β tap key β release
Layouts available: en-US, colemak, nl-BE
Turns the screen into a precision trackpad.
βββββββββββββββββββββββββββββββββββ
β β
β TOUCH SURFACE β β Drag to move cursor
β β
ββββββββββββββββββ¬βββββββββββββββββ€
β LEFT CLICK β RIGHT CLICK β
ββββββββββββββββββ΄βββββββββββββββββ
A grid of 60 programmable buttons per application.
How to use:
- Select a Category (e.g., Design)
- Select an App (e.g., Figma)
- Tap any button to execute its shortcut
Action types:
| Type | Description | Example |
|---|---|---|
key |
Keyboard shortcut | Ctrl+S |
media |
Media control | Play/Pause |
text |
Type a string | Email address |
delay |
Pause in sequence | 100ms |
http://starkpad-uno-q.local/
Login: admin / starkpad123
| Tab | Features |
|---|---|
| Keys | Edit keyboard layouts, create app profiles |
| Appearance | Customize colors, themes |
| Settings | Change keyboard language, touchpad position |
- Click any button in the grid
- Modify: Name, Icon, Actions
- Click Save
- Click Apply Now to reload config
Location: Starkpad/lv_port_linux/ui-config/config.json
{
"settings": {
"theme": { "bg": {...}, "text_color": "#303450", ... },
"keyboard": { "language": "en-US", ... }
},
"categories": [
{
"id": "design",
"label": "Design",
"icon": "palette",
"apps": [...]
}
]
}{
"name": "Copy",
"icon": "copy",
"shortcut": {
"t": "key",
"k": "C",
"m": ["CTRL"]
}
}| Property | Description |
|---|---|
name |
Button label (1-6 chars) |
icon |
FontAwesome icon name |
shortcut.t |
Type: key, media, text, delay |
shortcut.k |
Keycode (e.g., A, ESC, F1) |
shortcut.m |
Modifiers: CTRL, SHIFT, ALT, GUI |
| Keys | Keycodes |
|---|---|
| Letters | AβZ |
| Numbers | 0β9 |
| Function | F1βF12 |
| Navigation | UP, DOWN, LEFT, RIGHT, HOME, END |
| Special | ESC, TAB, ENTER, SPACE, BACKSPACE, DELETE |
| Keycode | Action |
|---|---|
PLAY_PAUSE |
Toggle play/pause |
NEXT / PREV |
Next/previous track |
VOL_UP / VOL_DOWN |
Volume control |
MUTE |
Toggle mute |
Save All (Ctrl+Shift+S):
{ "name": "SaveAll", "icon": "floppy-disk", "shortcut": { "t": "key", "k": "S", "m": ["CTRL", "SHIFT"] } }Empty slot:
nullMedia key:
{ "name": "Play", "icon": "play", "shortcut": { "t": "media", "k": "PLAY_PAUSE" } }| Problem | Solution |
|---|---|
| Keys do nothing | Run sudo systemctl stop arduino-router |
| No response | Check if RP2040 dongle is connected |
| Intermittent | Verify TX/RX wiring |
| Problem | Solution |
|---|---|
| Page not found | sudo systemctl start starkpad-webui.service |
| Can't resolve hostname | Use IP address or run setup-mdns.sh |
| Auth failed | Check .env file credentials |
# Web server logs
journalctl -u starkpad-webui.service -f
# SHIDP debug log
cat /home/arduino/Starkpad/.cursor/debug.log| Action | How |
|---|---|
| Switch modes | Tap tab in top bar |
| Send key | Tap on keyboard |
| Send combo | Hold modifier + tap key |
| Move mouse | Drag on touchpad |
| Click | Tap L/R buttons |
| Run macro | Tap grid button |
| Configure | Open web UI |
- Fork the repository
- Create feature branch:
git checkout -b feature/amazing - Commit changes:
git commit -m 'Add feature' - Push:
git push origin feature/amazing - Open a Pull Request
MIT License β see LICENSE
- LVGL β Graphics library (MIT)
- Adafruit TinyUSB β USB HID stack
- FontAwesome β Icons (CC BY 4.0)
- DroneBot Workshop β UNO Q setup tutorial
Starkpad β MCT Research Project 2026

