Skip to content

BlommeJan/Starkpad

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

8 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Starkpad

Starkpad

A Linux-Powered Touchscreen Macro Deck & Virtual Input Device

Features β€’ Architecture β€’ Getting Started β€’ User Manual β€’ License

Platform License Protocol UI Framework Watch on YouTube


πŸ“– Overview

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.

Starkpad Top View Starkpad Top Angle View

Starkpad Side Angle View

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.


✨ Features

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.

πŸ—οΈ Architecture

Starkpad Wiring Schematic

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  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

πŸš€ Getting Started

Prerequisites

  • Hardware: Arduino UNO Q, Seeed XIAO RP2040, Waveshare 12.3" Display
  • Software: Git, CMake, GCC, Python 3, Arduino IDE
  • Full parts list: BOM.md

Quick Start

# 1. Clone the repository
git clone https://github.com/BlommeJan/starkpad.git
cd starkpad

# 2. Follow the installation guide
# β†’ installation-manual.md

πŸ“˜ Full Installation Manual

Access the Web UI

Once running, open in any browser:

http://starkpad-uno-q.local/
Credential Value
Username admin
Password starkpad123

πŸ“ Repository Structure

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

πŸ“š Documentation

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

πŸ”Œ The SHIDP Protocol

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

πŸ“– User Manual


⚑ Powering On

  1. Connect Starkpad to power via USB-C
  2. Plug the RP2040 receiver dongle into your target PC
  3. Wait ~15-30 seconds for boot
  4. Device is ready when the UI appears

⚠️ Important: Run sudo systemctl stop arduino-router on the UNO Q after each boot.


πŸ–₯️ The User Interface

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  [Keyboard]   [Touchpad]   [Grid]    [Status] β”‚  ← Top Bar
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                               β”‚
β”‚              MAIN CONTENT AREA                β”‚  ← Changes per mode
β”‚                                               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Tap any tab to switch modes.


⌨️ Keyboard Mode

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


πŸ–±οΈ Touchpad Mode

Turns the screen into a precision trackpad.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                 β”‚
β”‚        TOUCH SURFACE            β”‚  ← Drag to move cursor
β”‚                                 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  LEFT CLICK    β”‚  RIGHT CLICK   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸŽ›οΈ Macro Grid Mode

A grid of 60 programmable buttons per application.

How to use:

  1. Select a Category (e.g., Design)
  2. Select an App (e.g., Figma)
  3. 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

🌐 Web Configuration

Starkpad Web UI

Access

http://starkpad-uno-q.local/

Login: admin / starkpad123

What you can do

Tab Features
Keys Edit keyboard layouts, create app profiles
Appearance Customize colors, themes
Settings Change keyboard language, touchpad position

Editing a button

  1. Click any button in the grid
  2. Modify: Name, Icon, Actions
  3. Click Save
  4. Click Apply Now to reload config

πŸ“„ Configuration File Reference

Location: Starkpad/lv_port_linux/ui-config/config.json

Structure Overview

{
  "settings": {
    "theme": { "bg": {...}, "text_color": "#303450", ... },
    "keyboard": { "language": "en-US", ... }
  },
  "categories": [
    {
      "id": "design",
      "label": "Design",
      "icon": "palette",
      "apps": [...]
    }
  ]
}

Key Object

{
  "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

Common Keycodes

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

Media Keycodes

Keycode Action
PLAY_PAUSE Toggle play/pause
NEXT / PREV Next/previous track
VOL_UP / VOL_DOWN Volume control
MUTE Toggle mute

Examples

Save All (Ctrl+Shift+S):

{ "name": "SaveAll", "icon": "floppy-disk", "shortcut": { "t": "key", "k": "S", "m": ["CTRL", "SHIFT"] } }

Empty slot:

null

Media key:

{ "name": "Play", "icon": "play", "shortcut": { "t": "media", "k": "PLAY_PAUSE" } }

πŸ”§ Troubleshooting

Input not working

Problem Solution
Keys do nothing Run sudo systemctl stop arduino-router
No response Check if RP2040 dongle is connected
Intermittent Verify TX/RX wiring

Web UI not loading

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

View logs

# Web server logs
journalctl -u starkpad-webui.service -f

# SHIDP debug log
cat /home/arduino/Starkpad/.cursor/debug.log

πŸ“‹ Quick Reference

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

🀝 Contributing

  1. Fork the repository
  2. Create feature branch: git checkout -b feature/amazing
  3. Commit changes: git commit -m 'Add feature'
  4. Push: git push origin feature/amazing
  5. Open a Pull Request

πŸ“œ License

MIT License β€” see LICENSE


πŸ™ Credits


Starkpad β€” MCT Research Project 2026

About

A Linux-powered touchscreen macro deck and virtual input device. Features a customizable 60-button grid, virtual keyboard, precision touchpad, and web-based configuration UI. Built with LVGL on Arduino UNO Q, communicating via custom SHIDP protocol to a USB HID dongle.

Topics

Resources

License

Stars

Watchers

Forks