Elgato が新しい Stream Deck Pedal を発表したとき、メーカー界は「おい、もっと安く作れるぞ」と声を揃えました。そして、その雄叫びとともに、私たちは頼りになるRaspberry Pi Pico (私たちの場合はAdafruit の KB2040 ) を手に取り、スイッチの箱から取り出して独自の代替品を作りました。
ElgatoのStream Deck Pedalは、配信中にアクションをトリガーするための3ペダルコントローラーです。ギターエフェクトペダル用の高耐久性スイッチ3つと、AdafruitのCircuitPythonを搭載したRaspberry Pi Picoを使って、この機能をエミュレートします。CircuitPythonを使えば、USBキーボードを作成し、キーストロークや、さらには1つのボタンに複数のキーを同時に押すシーケンス全体を割り当てることができます。
Pico Pedal を組み立ててコーディングしたら、それを OBS で使用する方法を学習し、次のストリームの準備をします。
このプロジェクトに必要なものは
- ラズベリーパイ ピコ
- 3 x モーメンタリーギターエフェクトペダルプッシュボタン
- アルミプロジェクトボックス(6 x 4 x 3.5インチ)
- 4 x オス-オスジャンパーワイヤー
- ハーフブレッドボード
- ネジ端子(オプション)
- はんだ付け装置と熱収縮または圧着端子
- 電動ドリルと段付きドリルビット
ピコペダルの組み立て
このプロジェクトの回路は非常にシンプルです。3つのGPIOピン(2、3、4)と共通のグランド(GND)接続を使用します。ボタンを2、3、4ピンに接続し、各ボタンをPicoの異なるGNDピンに接続します。すべてのGNDピンは1つのGNDに接続され、共通の基準点を形成します。
配線と筐体の準備
詳細に入る前に、安全について少し触れておきます。はんだ付けは習得する価値のある素晴らしい技術ですが、適切な保護眼鏡を着用し、換気の良い場所で作業するようにしてください。プラスチックや金属に穴を開けると、「切りくず」や糸くず、ドリルで穴を開けた部分の破片などが出ます。保護眼鏡を着用し、ドリルを始める前に自分の位置をよく確認してください。筐体がしっかりと固定されていることを確認し、大きな穴を開ける前に必ず下穴を開けてください。
ギターペダルでよく使われるモーメンタリータイプのフットスイッチを使用することにしました。踏み込み式なので、耐久性が最も高いと考えられます。配線はシンプルです。極性はなく、押すと接続されます。このプロジェクトでは、スイッチの片側をGPIOピンに接続し、Picoの内部抵抗によってハイレベルにプルダウンします。もう片側はグラウンド(GND)に接続されています。ボタンを押すと、両側が接続され、GPIOピンがローレベルにプルダウンされてキー入力がトリガーされます。
はんだ付けの代わりに、圧着端子という方法を選択しました。圧着端子は、はんだ付けをせずに摩擦力を利用して電線を固定する方法です。圧着端子は電線をプラスチック製のスリーブの中に固定します。スリーブの中には金属端子があります。工具を使って圧着端子を押さえると、電線が固定されます。そして、圧着端子をスイッチの接点に差し込みます。圧着端子ははんだ付けよりも早く簡単に接続できますが、コストがかかります。
Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。
これらのスイッチは適切な筐体に固定する必要があります。通常はプラスチック製の筐体を使用しますが、高額な費用をかけない限り、薄っぺらなプラスチック製の筐体しか手に入らないでしょう。頑丈なABS樹脂製の筐体は10ドル程度で手に入りますが、今回は工業的で頑丈なフットスイッチの外観に合うように、アルミニウム製の筐体を選択しました。
1.筐体の蓋の3点を測り、それぞれに下穴を開けます。ケースの中心を起点として、中心から両方向に5cmずつ測りました。後から考えてみると、もっと外側、例えば7cmほど測って、直線ではなく点の集合体である三角形を作ればよかったと思います。
2.エンクロージャの側面に移動し、USB リード用の別のパイロット穴を開けます。
3.ドリルビットを大きめに交換し、すべての穴を拡大します。これを数回繰り返してから、次の作業に進みます。
4.段付きドリルビットに交換し、蓋の3つの穴をフットスイッチボタンの直径に合わせて拡大します。今回は12mmのスイッチを使用していたので、ドリルビットの段差をテープで目印にしました。
5.やすりを使って穴の鋭い部分を取り除きます。
6.段付きドリルビットを使用して、残りのパイロット穴を拡大し、USB リード線の最小端のサイズに合わせます。
7.穴の角を削り、鋭利な角を取り除きます。USBケーブルは穴に擦れて損傷する可能性があるため、この作業は重要です。
8.適切なUSBケーブルを穴に通し、Picoに接続して、大きな結び目を作ります。この結び目によって、USBケーブルが誤って抜けてしまうリスクを軽減できます。
9.回路図に従ってボタンのワイヤをネジ端子に固定します。
これで、3つのボタンすべてがネジ端子を介してRaspberry Pi Picoに接続されているはずです。コードがテストされるまで蓋を閉じないでください。
CircuitPythonとライブラリをインストールする
CircuitPythonのインストールは非常に簡単で、Adafruitにはインストール方法に関する素晴らしいガイドが用意されています。Adafruitの指示に従って最新バージョンをインストールしてください。
Raspberry Pi Picoがファイルマネージャーにドライブとして表示されます。ドライブ名はCIRCUITPYで、そこには一連のファイルとフォルダがあります。今はlibに注目しましょう。ライブラリが詰まったZIPファイルをダウンロードし、プロジェクトに必要なファイルをインストールする必要があります 。
1. CircuitPython サイトから最新のライブラリ バンドルをダウンロードします。
2.ファイルをデスクトップに抽出します。
3.抽出したファイルからadafruit_hid フォルダをCIRCUITPY ドライブの lib フォルダにコピーします。
ピコペダルのコーディング
1. CIRCUITPY ドライブのルートにあるcode.py ファイルを任意のエディターで開きます。
2.ファイル内のすべてのコードを削除します。
3. GPIOアクセスを有効にするために、2つのライブラリをインポートします。1つ目はボードライブラリで、GPIOピンに接続するための基本的な手段を提供します。2つ目はピンの状態を制御する手段を提供します。
import board
from digitalio import DigitalInOut, Direction, Pull
4. USレイアウトのUSBキーボードとキーストロークをエミュレートするための4つのライブラリをインポートします。USB HID(ヒューマンインターフェースデバイス)ライブラリは、Picoをキーボードとして動作させるのに役立ちます。残りのライブラリは、キーボードをUSレイアウトに設定し、キーコードを使用してキーストロークを送信するように設定します。
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
from adafruit_hid.keycode import Keycode
5.最後にtimeライブラリをインポートします。このライブラリはコードに一時停止を追加するために使用します。これにより、誤ってキーを2回押してしまうリスク(デバウンス)を軽減できます。
import time
6. USB HID として機能するキーボード オブジェクトを作成します。
keyboard = Keyboard(usb_hid.devices)
7.レイアウトを「US」に設定します。
keyboard_layout = KeyboardLayoutUS(keyboard)
8.ペダルの最初のボタンを表す新しいオブジェクト「one」を作成します。このボタンはPicoのピン2に接続されます。
one = DigitalInOut(board.GP2)
9. 1 つのオブジェクトを使用して、ピンを入力として設定し、内部抵抗をプルアップして、ピンが 3.3 V でハイ (オン) になるようにします。
one.direction = Direction.INPUT
one.pull = Pull.UP
10. 2つ目の入力に対しても同じ手順を繰り返します。今回は変数をピン3に接続します。
two = DigitalInOut(board.GP3)
two.direction = Direction.INPUT
two.pull = Pull.UP
11.ピン 4 に接続された 3 番目の入力に対して、もう一度繰り返します。
three = DigitalInOut(board.GP4)
three.direction = Direction.INPUT
three.pull = Pull.UP
12.コードの一時停止時間を格納する変数delay を作成します。変数を使用すると、要件に応じて時間を簡単に調整できます。
delay = 0.5
13.コードを継続的に実行するためのループを作成します。
while True:
14.ボタン1の状態を確認する条件付きテストを作成します。ボタン1が押された場合、ボタンはGPIOピン2(True / HIGH)をグラウンド(GND)に接続し、状態をFalse / LOWに変更します。
if one.value == False:
15.ボタンの押下が登録されたことを示すprint文を追加します。これはデバッグ手順なので省略できますが、コードが押下を登録していることを証明するためには、デバッグすべき項目が1つ減るので便利です。
print("Button 1")
16.一連のキー入力を送信します。今回の例ではCtrl + Alt + Aを使用しましたが、任意のキーに変更できます。Adafruitには必要なキーのリストがすべて用意されています。
keyboard.send(Keycode.CONTROL, Keycode.ALT, Keycode.A)
17.キーを放します。遅延なくこれを行うことで、キーの組み合わせを1回のキー押下に制限できます。
keyboard.release_all()
18.複数回のキー押下の可能性を減らすために遅延を追加します。
time.sleep(delay)
19. 2 番目のボタンに対しても同じ手順を繰り返します。
elif two.value == False: print("Button 2") keyboard.send(Keycode.CONTROL, Keycode.ALT, Keycode.B) keyboard.release_all() time.sleep(delay)
20. 3 番目のボタンに対しても同じ手順を繰り返します。
elif three.value == False: print("Button 3") keyboard.send(Keycode.CONTROL, Keycode.ALT, Keycode.C) keyboard.release_all() time.sleep(delay)
21.ループを繰り返す前に、少し遅延させて「ボタンの押下を待機しています」と表示するelse条件を追加します。else条件は、ボタンが押されていない場合に実行されます。
else: print("Waiting for button press") time.sleep(0.1)
コードをRaspberry Pi Picoに保存すると、CircuitPythonがリロードしてコードを実行します。ケースはまだ閉じないでください!
OBSでPicoペダルを使用する
Open Broadcaster Software (OBS) は、優れた無料ストリーミングツールです。OBSを使えば、YouTube、Twitch、その他多くのプラットフォームにライブ配信できます。また、動画を録画して後で編集することも可能です。OBSはシーン機能を使用して、様々なカメラアングル、スクリーンキャスト、その他の動画入力を作成できます。
毎週配信しているRaspberry Pi番組「The Pi Cast」では、いくつかのシーンを使用しています。フロントカメラ用のシーン、プロジェクトを披露するためのオーバーヘッドカメラ用のシーン、そして画像やデータシートを流し込むためのシーンです。シーンを切り替えるには、ショートカットキーで切り替えられるようにキーパッドをプログラムしています。Pico Pedalも同様に使用できます。シーンにホットキーを設定するには、事前にシーンを作成しておく必要があります。
1. OBS を開き、右下にある [設定] に移動します。
2.ホットキーをクリックします。
3.ホットキーを追加したいシーンまでスクロールダウンします。この例では「顔」を選択します。
4.シーンに切り替えるための黒いボックスをクリックします。
5.ペダル上で、シーンに割り当てたいボタンを押します。OBSが更新され、ボタンが押されたことが示されます。
6. 「適用」と「OK」をクリックしてホットキーを保存します。
7.残りの 2 つのボタンについてもこの手順を繰り返します。
これでペダルのボタンがOBSにマッピングされ、次の配信の準備が整いました。キーボードに触れることなく、スムーズにシーン間を移動できます。
完全なコードリスト
import board
from digitalio import DigitalInOut, Direction, Pull
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
from adafruit_hid.keycode import Keycode
import time keyboard = Keyboard(usb_hid.devices)
keyboard_layout = KeyboardLayoutUS(keyboard) one = DigitalInOut(board.GP2)
one.direction = Direction.INPUT
one.pull = Pull.UP two = DigitalInOut(board.GP3)
two.direction = Direction.INPUT
two.pull = Pull.UP three = DigitalInOut(board.GP4)
three.direction = Direction.INPUT
three.pull = Pull.UP delay = 0.5 while True: if one.value == False: print("Button 1") keyboard.send(Keycode.CONTROL, Keycode.ALT, Keycode.A) keyboard.release_all() time.sleep(delay) elif two.value == False: print("Button 2") keyboard.send(Keycode.CONTROL, Keycode.ALT, Keycode.B) keyboard.release_all() time.sleep(delay) elif three.value == False: print("Button 3") keyboard.send(Keycode.CONTROL, Keycode.ALT, Keycode.C) keyboard.release_all() time.sleep(delay) else: print("Waiting for button press") time.sleep(0.1)