こんにちは。ふろーです。
主題通りですが、Vibe codingでElgato StreamDeckと互換性があるハードウェアを開発してみました。
StreamDeckの開発者コミュニティは凄まじく、StreamDeck公式ソフトウェアのプラグインのみならずドライバを自作する人や、companionのようなプロダクション用途を想定した代替ソフトウェアも存在するほどです。
そのため、StreamDeckが利用するUSB HIDのプロトコルも大抵解析されており、非公式ドキュメントながらかなりの量のリソースが存在しています。
その中で、「公式ソフトウェアの代替が作れるのであれば、同じようにハードウェアも作れるんじゃないか?」と思いつき実践してみました。
技術情報
USB HIDを利用した非公式のドライバやデバイスは、自分が見つけた限りで以下のようなプロジェクトが存在しました。
対応状況はプロジェクトによって様々ですが、主要なハードウェアは大体カバーされています。
(StreamDeck Studioは高価だからかどれも対応しておらず悲しい…)
また、Aliexpressなどで販売している「配信者向けプログラマブルキーボード」と題されている製品について、StreamDeckと互換性がある製品が存在するとの情報もあります。マジかよ。
個人的な学習用途がメインですが、放送/配信プロダクションやスタジオ向けStreamDeck互換機として開発しているため、productiondeckと名付けました。
現在以下のレポジトリで開発を行っています。
ファームウェア
上記の既存プロジェクトやリソースを見ると、低レベルな操作が多いことからか、Rust製のプロジェクトが数多く見られました。
組み込み開発でRustといえばEmbassyが最有力候補だったため、Rust/Embassy/rp2040 を利用して開発することに決めました。
ファームウェア開発は主題通り、ほぼvibe codingです。
初期バージョンに限りC++で作成しましたが、Claude Code / Serena と相性が悪かったため、動作確認を実施する前にすぐRustに変更しました。
利用ツールとしては初期コードはClaude Code + Serenaを利用して記述し、途中でCursorに変更しました。
(余談ですが、Cursorは補完メインで使っていましたがちゃんと事前プロンプトを設定すればClaude Codeかそれ以上に便利で少し驚きました)
先述した通りRust+Embassyを利用しており、(軽く見た限りでは)C/C++のコードと比べて堅牢です。
またClaudeが想像以上にRustに強く、コンパイルエラーと他プロジェクトのコードを投げ続けていたら案外綺麗に実装できました。
USB HIDのトラフィックを理解する必要があったため、WiresharkのUSBPcapを利用してUSBHIDの通信を覗き見してCursorに投げまくったりしました(ここが結構つらかった)
現在の実装状況としては、StreamDeck Mini(初期版) のファームウェアのディスプレイ機能以外は実装出来ています。
ディスプレイはシンプルに配線が面倒だったので、まだ着手していません。
また、Claudeを利用したことによりかなり高速に開発が進みました。レポジトリを作成してからStreamDeckソフトウェアに認識されるまで実装するのに1日強で完了しています(すごすぎる)。
ハードウェア
以前に少しだけ開発した経験があったため、Raspberry Pi picoを選択しました。
安価でコストパフォーマンスが良い事、USB周りの処理が楽に出来そう(主観)だったこと、ディスプレイ/ボタン/USB というベーシックなパーツで実現出来そうだったのも理由です。
少し先の話にはなりそうですが、PIOを利用した高速な処理や、マルチコアでの高速動作が期待出来たのも大きかったです。
ただ、実装がある程度進んだあたりでM5Stackなどディスプレイを内蔵しているマイコンも選択肢ではあったなーと思っています。
Embassyを利用している以上コードはある程度流用出来ると思うので、いつかM5StackやSTM32系、Arduinoなどに移植するのも面白そうかなーと思っています。
現在は対応していませんが、StreamDeck PlusやStudioはロータリーエンコーダー(ダイアル) が内蔵されているため、将来的にこちらも対応したい気持ちでいます。
プロトコルの互換性
基本的にStreamDeckの公式ソフトウェアとの互換性を最優先に作成していますが、ソースコードが公開されていないため部分的にgithub.com/ryankurte/rust-streamdeck を利用しています。
ボタン処理に関しては、こちらの方が楽にデバッグが出来ました(最悪エラーが出てもソースコードを確認してプロンプトを投げれば良かったので…)
難点として、StreamDeck自体がプロダクト数が多く、通常のStreamDeckとStreamDeck V2で微妙にプロトコルが違ったり、MiniとRevised Miniという内部で綺麗に隠蔽されているバージョン違いのハードウェアが存在したため、デバッグには苦労しました。今後も互換性維持には苦労しそうです。
組み込み開発の開発がほとんど無かったため、C++でメモリ破壊におびえながらバイナリと睨めっこする覚悟でいたのですが、実態としてはClaudeにプロンプトを投げ続けるだけでほとんどの開発が完了し、Vibe codingの威力を大変実感しています。
十分な情報量があれば、組み込み開発でもVibe codingの威力は十分に発揮出来そうです。
現在はまだStreamDeck Miniのみの対応ですが、将来的にPedal, XLなど多様なStreamDeckのハードウェアに対応し、M5Stackなど別ハードウェアでの利用も行ってみたいですね。
殆ど知見が無い分野なので自信はないですが、PCBを利用した基板の作成や、筐体も作ってみたい気持ちです(先の話すぎる)
先日、StreamDeck公式よりVirtual StreamDeck(VSD)なる機能が公開されました。
これはStreamDeckハードウェアを接続していると利用出来るデスクトップ上で動作する仮想StreamDeckです。
個人的にはcompanionに存在した機能の実質的な逆輸入だと思っています。
companionとの違いとして、実際のプロダクトが接続されていないと利用が出来ないというのがありそうです。
余談ですが、このproductiondeckのファームウェアを書き込んだRaspberry Pi PicoはStreamDeck Miniだと認識されます。🤫
Views: 0