Skip to the content
PCBKitNew board
2 layers172.4 × 128.4 mmElgato, the printed circuit board in 3D

Устройство аналогично Elgato Stream Deck, но с открытым исходным кодом. Каждая кнопка имеет собственный круглый дисплей 160×160 для отображения иконок, RGB LED подсветку и программируемое действие.

Size
172.4 × 128.4 mm
Copper layers
2
Thickness
1.6 mm
Parts
76
Nets
75
Pads
341
Tracks, vias
710, 120
Pours
1
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
14 Apr 2026
Updated
8 Sep 2026

Overview

Elgato is an open-source printed circuit board by Cib0rg, from the Cib0rg/macroboard repository on GitHub. It is a 2-layer board of 172.4 × 128.4 mm with 76 parts on 75 nets, routed with 710 tracks and 120 vias.

It is built around the ESP32-S3-DEVKITC-1-N8R8, 74HC138 and WS2812B, with the 1N4148W among its other parts. Its parts include 25 capacitors, 11 resistors, 11 diodes, 11 connectors and 11 switches. It belongs with the ESP32 boards of this library.

Main components

4

README

README.md

ESP32-S3 Macro Keyboard

Программируемая макроклавиатура с открытым исходным кодом на базе ESP32-S3 — 10 кнопок с индивидуальными круглыми дисплеями, RGB подсветкой и настраиваемыми действиями.

Project Status License

Обзор

Устройство аналогично Elgato Stream Deck, но с открытым исходным кодом. Каждая кнопка имеет собственный круглый дисплей 160×160 для отображения иконок, RGB LED подсветку и программируемое действие. Отсутствует ограничение по входному напряжению, подключение зарядок с QC скорее всего сожжёт часть платы! Включать сначала питание от 2А блока (нижний разъём), потом уже подключать ESP через встроенные. Иначе есть небольшой шанс выхода из строя DC-DC преобразователя на плате ESP.

Реализованные возможности

Прошивка (Firmware)

  • ✅ Драйвер дисплеев GC9A01 — 10 круглых дисплеев 160×160 через SPI с мультиплексором 2× 74HC138
  • ✅ PWM подсветка дисплеев — регулировка яркости 0-255 через LEDC
  • ✅ WS2812 RGB LED — индивидуальная подсветка каждой кнопки с настройкой цвета и яркости
  • ✅ USB Composite Device — HID Keyboard + Consumer Control + Vendor Bulk (TinyUSB)
  • ✅ Протокол обмена — 64-байтовые пакеты через Vendor Bulk endpoint
  • ✅ Конфигурация — хранение настроек кнопок и энкодера в LittleFS
  • ✅ Папки — вложенные папки кнопок (до 8 уровней глубины)
  • ✅ Передача изображений — JPEG изображения на кнопки с дедупликацией по CRC32
  • ✅ Асинхронная запись LittleFS — save_task на Core 0, очередь 20 слотов; протокол не блокируется на I/O, sync fallback при нехватке слотов; полная синхронизация ~17 изображений: ~11 с вместо ~39 с
  • ✅ LittleFS хранилище текстов — тексты до 4096 байт в LittleFS по 5-компонентному ключу (profile/folder/button/action_slot/step_index); покрывает: Keyboard > 44 байт, long press Keyboard, каждый шаг Sequence с длинным текстом, Sequence-блоб > 51 байт
  • ✅ Rotary encoder — настраиваемые действия на CW/CCW/нажатие/долгое нажатие
  • ✅ Долгое нажатие — отдельное действие и название для каждой кнопки (корневой и в папках)
  • ✅ Debounced кнопки — обработка нажатий через прерывания с программным debounce
  • ✅ Действия кнопок: Keyboard, Media (Consumer Control), Shell, Folder, Sequence, CustomHID, LaunchApp, NightMode

Управляющий софт (Software)

  • ✅ Кроссплатформенный UI — Avalonia UI (Linux, Windows, macOS)
  • ✅ Backend Service — фоновый сервис для связи с устройством
  • ✅ IPC — TCP-based коммуникация между UI и Backend с автоматическим переподключением
  • ✅ Редактор конфигурации — создание, редактирование, синхронизация конфигураций с устройством (JSON)
  • ✅ Конфигурация кнопок — inline-редактор с поддержкой всех типов действий
  • ✅ Захват клавиш — запись комбинаций клавиш в реальном времени
  • ✅ Последовательности действий — до 16 шагов с задержками
  • ✅ Медиа-клавиши — Volume Up/Down, Mute, Play/Pause, Next/Prev Track
  • ✅ Превью изображений — миниатюры в списке кнопок и превью в редакторе
  • ✅ Настройка LED — выбор цвета через ColorPicker, яркость
  • ✅ Настройка подсветки дисплеев — слайдер яркости в Dashboard и Settings
  • ✅ Tray icon — работа в фоне, сворачивание в трей
  • ✅ Dashboard — статус устройства, лог событий, управление яркостью
  • ✅ Diff-based синхронизация профиля — при Send пересылаются только изменённые кнопки; fingerprint учитывает image path+mtime, action type+JSON, LED; типовая правка одной кнопки: ~5 с; холодная синхронизация ~17 изображений: ~11 с (async SPIFFS)
  • ✅ Синхронизация с устройством — отправка/загрузка профилей через USB
  • ✅ Сохранение профиля — Save пишет в исходный файл (откуда был загружен через Load), а не в AppData
  • ✅ LibUsbDotNet — кроссплатформенная USB коммуникация (Linux/Windows/macOS)
  • ✅ Плагины (Stream Deck совместимость) — запуск .streamDeckPlugin архивов и исполняемых плагинов, WebSocket API на порту 28196, Property Inspector на порту 8787; плагины хранятся в plugins/ рядом с бинарником бэкенда
  • ✅ Валидация ввода — Shell-команда ≤ 49 байт UTF-8, Custom HID ≤ 51 байт (соответствует ACTION_DATA_MAX_LEN прошивки); превышение показывает ошибку вместо молчаливой обрезки
  • ✅ Кэш иконок приложений — иконки извлекаются один раз через P/Invoke и сохраняются в %APPDATA%\MacroKeyboard\icons\; повторное открытие диалога не вызывает P/Invoke

Плагины

MacroKeyboard поддерживает плагины в стиле Elgato Stream Deck. Каждая кнопка может быть привязана к действию стороннего плагина, который получает события нажатий и управляет дисплеем.

Два режима работы:

  • Executable — отдельный процесс на любом языке (C#, Node.js, Python), общается с бекендом через WebSocket на порту 28196.
  • Managed — .NET DLL, загружается в процесс бекенда, получает прямой доступ к устройству через IPlugin / IPluginContext.

Плагины кладутся в папку plugins/ рядом с бинарником бекенда в виде директории или .zip-архива с расширением .sdPlugin. Существующие плагины для Stream Deck работают с минимальными изменениями.

Подробное руководство по разработке плагинов: PLUGIN_DEVELOPMENT.html

Структура проекта

text
elgato/
├── firmware/                    # Прошивка ESP32-S3 (ESP-IDF v5.4, C)
│   └── main/
│       ├── hardware/            # Драйверы: дисплеи, LED, кнопки, энкодер
│       ├── profile/             # Менеджер профилей, исполнитель действий
│       ├── protocol/            # Обработчик протокола, передача изображений и текста
│       ├── storage/             # NVS, LittleFS, профили, изображения, длинный текст, async save_task
│       └── usb/                 # USB дескрипторы, HID keyboard, vendor endpoint
│
├── hardware/                    # Аппаратная часть
│   ├── case/                    # 3D-модели корпуса (OpenSCAD + STL для печати)
│   └── pcb/                     # Схемотехника и разводка PCB (KiCad)
│
├── software/                    # Управляющее приложение (.NET 10, C#)
│   └── src/
│       ├── MacroKeyboard.Core/          # Модели, IPC, интерфейсы сервисов
│       ├── MacroKeyboard.Communication/ # USB протокол, команды устройства
│       ├── MacroKeyboard.Infrastructure/# Реализация сервисов, репозитории
│       ├── MacroKeyboard.Backend/       # Фоновый сервис (IPC сервер, роутинг)
│       └── MacroKeyboard.UI/            # Avalonia UI (MVVM, CommunityToolkit)
│
└── plans/                       # Проектная документация

Быстрый старт

Сборка прошивки

bash
cd firmware
# Через Docker (рекомендуется):
docker run --rm -v "$(pwd)":/project -w /project espressif/idf:v5.4 idf.py build
# Или локально с установленным ESP-IDF v5.4:
idf.py build
idf.py flash

Сборка софта

bash
cd software
dotnet build MacroKeyboard.sln
# Запуск Backend:
dotnet run --project src/MacroKeyboard.Backend
# Запуск UI:
dotnet run --project src/MacroKeyboard.UI

Linux: доступ к USB без root

bash
sudo cp software/scripts/99-macrokeyboard.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules

Технологии

Прошивка

КомпонентТехнология
ПлатформаESP32-S3 N16R8 (16MB Flash, 8MB PSRAM)
FrameworkESP-IDF v5.4
RTOSFreeRTOS
USBTinyUSB (HID + Vendor composite)
ЯзыкC99

Софт

КомпонентТехнология
Runtime.NET 10
UIAvalonia UI 12
АрхитектураMVVM (CommunityToolkit.Mvvm)
USBLibUsbDotNet 3.x
ИзображенияSixLabors.ImageSharp
СериализацияNewtonsoft.Json
ЛогированиеSerilog

Аппаратные компоненты

КомпонентМодельКол-воПримечания
МикроконтроллерESP32-S3 N16R8116MB Flash, 8MB PSRAM
ДисплейGC9A01 160×16010Круглые TFT, SPI
КнопкиТактовые10GPIO с прерываниями
RGB LEDWS281210Адресные, RMT peripheral
ЭнкодерRotary encoder1С кнопкой
Мультиплексор74HC1382Выбор дисплея (5+5)

Схемотехника и разводка PCB находятся в директории hardware/pcb/ (формат KiCad). 3D-модели корпуса для печати — в hardware/case/ (OpenSCAD + STL).

Протокол обмена данными

64-байтовые пакеты через USB Vendor Bulk endpoint:

text
[0]    Magic (0xA5)
[1]    Command ID
[2-3]  Payload Length
[4-5]  Sequence Number
[6-61] Payload (56 bytes)
[62]   Checksum (XOR)
[63]   End Byte (0x5A)

Команды

IDКомандаОписание
0x01PINGПроверка связи
0x02GET_DEVICE_INFOИнформация об устройстве
0x10SET_PROFILEАктивировать профиль
0x11–0x12GET_PROFILE_INFO / FOLDER_STATEСостояние профиля и текущей папки
0x20–0x22IMAGE_TRANSFERПередача изображений (start/chunk/end)
0x30–0x34BUTTON_ACTION/NAMEУстановка действия и имени кнопки (корневые и папки)
0x35SET_ENCODER_ACTIONНастройка действий энкодера
0x36–0x37LONG_PRESS_ACTION/NAMEДействие и название долгого нажатия
0x38–0x3ATEXT_TRANSFERПередача текста/блоба в SPIFFS (start/chunk/end); Keyboard > 44 байт, long press, Sequence-шаги и блобы > 51 байт
0x40–0x43LED/BACKLIGHTУправление LED и подсветкой дисплеев
0x50–0x53PROFILE_SAVE/LOAD/DELETE/REFRESHУправление профилями и обновление дисплеев

Типы действий

IDТипОписание
0x01KeyboardЭмуляция клавиатуры; текст ≤ 44 байт — inline, > 44 байт — SPIFFS
0x02CustomHIDПроизвольный HID report
0x04FolderОткрытие папки кнопок
0x06ShellВыполнение shell-команды на PC
0x07SequenceПоследовательность до 16 действий
0x08LaunchAppЗапуск приложения на PC
0x09MediaМедиа-клавиши (Volume, Mute, Play/Pause и др.)
0x0ANightModeПереключение ночного режима (снижение яркости)
0x0BPluginДействие стороннего плагина (Stream Deck-совместимого)

LittleFS-хранилище текстов

Команды 0x38–0x3A передают текстовые данные, которые не влезают inline. На устройстве файл называется /storage/txt_{P}_{F}_{B}_{A}_{S}.bin, где:

ПолеСмысл
Pprofile_id (всегда 0)
Ffolder_id: 0..15 = папка, 255 = root
Bbutton_id: 0..9; энкодер: 0x40–0x43
Aaction slot: 0 = short press, 1 = long press
Sstep: 0xFF = прямое Keyboard, 0xFE = Sequence-блоб, 0..15 = шаг Sequence

Что хранится в SPIFFS:

  • Keyboard текст > 44 байт — step=0xFF (short), step=0xFF, slot=1 (long press)
  • Sequence-шаг Keyboard > 44 байт — step=N (индекс шага)
  • Sequence-блоб > 51 байт — step=0xFE; в action_data кнопки записывается маркер [0x01]

ПО автоматически выбирает между inline и SPIFFS. Payload CMD_SET_BUTTON_TEXT_START: 9 байт — [profile_id][folder_id][button_id][action_slot][step_index][data_size(4 LE)].

Лицензия

WTFPL

Parts

76
QtyValueFootprintReferences
24100nFCapacitor_SMD:C_0805_2012MetricC10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25 +8
10Conn_01x08Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_VerticalJ1, J2, J3, J4, J5, J6, J7, J8, J9, J10
10SW_SPDTButton_Switch_Keyboard:SW_Cherry_MX_1.00u_PCBSW2, SW3, SW4, SW5, SW6, SW7, SW8, SW9, SW10, SW11
10WS2812BLED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mmD1, D2, D3, D4, D5, D6, D7, D8, D9, D10
4100Resistor_SMD:R_0805_2012MetricR5, R6, R7, R12
4MountingHoleMountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
310kResistor_SMD:R_0805_2012MetricR2, R3, R4
25.1k 5%Resistor_SMD:R_0805_2012MetricR1, R11
274HC138Package_SO:SOIC-16_3.9x9.9mm_P1.27mmU1, U2
11N4148WDiode_SMD:D_SOD-123D11
1330Resistor_SMD:R_0805_2012MetricR10
14.7kResistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P5.08mm_HorizontalR13
1470uF 10VCapacitor_SMD:CP_Elec_8x10.5C1
1ESP32-S3-DEVKITC-1-N8R8ESP32-S3-DevKitC-1-N8R8:ESP32-S3-DEVKITC-1-N8R8U3
1RotaryEncoder_SwitchRotary_Encoder:RotaryEncoder_Alps_EC11E-Switch_Vertical_H20mmSW1
1USB_C_Receptacle_PowerOnly_6PConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-17J11

Questions

How big is the Elgato PCB?

It measures 172.4 × 128.4 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Elgato use?

76 parts, built around the ESP32-S3-DEVKITC-1-N8R8, 74HC138, WS2812B and 1N4148W. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Elgato KiCad files?

From the Cib0rg/macroboard repository on GitHub, at the commit this page was made from: the board is hardware/pcb/elgato.kicad_pcb and its schematic hardware/pcb/elgato.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Elgato design in my own project?

Its repository states no licence, so its author keeps all rights: ask Cib0rg before reusing the design.

Similar boards

  • 2 layers66 × 117 mmInput32DC, the printed circuit board in 3D

    Input32DC

    DavidMFlynn/SerialMRRC

    Serial Model Railroad Control

    224 parts1MIT
  • 2 layers167.6 × 175.3 mmProgram Counter, the printed circuit board in 3D

    Program Counter

    freesurfer-rge/slothpu16

    Further Adventures in Electronics

    68 partsMIT
  • 2 layers240 × 239.9 mmKiCad chessLab, the printed circuit board in 3D

    KiCad chessLab

    dev-campusfab/chessLab

    Interactive Chess board that brings visuals to the game and can help the player to learn.

    295 parts2AGPL-3.0
  • 2 layers100 × 100 mmMain REVA2, the printed circuit board in 3D

    Main REVA2

    Joris1306/Collecteur_de_donnees_animalieres

    Bienvenue sur le dépôt officiel du projet Piège Photographique avec Classification Animale par IA. Nous sommes une équipe de six étudiants ingénieurs de Polytech Nantes ayant dédié une année universitaire complète à la…

    68 parts1
  • 2 layers130.5 × 169.5 mmLinefollowingrobot, the printed circuit board in 3D

    Linefollowingrobot

    msafeerhassan/linefollowingrobot

    Line Following Robot with PID project uses IR Sensors, Microcontroller and Motors to follow a line path on the floor.

    18 parts1
  • 2 layers92 × 63.5 mmPetFeeder HW, the printed circuit board in 3D

    PetFeeder HW

    EliasFIlho/PetFeeder_HW

    PCB Files for PetFeeder project

    28 parts