Постройте собственный Stream Deck на Raspberry Pi Pico

Если вы только начали стримить на Twitch или хотите ускорить рабочие процессы, вы, вероятно, видели Elgato Stream Deck и похожие устройства. Они удобны для переключения сцен в OBS, отправки сообщений в соцсети или управления чатом. Но фирменные устройства часто дорогие.
Хорошая новость: вы можете сделать похожий контроллер примерно за долю стоимости, используя недорогой микроконтроллер Raspberry Pi Pico и несколько механических переключателей. Эта статья объясняет: что такое макро-пэд, какие детали нужны, как паять и подключать, как установить CircuitPython и как назначать макросы для OBS и других программ.
Что такое макро-пэд

Макро-пэд — это панель из кнопок, каждая из которых отправляет заранее запрограммированное действие или комбинацию клавиш. Удобный пример: вместо нажатия Ctrl+C на клавиатуре вы можете нажать одну кнопку на макро-пэде, и устройство отправит сочетание клавиш за вас. С таким контроллером можно запускать/останавливать стрим, переключать сцены, управлять ПК и приложениями.
Главное преимущество самостоятельной сборки: вы получаете устройство с нужным вам набором кнопок и возможностью кастомизации — например, добавить RGB-индикацию или OLED-дисплей — при гораздо меньших затратах, чем у коммерческих аналогов.
Что потребуется

Список деталей и инструментов (локализация и пояснения):
- 1× Raspberry Pi Pico (микроконтроллер на RP2040).
- 9× механических переключателей Gateron (обычно MX-совместимые).
- 9× крышек (keycaps) под переключатели.
- Паяльник и паяльная станция.
- Олово для пайки.
- 4× винта M3 × 16 мм для крепления корпуса.
- Провода 20 AWG (примерно 0,6 мм²), около 60 см суммарно.
- Съёмник изоляции (стружка) или бокорезы.
- Компьютер для программирования Pico (Windows/macOS/Linux).
- Корпус: 3D-печатный, покупной или вырезанный/собранный вручную.
- Кабель USB‑C (или micro‑USB, в зависимости от платы/кабеля).
Если у вас есть 3D‑принтер, вы можете напечатать корпус и даже некоторые крепления самостоятельно. В противном случае корпуса легко заказать онлайн.
Важно: пайка требует аккуратности. Паяльник может нагреваться до ~450 °C; соблюдайте технику безопасности и используйте защиту глаз и вытяжку.
Важно: Если вы не уверены в пайке или работе с электроникой, попросите помощника с опытом.
Краткая схема проекта и рабочий процесс

Общая последовательность работ:
- Установить и припаять переключатели в корпусе.
- Сформировать общую шину земли/питания (в статье используется общая «черная» шина).
- Припаять сигнальные провода переключателей к соответствующим GPIO на Pico.
- Установить CircuitPython, загрузить необходимые библиотеки и готовый код.
- Протестировать кнопки, собрать корпус и закрепить винтами.
- Настроить горячие клавиши в OBS и других приложениях.
Подробные шаги
Шаг 1: монтаж и пайка переключателей
Начните с установки переключателей в верхнюю часть корпуса. Зафиксируйте их и подготовьте контакты для пайки (припайте на каждую ножку по короткому отрезку провода). Для удобства используйте два цвета провода: красный — «сигнал», черный — «общая шина».

Далее соберите «черную» шину в последовательность: соединяйте землю (черные провода) от первого переключателя к второму и т. д., пока не останется один длинный общий чёрный провод. Красные провода будут пущены к разным GPIO Pico — по одному на каждый переключатель.

Подключите красные провода к выбранным GPIO пинам Pico. В этой сборке использованы конкретные пины — запомните их порядок, он важен для кода.

Затем подключите общий чёрный провод к выводу 3.3V OUT (на Raspberry Pi Pico это обозначено как 3V3) — он будет обеспечивать подтяжку/питание, когда Pico подключён к компьютеру. Убедитесь, что используете именно выход 3.3V, а не вывод EN (Enable).

После пайки проводов и проверки механики — вы сделали самую трудную часть.
Советы по пайке и надёжности:
- Делайте аккуратные короткие провода между соседними переключателями — это уменьшит помехи.
- Используйте термоусадку или горячий клей в местах соединений для механической фиксации.
- Проверяйте контакты мультиметром (континуитет) перед подключением питания.
Шаг 2: установка CircuitPython и загрузка кода

- Скачайте последнюю версию CircuitPython для Raspberry Pi Pico с официального сайта Adafruit (.UF2 файл).
- Скачайте проект Novaspirit (PiPicoMacroKeys) или используйте предоставленный далее код.
- Скачайте редактор Mu или используйте Thonny — любой редактор, который поддерживает CircuitPython.
Процедура установки CircuitPython:
- Удерживайте кнопку Bootsel на Pico и подключите плату к компьютеру через micro‑USB/USB‑C. Должно появиться устройство RPI-RP2.
- Перетяните файл .UF2 на это устройство. После копирования плата перезагрузится и появится как CIRCUITPY.
- В корневой каталог CIRCUITPY скопируйте папку lib и файл code.py из проекта (или вставьте свой код).
Откройте code.py в Mu/Thonny и замените содержимое на следующий рабочий пример. Этот файл настроен на 9 кнопок и будет отправлять цифровые значения 1–9 при нажатии.
# Originally coded by Novaspirit Tech
# Copy this code into your code.py file.
import time
import usb_hid
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard import Keyboard
import board
import digitalio
# These are the corresponding GPIOs on the Pi Pico
# that you soldered
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
btn1 = digitalio.DigitalInOut(btn1_pin)
btn1.direction = digitalio.Direction.INPUT
btn1.pull = digitalio.Pull.DOWN
btn2 = digitalio.DigitalInOut(btn2_pin)
btn2.direction = digitalio.Direction.INPUT
btn2.pull = digitalio.Pull.DOWN
btn3 = digitalio.DigitalInOut(btn3_pin)
btn3.direction = digitalio.Direction.INPUT
btn3.pull = digitalio.Pull.DOWN
btn4 = digitalio.DigitalInOut(btn4_pin)
btn4.direction = digitalio.Direction.INPUT
btn4.pull = digitalio.Pull.DOWN
btn5 = digitalio.DigitalInOut(btn5_pin)
btn5.direction = digitalio.Direction.INPUT
btn5.pull = digitalio.Pull.DOWN
btn6 = digitalio.DigitalInOut(btn6_pin)
btn6.direction = digitalio.Direction.INPUT
btn6.pull = digitalio.Pull.DOWN
btn7 = digitalio.DigitalInOut(btn7_pin)
btn7.direction = digitalio.Direction.INPUT
btn7.pull = digitalio.Pull.DOWN
btn8 = digitalio.DigitalInOut(btn8_pin)
btn8.direction = digitalio.Direction.INPUT
btn8.pull = digitalio.Pull.DOWN
btn9 = digitalio.DigitalInOut(btn9_pin)
btn9.direction = digitalio.Direction.INPUT
btn9.pull = digitalio.Pull.DOWN
keyboard = Keyboard(usb_hid.devices)
# below are the key values that you can change to
# fit your preferences. Change Keycode.ONE for example to
# (Keycode.CONTROL, Keycode.F4) for CTRL + F4
# on the first button.
# See the official CircuitPython docs
# for additional help
while True:
if btn1.value:
keyboard.send(Keycode.ONE)
time.sleep(0.1)
if btn2.value:
keyboard.send(Keycode.FOUR)
time.sleep(0.1)
if btn3.value:
keyboard.send(Keycode.SEVEN)
time.sleep(0.1)
if btn4.value:
keyboard.send(Keycode.TWO)
time.sleep(0.1)
if btn5.value:
keyboard.send(Keycode.FIVE)
time.sleep(0.1)
if btn6.value:
keyboard.send(Keycode.EIGHT)
time.sleep(0.1)
if btn7.value:
keyboard.send(Keycode.THREE)
time.sleep(0.1)
if btn8.value:
keyboard.send(Keycode.SIX)
time.sleep(0.1)
if btn9.value:
keyboard.send(Keycode.NINE)
time.sleep(0.1)
time.sleep(0.1)
Пояснения к коду (коротко):
- import usb_hid, adafruit_hid.* — обеспечивают работу HID‑клавиатуры по USB.
- digitalio и board — позволяют читать состояние GPIO.
- Каждый btnX — это DigitalInOut с подтяжкой вниз (Pull.DOWN). При нажатии контакт замыкается и btn.value становится True.
- keyboard.send(Keycode.X) — отправляет одно или несколько нажатий клавиш. Можно использовать модификаторы: Keyboard.send(Keycode.CONTROL, Keycode.F4).
Советы по доработке кода:
- Добавьте антидребезг (debounce): при срабатывании кнопки ждите 30–50 мс и проверяйте повторное состояние.
- Для долгих нажатий и двухкнопочных комбинаций реализуйте таймеры и флаги в коде.
- Если нужно много макросов и логики — храните конфигурацию в отдельном файле на CIRCUITPY (например, config.json).
Шаг 3: тестирование и сборка

Откройте текстовый редактор и по очереди нажимайте кнопки — они должны вводить цифры 1–9. Если кнопки не срабатывают:
- проверьте пайку и контактность проводов;
- убедитесь, что CIRCUITPY содержит правильный code.py и lib;
- проверьте, что общий провод подключён к 3.3V OUT, а не к EN;
- используйте мультиметр для проверки питания и сигналов.
Если всё работает, отключите Pico и соберите корпус. Корпус можно зафиксировать защёлками или винтами M3.
Шаг 4: назначение макросов в приложениях (OBS пример)

В OBS: Settings → Hotkeys → выберите действие, кликните по полю и нажмите нужную кнопку на макро-пэде. Нажмите ОК для сохранения.
Советы по использованию с OBS и потоковыми программами:
- Настройте отдельные клавиши для «Start Streaming», «Stop Streaming», «Start Recording», «Switch Scene 1/2/…».
- Для сложных последовательностей используйте комбинации клавиш (например, ALT+SHIFT+S) или макрокоманду в коде Pico.
- Для приложений, которые не принимают чистые HID‑команды, используйте программное обеспечение-обёртку (например, AutoHotkey на Windows), которое поймает отправленную цифру и выполнит скрипт.
Дополнительные варианты и расширения
Это место, где DIY даёт преимущество. Ниже — идеи для улучшений и альтернатив:
- Альтернатива плате: Pro Micro (ATmega32u4) или Raspberry Pi RP2040 в другом исполнении.
- Использование QMK/VIAL на клавиатурных контроллерах для более гибкой прошивки.
- Добавление OLED экрана для подписи кнопок (I2C OLED 128×32).
- Подсветка RGB под каждой кнопкой (WS2812 или APA102 — потребует отдельного питания и транзисторов).
- Модуль энкодера (колесико) для прокрутки громкости или перехода сцен.
Совместимость и миграция:
- CircuitPython обеспечивает быструю разработку и простоту, но для продвинутых проектов QMK даёт больше контроля и эффективности.
- Если вы планируете использовать много RGB‑светодиодов, рассмотрите внешний источник питания и транзисторный драйвер, чтобы не перегружать 3.3V Pico.
Частые проблемы и способы их решения
- Кнопки «тапают» дважды: добавьте антидребезг (debounce), увеличьте задержку в коде или фильтруйте импульсы программно.
- Плата не определяется как CIRCUITPY: повторно установите .UF2, удерживая Bootsel.
- Программа не получает нажатия: убедитесь, что в коде используется adafruit_hid и Keyboard(usb_hid.devices).
Как кастомизировать макросы — практические примеры
Примеры назначений, которые ускоряют стрим- и рабочие сценарии:
- Кнопка 1: Начать/остановить запись (OBS hotkey «Start/Stop Recording»).
- Кнопка 2: Сцена «Начало стрима».
- Кнопка 3: Сцена «Игра».
- Кнопка 4: «Паник‑кнопка» — сворачивает все окна (Win+D на Windows).
- Кнопка 5: Быстрое открытие браузера (через AutoHotkey или сочетание клавиш).
- Кнопки для инструментов редактирования: смена размера кисти, лезвие в редакторе видео.
Примеры изменения кода для модификатора:
- Отправка CTRL+F4: keyboard.send(Keycode.CONTROL, Keycode.F4)
- Отправка ALT+TAB (для переключения окон): keyboard.send(Keycode.ALT, Keycode.TAB)
Мини-методология: как спроектировать макро-пэд для себя
- Определите сценарии использования: стрим, монтаж, офисная работа.
- Выберите количество кнопок: 6/9/12/15 в зависимости от сценариев.
- Разбейте задачи по приоритету: 1–3 для самых частых, 4–6 реже и т. д.
- Протестируйте прототип в виде бумажной схемы (расположение и размеры кнопок).
- Соберите первую версию, используйте в течение недели и корректируйте назначения.
Ролевые чеклисты
Чеклист сборщика (аппаратная часть):
- Провести ревизию деталей (Pico, переключатели, провода).
- Смонтировать переключатели в корпус.
- Припаять сигнальные провода и общую шину.
- Проверить пайки мультиметром.
- Подключить Pico и проверить питание.
Чеклист стримера (настройка ПО):
- Установить CircuitPython и нужные библиотеки.
- Загрузить code.py и протестировать кнопки.
- Настроить горячие клавиши в OBS/других приложениях.
- Проверить взаимодействие с дополнительным ПО (AutoHotkey, Stream Deck software).
Критерии приёмки
- Все 9 кнопок корректно распознаются и отправляют назначенные клавиши.
- Нет ложных срабатываний при тестировании (тест 100 нажатий — не более 1% сбоев).
- Корпус надёжно закрывается, провода не натягиваются.
- При подключении к целевой машине устройство определяется как клавиатура HID.
Замеры и ключевые параметры (факт-бокс)
- Количество кнопок: 9 (в примере).
- Питание: 3.3 V от Pico при подключении по USB.
- Интерфейс: USB HID — работает без драйверов как клавиатура.
Когда эта идея не подойдёт (контрпримеры)
- Если вам нужен полноцветный дисплей с программируемыми мини-иконками под каждой кнопкой и сложными скриптами — коммерческий Stream Deck или собственная плата с OLED будет проще.
- Если вам нужна полная безаппаратная интеграция с облаком и сетевыми API — устройство на USB/HID ограничено локальными действиями; придётся комбинировать его с программной прослойкой.
Руководство по откату и устранению проблем (runbook)
- Устройство не распознаётся: перепрошейте .UF2, удерживая Bootsel.
- Кнопки не срабатывают: проверить пайку и проводку, а затем код — убедиться, что назначенные GPn совпадают.
- Частые ложные срабатывания: добавить антидребезг в код, заменить переключатель или почистить контакты.
Таблица соответствия клавиш (шаблон для планирования)
| Номер кнопки | Назначение | Отправляемая комбинация |
|---|---|---|
| 1 | Start/Stop Recording | Keycode.CONTROL, Keycode.R |
| 2 | Scene — Intro | Keycode.F1 |
| 3 | Scene — Game | Keycode.F2 |
| 4 | Panic | Keycode.WINDOWS, Keycode.D |
| 5 | Open Browser | Keycode.CONTROL, Keycode.N |
| 6 | Mute Mic | Keycode.F8 |
| 7 | Next Scene | Keycode.PAGE_DOWN |
| 8 | Previous Scene | Keycode.PAGE_UP |
| 9 | Custom / Macro | Keycode.ALT, Keycode.F4 |
Вы можете сохранить эту таблицу как шаблон и заполнить под свои задачи.
Безопасность и соображения о конфиденциальности
- Устройство посылает симулированные нажатия клавиш — следите за тем, куда вы направляете эти действия (чтобы не закрыть важные окна или не отправить приватное сообщение).
- Нет необходимости передавать персональные данные на устройство; конфигурация может храниться локально на CIRCUITPY.
FAQ
Подойдёт ли другой микроконтроллер вместо Pico?
Да. Можно использовать Pro Micro (ATmega32u4) или другие контроллеры с поддержкой USB HID. CircuitPython удобен на Pico, но альтернативы дают свои преимущества.
Можно ли обойтись без пайки?
Да, существуют варианты на макетной плате с пружинными клеммами или перфорированной плате, но пайка даёт надежность.
Сколько стоит собрать такой макропэд?
Точные цены зависят от магазина и страны. Компоненты в целом стоят значительно дешевле фирменных Stream Deck’ов, особенно если у вас есть доступ к 3D‑печати.
Можно ли добавить экранчики под кнопки?
Да, можно разместить OLED или маленькие TFT-экраны, но это усложнит схему и код — потребуется управление экраном по I2C/SPI и дополнительные ресурсы микроконтроллера.
Краткое резюме
- Собрать макро-пэд на Raspberry Pi Pico можно бюджетно и достаточно быстро.
- Проект полезен как для стримеров, так и для людей, желающих ускорить рутинные операции.
- Основные шаги: пайка переключателей → установка CircuitPython → загрузка кода → тест → настройка горячих клавиш в приложениях.
Важно: всегда проверяйте пайку и используйте антидребезг в программном обеспечении. Проект легко масштабируется: больше кнопок, RGB, экран — всё зависит от ваших потребностей.
Удачной сборки и приятных стримов!
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone