先日書いたとおり、Raspberry Pi Zero 2を使ったDDC/CIコントローラを作ったのでその手順などを紹介する。
購入したアイテム

- 右上: Raspberry Pi Zero 2 WH (スイッチサイエンス, 3,938円)
- 中央上: Raspberry Pi Zero 2用のアルミケース(千石電商, 200円)
- 左上: 5V/3A microBオスACアダプター(秋月電子 1,100円)
- 左下: USB OTGケーブル microB-A(秋月電子 250円)・USBケーブル A-C (100円)
- 中央下: SanDisc microSD 64GB(あきばお~ 1,600円)
- 右下: Koolertron マクロキーボード(Amazon 3,480円)
合計でだいたい1万円ほどになった。中古を混ぜればもうちょっと安く済んだかもしれない。マクロパッドはアリエクで探せば1500円とかそのへんもあったのだが安全そうなものを選んだ。
やること
- Raspberry PiからHDMIケーブル経由でDDC/CIのコマンドを送れるようにする
- マクロキーボードの入力でDDC/CIコマンドを送るようにする
Raspberry Piのセットアップ
はじめてRaspberry Piを買ったけど、Zeroはめちゃくちゃ小さい。フリスクケースに入るらしい。

千石電商で200円で売られてたケースをつけたらこんな感じ。とりあえず基盤を守ることはできそうなのでよしとする。

OSのほうは何も変わったことはしていない。Raspberry Pi Imagerの指示に従っていれていけば終わる。SSH有効化とWi−Fi設定を最初からイメージに書いておくことでセットアップがかなり楽だった。

SDカードにイメージを焼き終わったらRaspberry Pi Zero 2に差し込んで、電源も繋いだらしばらく待ってSSHでログインする。

ログインできたらI2Cの有効化と、ddcutilとtriggerhappyのインストールをおこなう。
# 1. I2Cインターフェースを有効化
sudo raspi-config nonint do_i2c 0
# 2. パッケージリスト更新とツールインストール
sudo apt update && sudo apt install -y ddcutil triggerhappy
# 3. I2Cモジュールのロード
sudo modprobe i2c-dev
ここまで終わったら、モニター(M27P6)のHDMIポートとRaspberry Pi Zero 2のmini HDMIポートを繋いで、ddcutil detect コマンドを使いモニターを検出できるかを確かめる。Display 1が検出されたら成功。

マクロキーボードのセットアップ

今回買ったKoolertronのキーボードはWebブラウザで設定ができるので、PCにType-Cケーブルで繋ぎ、Chromeで https://www.sdcx-tech.com/ にアクセスする。(Firefoxではダメだった)
思ってた以上に設定UIはちゃんとしていて、日本語化も怪しいところはあるが意味はわかる。デフォルトだとよくわからないキー割当になっているので、左上から順にF13〜F21を割り当てた。既存のキーボードショートカットと競合しなければなんでもいい。


設定が終わったらRaspberry PiのmicroBポートにOTGケーブルを挿して、そこにType A-Cケーブルをつなげてマクロキーボードを接続するだけ。
キー入力でDDC/CIコマンド送信
最後はキー入力を監視して好きなコマンドを実行できるtriggerhappyを使って、それぞれのキーにddcutilのコマンドを割り当てる。
まずtriggerhappyの設定ファイルを作成する。
sudo touch /etc/triggerhappy/triggers.d/monitor.conf
設定ファイルの中身は次のような感じ。M27P6の場合、HDMI1とHDMI2で数値が逆転しているのに注意。
# --- ノブ操作(F19, F20, F21) ---
# ノブ左回転 (F19) -> 輝度ダウン (-5)
KEY_F19 1 /usr/bin/ddcutil setvcp 10 - 5
# ノブ右回転 (F20) -> 輝度アップ (+5)
KEY_F20 1 /usr/bin/ddcutil setvcp 10 + 5
# ノブ押し込み (F21) -> 輝度リセット (50%)
KEY_F21 1 /usr/bin/ddcutil setvcp 10 50
# --- キー操作(F13 〜 F18) ---
# [上段 左] F13: Mac (USB-C)
KEY_F13 1 /usr/bin/ddcutil setvcp 60 15
# [上段 中] F14: Windows (DisplayPort)
KEY_F14 1 /usr/bin/ddcutil setvcp 60 16
# [上段 右] F15: Game (HDMI 2)
KEY_F15 1 /usr/bin/ddcutil setvcp 60 18
# [下段 左] F16: RasPi (HDMI 1)
KEY_F16 1 /usr/bin/ddcutil setvcp 60 11
# [下段 中] F17: Night Mode (輝度 MIN)
KEY_F17 1 /usr/bin/ddcutil setvcp 10 0
# [下段 右] F18: Day Mode (輝度 MAX)
KEY_F18 1 /usr/bin/ddcutil setvcp 10 100
設定ができたらtriggerhappy のデーモンを再起動して反映したらOK。
sudo systemctl restart triggerhappy
完成
マクロキーボードのキーを押すだけでモニターの映像がMac→Windows→Switch2→RasPiと切り替わっている。モニターの裏まで手を伸ばしてスティック操作する手間がなくなってかなりいい感じ。
ケースをモニターの裏に隠したり、ケーブルを隠したりやることはまだあるが、PoCとしては成功ということでよさそう。しばらく使って問題が起きないことを祈る。