Соберите домашний Stream Deck на Raspberry Pi Pico

Если вы только начали стримить на Twitch или хотите ускорить рабочие процессы, вы наверняка видели устройства вроде Elgato Stream Deck. Они удобны для переключения сцен в OBS, отправки твитов, управления чатом и быстрого запуска макросов.
Проблема в том, что такие устройства стоят недёшево. Но что, если контроллер можно сделать самому — за небольшую часть стоимости коммерческих решений? Это возможно. В этом руководстве шаг за шагом показано, как собрать себе Stream Deck-подобную макропанель на Raspberry Pi Pico.
Что такое макропанель
Макропанель — это набор физических кнопок, каждая из которых отправляет заранее настроенное действие (макрокоманду). Пример: вместо ввода сочетания клавиш CTRL+C для копирования вы нажимаете одну клавишу на макропанели, и Pico отправляет нужное сочетание как USB-клавиатура.
Ключевые преимущества макропанели:
- Быстрая активация часто используемых команд.
- Изолированная физическая панель для стриминга и редактирования.
- Возможность кастомизации поведения на уровне прошивки.
Маленький Raspberry Pi Pico — идеальная недорогая плата для проекта: она поддерживает CircuitPython, умеет эмулировать USB-устройства и её легко программировать.
Связано: интересные проекты для Pi Pico
Что понадобится
Ниже список необходимых компонентов и инструментов. Там, где полезно, отмечены локальные альтернативы и подсказки по экономии.
- 1 × Raspberry Pi Pico (Pico RP2040).
- 9 × механических переключателей Gateron (подходят Cherry MX-совместимые).
- 9 × колпачков (keycaps) — можно напечатать на 3D-принтере.
- Паяльник и подставка/станция для пайки.
- Припой (около 0.5–1 мм, без свинца или с минимальным содержанием свинца по местным нормам).
- (4) винта M3 × 16 мм для крепления корпуса.
- Медный кабель ~20 AWG (примерно 0.8 мм²), около 60 см — прокладывайте с запасом.
- Стриппер/обжимной инструмент.
- Компьютер для программирования Pico (Windows/macOS/Linux).
- Корпус: печать на 3D-принтере, готовый корпус или самодельный фрагмент.
- Кабель USB-C → micro-USB (или USB-C, если у Pico соответствующий разъём).
- По желанию: мультиметр для проверки соединений.
Советы по экономии и локальные альтернативы
- Если у вас есть 3D-принтер, распечатайте корпус и колпачки. В противном случае заказывайте печать у локальных мастерских или используйте готовые кейкапы.
- Вместо дорогих переключателей можно взять более дешёвые «Kailh» или китайские аналоги, если бюджет ограничен. Учтите различия по тактильности и ресурсу.
Важно: если вы не уверены в работе с паяльником, попросите помощи у знающего человека. Паяльник разогревается до примерно ~450 °C (≈850 °F) — высокая температура опасна.
Краткий обзор процесса
- Подготовка механических переключателей и корпуса.
- Пайка проводов к переключателям и запаивание шлейфа.
- Подключение к GPIO на Raspberry Pi Pico.
- Установка CircuitPython и копирование файлов проекта.
- Тестирование и настройка макросов в OBS и других приложениях.
Ниже — подробные шаги с пояснениями и расширенными рекомендациями.
Как собрать макропанель
Шаг 1: пайка электроники
Подготовка
- Вставьте переключатели в верхнюю часть корпуса, но не закрепляйте окончательно — удобнее паять, пока они доступны.
- Слегка запаяйте ноги переключателей (т.н. «тinning») для лучшего будущего припайки проводов.
Подключение проводов
- Припаяйте по два провода к каждому переключателю: один «вход» (обычно красный) и один «общий» или «земля» (обычно чёрный). Такой цветовой код упрощает отладку.
- Соедините чёрные провода переключателей последовательно (в ряд), чтобы получить один общий «минус» — это уменьшает количество линий, и Pico будет получать замыкание между выбранным GPIO и общим проводом.
- В результате у вас будет 9 отдельных «красных» проводов (по одному на каждый переключатель) и один длинный чёрный провод общей шины.
Пайка к Pico
Припаяйте каждый «красный» провод к соответствующему GPIO на Pico. В этой схеме используются свободные цифровые контакты GP1–GP6 и GP19–GP21 (пример). Ниже приведена рекомендованная соответствие:
- Кнопка 1 → GP1
- Кнопка 2 → GP2
- Кнопка 3 → GP3
- Кнопка 4 → GP4
- Кнопка 5 → GP5
- Кнопка 6 → GP6
- Кнопка 7 → GP21
- Кнопка 8 → GP20
- Кнопка 9 → GP19
Чёрный общий провод припаивается к контакту, выдающему 3.3V (на некоторых платах это помечается как 3V3 или 3.3V). На Pico используйте вывод, который обеспечивает 3.3V-выход. В исходном проекте используется GPIO36 как 3.3V out — уточните маркировку вашей платы и подключайте именно 3.3V, а не ENABLE или другие выводы.
Проверка перед подачей питания
- Осмотрите каждое соединение: нет ли мостиков припоя или незакреплённых контактов.
- Используйте мультиметр в режиме прозвонки для проверки, что общий провод действительно соединён со всеми чёрными проводами.
Советы по пайке
- Работайте в хорошо проветриваемом помещении и используйте отсос припоя или флюс при необходимости.
- Надевайте защитные очки при распайке старых деталей.
Источник изображения: Raspberrypi.org
После того как пайка завершена, можно переходить к прошивке — это самая простая часть проекта.
Шаг 2: установка CircuitPython и кодирование макропанели
Подготовка программных инструментов
- Скачайте последнюю версию CircuitPython для Pico (файл .UF2) с официального сайта Adafruit.
- Скачайте проект-репозиторий Novaspirit или подобный проект на GitHub (в проекте есть папка lib и готовый code.py).
- Установите редактор Mu или Thonny — оба работают с CircuitPython файловой системой.
Установка CircuitPython
- Удерживайте кнопку BOOTSEL на Pico и подключите плату к компьютеру по USB. Появится устройство с именем RPI-RP2.
- Скиньте .UF2-файл CircuitPython на Pico (перетащите файл в окно RPI-RP2). После копирования вы можете отсоединить и снова подключить плату.
- Плата должна появиться как флеш-накопитель CIRCUITPY.
Копирование файлов проекта
- Распакуйте GitHub-архив и скопируйте содержимое папки PiPicoMacroKeys-Main/lib и файл code.py в корень CIRCUITPY. Это установит необходимые библиотеки и шаблон кода.
- Откройте code.py в Mu или Thonny для редактирования.
Готовый код
Ниже приведён рабочий пример кода для 9 кнопок. Он отправляет цифры 1–9 при нажатии соответствующей кнопки. Этот код легко адаптировать под любые сочетания клавиш.
# Изначально написан Novaspirit Tech
# Копируйте этот код в файл code.py на CIRCUITPY
import time
import usb_hid
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard import Keyboard
import board
import digitalio
# Назначение GPIO для каждой кнопки
btn1_pin = board.GP1
btn2_pin = board.GP2
btn3_pin = board.GP3
btn4_pin = board.GP4
btn5_pin = board.GP5
btn6_pin = board.GP6
btn7_pin = board.GP21
btn8_pin = board.GP20
btn9_pin = board.GP19
# Настройка входов с подтяжкой вниз
def setup_button(pin):
btn = digitalio.DigitalInOut(pin)
btn.direction = digitalio.Direction.INPUT
btn.pull = digitalio.Pull.DOWN
return btn
btn1 = setup_button(btn1_pin)
btn2 = setup_button(btn2_pin)
btn3 = setup_button(btn3_pin)
btn4 = setup_button(btn4_pin)
btn5 = setup_button(btn5_pin)
btn6 = setup_button(btn6_pin)
btn7 = setup_button(btn7_pin)
btn8 = setup_button(btn8_pin)
btn9 = setup_button(btn9_pin)
keyboard = Keyboard(usb_hid.devices)
# Функция отправки комбинации клавиш с короткой задержкой
def send_keys(*keys):
keyboard.send(*keys)
time.sleep(0.05)
# Основной цикл с простым программным антидребезгом
while True:
if btn1.value:
send_keys(Keycode.ONE)
while btn1.value:
time.sleep(0.01)
if btn2.value:
send_keys(Keycode.FOUR)
while btn2.value:
time.sleep(0.01)
if btn3.value:
send_keys(Keycode.SEVEN)
while btn3.value:
time.sleep(0.01)
if btn4.value:
send_keys(Keycode.TWO)
while btn4.value:
time.sleep(0.01)
if btn5.value:
send_keys(Keycode.FIVE)
while btn5.value:
time.sleep(0.01)
if btn6.value:
send_keys(Keycode.EIGHT)
while btn6.value:
time.sleep(0.01)
if btn7.value:
send_keys(Keycode.THREE)
while btn7.value:
time.sleep(0.01)
if btn8.value:
send_keys(Keycode.SIX)
while btn8.value:
time.sleep(0.01)
if btn9.value:
send_keys(Keycode.NINE)
while btn9.value:
time.sleep(0.01)
time.sleep(0.01)Пояснения к коду
- Библиотека adafruit_hid позволяет эмитировать поведение USB-клавиатуры.
- Keycode.ONE — отправляет символ ‘1’. Для комбинаций используйте кортежи, например (Keycode.CONTROL, Keycode.F4).
- В коде реализован простой антидребезг — после обнаружения нажатия цикл ждёт отпускания кнопки, чтобы не отправлять повторно сигнал при удержании.
Настройка своих макросов
Чтобы назначить другую команду, замените Keycode.ONE в соответствующей ветке на нужный код. Полный список кодов доступен в документации CircuitPython.
Примеры:
- Одиночное сочетание: Keycode.SPACE
- Модификатор + клавиша: (Keycode.CONTROL, Keycode.C)
- Открытие приложения (сочетание Win+R → ввод команды) можно симулировать как серию нажатий или делать локально скрипт, вызываемый сочетанием.
Тестирование
- Откройте простой текстовый редактор и нажимайте кнопки — должны печататься назначенные символы.
- Если клавиши не реагируют, проверьте подключение 3.3V и правильность назначения GPIO в коде.
Шаг 3: назначение макросов в программах
Назначение горячих клавиш в OBS
- Откройте OBS → Settings → Hotkeys.
- Выберите действие (например, Start Recording) и кликните поле ввода.
- Нажмите нужную кнопку на макропанели — в поле появится сочетание.
- Сохраните настройки и проверьте вживую.
Идеи для макросов
- Управление сценами и источниками в OBS.
- «Паник-кнопка» для моментального скрытия окон (минимизация).
- Быстрый запуск часто используемых приложений (браузер, чат, панель голосового чата).
- Команды для редакторов: инструмент лезвия в DaVinci Resolve, изменение размера кисти в Photoshop.
- Управление медиаплеером: play/pause, mute.
Тонкие настройки и расширения
Добавление RGB-подсветки
- Можно добавить адресуемую RGB-полосу (WS2812) и управлять светом из CircuitPython через библиотеку adafruit_dotstar или neopixel. Для этого понадобится выделить один дополнительный GPIO для данных и назначить питание 5V/3.3V в зависимости от ленты.
Добавление OLED-экрана
- OLED 128x64 на шине I2C позволит показывать надписи на экране сверху каждой кнопки или статус стрима.
- На Pico подключите SDA/SCL к соответствующим контактам и используйте библиотеку adafruit_ssd1306.
USB-HID и безопасность
- Устройство выступает как USB-клавиатура — это удобно, но будьте осторожны и тестируйте макросы в безопасной среде, чтобы не отправить случайно вредные команды.
Отладка и устранение проблем
Чеклист перед началом отладки
- Проверка питания: не подаётся ли на плату неправильное напряжение.
- Проверка пайки на замыкания и холодные контакты.
- Проверка назначения GPIO в коде и фактических подключений.
- Наличие библиотек в папке lib на CIRCUITPY.
Типичные проблемы и решения
- Кнопки печатают неверные символы: проверьте сопоставление GPIO → кнопка в code.py.
- Ничего не печатается: убедитесь, что CIRCUITPY видна в системе и файл code.py корректно загружен; проверьте, не перегружен ли Pico неправильным .UF2.
- Дребезг кнопок: увеличьте задержку в коде или примите программную фильтрацию на 30–50 мс.
Критерии приёмки
- Все 9 кнопок корректно отправляют назначенные комбинации клавиш.
- После перезагрузки Pico устройство корректно определяется как CIRCUITPY, и code.py автоматически исполняется.
- Корпус надёжно закрыт, острые припойные точки не торчат.
Роли и контроль качества
Роль: Стример
- Проверить макросы для сцен в OBS, назначить отдельную кнопку для «включить/выключить микрофон».
- Отрепетировать в тестовом стриме.
Роль: Видеоредактор
- Назначить кнопки для часто используемых инструментов в редакторе.
- Проверить комфорт расположения клавиш и отклик переключателей.
Роль: Разработчик/ Техник
- Проверить корректность пайки, целостность шлейфа питания и отсутствие подтёков припоя.
- Написать резервную копию code.py и README с назначением пинов.
SOP — стандартная последовательность сборки
- Подготовить корпус и переключатели.
- Припаяйте провода к каждому переключателю, пометьте цвета.
- Соедините общий провод и припаивайте “красные” провода к Pico по схеме.
- Установите CircuitPython и скопируйте проект на CIRCUITPY.
- Проверьте в текстовом редакторе, назначьте макросы в OBS.
- Соберите корпус и зафиксируйте винтами.
Тестовые случаи и приёмка
- Нажать каждую кнопку по очереди и убедиться, что в тексте появляется соответствующий символ.
- В OBS назначить кнопку для Start/Stop записи и проверить переключение.
- Подержать кнопку 5 секунд — убедиться, что повторные посылки не происходят чаще, чем ожидается.
Когда такой подход не подходит
- Если вам нужен экранный интерфейс с динамическими изображениями (например, иконки, меняющиеся в реальном времени), лучше рассмотреть покупной Stream Deck с OLED-подсветкой или дисплеями на каждом ключе.
- Если требуется гарантия и сертифицированная безопасность, коммерческий продукт может быть предпочтительнее.
Сравнение с готовыми решениями
- Домашняя сборка: низкая цена, гибкость, возможность кастомизации. Требует навыков пайки и обслуживания.
- Коммерческий Stream Deck: готовый маркетплейс плагинов, простой софт и поддержка. Выше стоимость.
Обслуживание и апгрейды
- Регулярно проверяйте пайку и разъёмы на предмет ослабления.
- Делайте резервную копию code.py и списка макросов.
- При желании добавляйте OLED или RGB, улучшайте устойчивость корпуса.
Безопасность и конфиденциальность
- Устройство действует как клавиатура — храните копию кода на случай, если потребуется переустановить прошивку.
- Если используете публичные сборки с GitHub, проверяйте код на присутствие нежелательных команд.
Вывод
Макропанель на базе Raspberry Pi Pico — недорогой и гибкий способ получить функциональность, схожую со Stream Deck. Проект можно усложнить: добавить OLED-индикацию, RGB-подсветку, больше кнопок или интеграцию с сетью. Главное — соблюдать безопасность при пайке и тестировании.
Краткая памятка
- Начните с простейшей реализации: 9 кнопок, отправка цифр 1–9.
- Проверьте пайку и соответствие выводов.
- Используйте CircuitPython и готовые библиотеки для ускорения разработки.
Приятного творчества: собрав свою панель, вы получите не только инструмент, но и опыт, который пригодится в дальнейших DIY-проектах.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента