SkillAgentSearch skills...

Starkpad

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.

Install / Use

/learn @BlommeJan/Starkpad
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

<p align="center"> <img src="images/main.JPG" alt="Starkpad" width="600"/> </p> <h1 align="center">Starkpad</h1> <p align="center"> <strong>A Linux-Powered Touchscreen Macro Deck & Virtual Input Device</strong> </p> <p align="center"> <a href="#-features">Features</a> • <a href="#-architecture">Architecture</a> • <a href="#-getting-started">Getting Started</a> • <a href="#-user-manual">User Manual</a> • <a href="#-license">License</a> </p> <p align="center"> <img src="https://img.shields.io/badge/Platform-Linux%20%7C%20Embedded-blue?style=flat-square" alt="Platform"/> <img src="https://img.shields.io/badge/License-MIT-green?style=flat-square" alt="License"/> <img src="https://img.shields.io/badge/Protocol-SHIDP%20v1.1-orange?style=flat-square" alt="Protocol"/> <img src="https://img.shields.io/badge/UI-LVGL-lightgrey?style=flat-square" alt="UI Framework"/> <a href="https://youtu.be/fDFRH98BEmM"> <img src="https://img.shields.io/badge/Watch–on–YouTube-red?style=flat-square" alt="Watch on YouTube"/> </a> </p>

📖 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.

<p align="center"> <img src="images/top.JPG" alt="Starkpad Top View" width="300"/> <img src="images/top-angle.JPG" alt="Starkpad Top Angle View" width="300"/> </p> <p align="center"> <img src="images/side-angle.JPG" alt="Starkpad Side Angle View" width="400"/> </p>

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

<p align="center"> <img src="images/scheme.png" alt="Starkpad Wiring Schematic" width="600"/> </p>
┌─────────────────┐      ┌─────────────────┐      ┌─────────────────┐      ┌──────────┐
│  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

<p align="center"> <img src="images/webui.png" alt="Starkpad Web UI" width="600"/> </p>

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 | AZ | | Numbers | 09 | | Function | F1F12 | | 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 | | Inte

View on GitHub
GitHub Stars60
CategoryDevelopment
Updated11d ago
Forks4

Languages

C

Security Score

100/100

Audited on Mar 26, 2026

No findings