Skip to content

A personal microboard that displays information about my PC and home server. It also includes several display options that can show data from tests and other parts of the current project. Everything is semi-modular so it can be adapted to whatever is needed at the moment.

Notifications You must be signed in to change notification settings

Apfelholz/Dynamic-Project-Display-Module

Folders and files

NameName
Last commit message
Last commit date

Latest commit

f0730bc · · Dec 16, 2025

History

13 Commits
Dec 14, 2025
Dec 14, 2025
Dec 14, 2025
Dec 16, 2025
Dec 16, 2025
Dec 14, 2025
Dec 14, 2025
Dec 16, 2025

Repository files navigation

Hi

I'm a young student from Germany who loves to program and also builds in the physical world from time to time. This project is the first time I ever worked on PCB design and produced a (serious) CAD model.

When I found out about Blueprint I had already built an Arduino-based prototype of the idea that soon became this project. With the knollage of the requirements that I needed from this adventure I got to designing the DPDIM V1. (The first thing being finding some stupid acronym)

Dynamic Project Display and Input Module

DPDIM is a 16-key micropad with a 4x4 RGB LED matrix, five status LEDs, an OLED display and two rotary encoders. It is based on the Seeed XIAO RP2040 and misuses KMK for the firmware.

Features

  • 16 keys for custom functionality
  • 4x4 WS2812B RGB LED matrix as a simple and bright display option
  • 128x32 OLED display
  • 2 EC11 rotary encoders to get even more input options
  • 5 status LEDs to get myself to do my work...

CAD

The model includes a cutout for the USB and I2C connection in the back as well as a big one at the top to show some of the inside and the LED matrix. In the top plate there are also two decorative channels and the descriptions of the status LEDs. The keys are placed at the bottom for easy access when placed over the mouse on the desk.

DPDIM V1_Inside

DPDIM_V1_FrontLeft

DPDIM_V1_FrontTop

The model has been made in Fusion 360 after Onshape did collapse on me.

PCB

The PCB design I did in KiCad while learning the software on the fly. The silkscreen picture is an experiment I don't expect to work but took the chance to test.

Schematic:

WhatsApp Bild 2025-12-07 um 17.29.00_7e5e3bc0

PCB:

WhatsApp Bild 2025-12-07 um 17.28.47_4aa92623

Firmware

The firmware implements a JSON API that is able to be controlled from the PC. As I don't have the pad yet it is untested.

The exact API layout:

1. LED Control

Control individual status LEDs.

Command:

{
   "type": "led",
   "index": 0,
   "value": true
}}

Parameters:

  • type (string): "led"
  • index (integer): LED index
  • value (boolean): true = ON, false = OFF

2. RGB Pixel Control (Single)

Command:

{
   "type": "rgb",
   "index": 5,
   "r": 255,
   "g": 128,
   "b": 0
}}

Parameters:

  • type (string): "rgb"
  • index (integer): Pixel index
  • r (integer)
  • g (integer)
  • b (integer)

3. RGB Pixel Control (All)

Command:

{
   "type": "rgb_all",
   "r": 255,
   "g": 0,
   "b": 0
}}

Parameters:

  • type (string): "rgb_all"
  • r (integer)
  • g (integer)
  • b (integer)

4. OLED Display - Set Text

Command:

{
   "type": "oled",
   "line": 0,
   "text": "Hello World"
}}

Parameters:

  • type (string): "oled"
  • line (integer): Line index
  • text (string)

5. OLED Display - Clear All

Command:

{
   "type": "oled_clear"
}}

Parameters:

  • type (string): "oled_clear"

Events (Device → Host)

1. Key Press/Release

Message:

{
   "type": "key",
   "row": 0,
   "col": 5,
   "state": "press"
}}

Fields:

  • type (string): "key"
  • row (integer): Row index (0-1)
  • col (integer): Column index (0-8)
  • state (string): "press" or "release"

2. Encoder Rotation

Message:

{
   "type": "encoder",
   "id": 0,
   "delta": 1
}}

Fields:

  • type (string): "encoder"
  • id (integer)
  • delta (integer): Direction: 1 = clockwise, -1 = counter-clockwise

3. Encoder Button

Message:

{
   "type": "encoder_btn",
   "id": 0,
   "state": "press"
}}

Fields:

  • type (string): "encoder_btn"
  • id (integer)
  • state (string): "press" or "release"

Response Types

Acknowledgment (ACK)

Sent when a command is successfully executed.

Format:

{
   "type": "ack",
   "cmd": "led"
}}

Fields:

  • type (string): "ack"
  • cmd (string): The command type that was executed

Error

Sent when a command fails.

Format:

{
   "type": "err",
   "cmd": "rgb",
   "reason": "bad_args"
}}

Fields:

  • type (string): "err"
  • cmd (string): The command type that failed
  • reason (string): Error reason:
    • "json" - JSON parsing error
    • "bad_args" - Invalid arguments or out-of-range values
    • "unknown_cmd" - Unknown command type

BOM

In BOM.csv

About

A personal microboard that displays information about my PC and home server. It also includes several display options that can show data from tests and other parts of the current project. Everything is semi-modular so it can be adapted to whatever is needed at the moment.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages