お知らせ:この記事はJLCPCBの提供でお送りしています。

先日「HDMI切り替え機を改造してWiFi対応にしてみた」で紹介した、JLCPCBで製造したプリント基板とM5Stamp C3Uを組み合わせて作ったWiFi対応HDMI切り替え機を操作するためのコントローラーを作りました。

システムの全体構成

まずはWiFi対応HDMI切り替え機を含む、私の現在のディスプレイ周りの構成を紹介したいと思います。WiFi対応HDMI切り替え機を作った後、いろいろと試行錯誤した結果、

  • ノートPCはHDMI切り替え機に直結
  • メインマシンはEDIDエミュレータを介してHDMI切り替え機に接続

という構成に落ち着きました。EDIDエミュレータというのは、ディスプレイがつながっていない状態でも、PCからはディスプレイがつながっているかのように認識されるようにするための装置です。HDMIにはEDID(Extended Display Identification Data)という仕組みがあり、この仕組みによってディスプレイ側がPC側に対応している解像度やリフレッシュレートを伝達しています。

当然ながら、HDMIの信号が切り離された状態になるとEDIDの通信もできなくなります。この時、PCはディスプレイが切り離されたことを検知して、そのディスプレイへの出力を停止します。単に映像の出力が止まるだけであればいいのですが、マルチディスプレイ環境で片側のディスプレイだけを切り離すと、Windowsの場合はもう一方のディスプレイに、切り離されたディスプレイに表示されていたウインドウ寄せるような動作をします。1私のように、すぐまた入力ソースを切り替えてディスプレイを再接続する人にとっては、ちょっと不便な仕様です。さらにその動作の際に余計なアニメーションが入り、これがまたうっとうしいのです。というわけで、HDMI切り替え機を使ってディスプレイを切り離した状態でも、ディスプレイがつながったままかのようにPCを認識させることで、このうっとうしい動作を回避することにしました。

この構成が確定して、常用できそうなことが分かったタイミングでHDMI切り替え機を机の下に追いやることができたのはよかったのですが、HDMI切り替え機の操作をどうするかという問題が残っていました。WiFi対応でREST(風) APIを生やしているので、ブラウザから特定のURLにアクセスしてやることで入力ソースを切り替えることはできるのですが、都度都度そのためにだけにブラウザからアクセスするのは面倒にもほどがあります。この状況を何とかすべく、HDMI切り替え機を操作するためのコントローラーを作ろうと決めたのでした。

M5Stack Core2でサクッと作成

今回のコントローラーは手元にあったM5Stack Core2を使って作りました。WiFi対応HDMI切り替え機の操作をするためのコントローラーなので、WiFiに対応している環境で作る必要があったこと、切り替え操作のための入力インタフェースがあること、そして程よいサイズ感であることから、こちらをチョイスしました。初代のM5Stack Basicも何台か手元にあるのですが、今後他のデバイスの操作もここにまとめていくことを考えると、タッチパネルでUIのカスタマイズがしやすそうなCore2を採用しました。

ファームウェアはArduino環境にM5Stack用のライブラリをインストールした環境で開発しました。現状のものをGistに置いておきます。現状はWiFiClientのExampleを下敷きに改造したような構成になっています。一応、通信とUIは別々のスレッドにして、メールボックスでボタン押下イベントを伝達するような実装にしました。

実装上のハマりどころとして、M5Stack公式のドキュメントが古いのか、

  • ExampleではTouchButtonクラスとなっているところはButtonクラスとする必要があった
  • addHandlerメソッドで設定するイベント種別名も微妙に違う(”TE_RELEASE”が”E_RELEASE”、というように先頭の”T”が削除されていた)ので書き換える必要があった

という点がありました。それ以外はそこまで苦戦することもなく、HDMI切り替え機と通信させることができました。

まとめ

今回はWiFi対応HDMI切り替え機を連携して使うためのコントローラーをM5Stack Core2で作成しました。今回はM5Stackを使いましたが、#makepcba 第2回でも紹介したような自作キーボードでフルカスタムコントローラーを作ってみるのも面白いかもしれません。

  1. Windows 11では挙動を少しいじれるようになりましたが、私の使い方ではいまいちです…
公開日:2022/10/31