2021年1月2日土曜日

モニターの入力切替が超絶使いにくいので物理的に解決した話

1 背景

自宅でPHILIPS 328P6VUBREB/11っていうモニターを使ってます。31.5inch 4Kとしては安いし結構重宝しているんですけど、まあとりあえず様々なレビュー見るとですね、


USB-C ドック搭載液晶モニター 328P6VUBREB/11 | Philips

本体操作用のタッチスイッチは、反応する部分の間隔が狭いと感じます。中々思ったように操作できないです。

本体下部のボタンがタッチ式のため、指をずらして押したいボタンを探すことができず、目視で押すボタンを見つける必要がある。暗いところでは扱いにくいばかりではなく、いちど画面から目を離す必要がありストレスとなる。頻繁に使う接続の切り替えだけでも素早くできるとありがたい。また、ボタンから指を離すときにも、タッチがあったと判定されることがよくある。

メニュー操作のタッチセンサーボタンは、慣れても使い勝手が悪いです、「入力切換」だけでも是非普通のボタンスイッチを希望します。

操作ボタン(物理ボタンか、リモコン希望)過敏すぎる

操作スイッチがタッチスイッチなので使いにくいです


Amazon | PHILIPS モニター ディスプレイ 328P6VUBREB/11 (31.5インチ/「Display HDR 600」認証/HDMI/USB Type-C/4K/5年保証) | Philips(フィリップス) | ディスプレイ 通販

操作性が悪すぎて入力切り替えやHDRの切り替えにも苦痛レベル この操作性で満足できるのは操作ボタン触らない人だけだろう あと右下の前面と下面がタッチセンサーになってるからマウスのケーブルが触れただけで反応するからたちが悪い

ディスプレー自体の各種設定が画面枠下部のタッチ式になっており、これがとても使いにくい。

設定ボタンは既出の通り、操作しずらいです。

皆さん言ってますが画面のスイッチが反応良すぎてとても使いにくい。 ボタンの境がわかりやすければもう少しマシなんでしょうけど、どこ押して反応してるのかわからない。

・操作性が悪い。タッチなのでどこを押せばいいのかわかりづらい。反応が遅いのかタッチに失敗したのかわかりづらい。ただ、操作することはほとんどないのでそこまで気になりません。

・メニュー操作、タッチパネルでも多分問題ないだろうと買ったけど、凄くやりずらい。

ほかのレビューでもあったと思いますが、物理ボタンがないことにより想像以上に画面右下での操作がしづらかったです。 特に私の使用環境では複数の入力をモニタで切り替えて運用しており、また夜は暗い中で操作することもあるため、同じような運用をされる方はリモコンがついている物を選んだ方がよいかもしれません。

タッチセンサーの問題もあるが、入力信号が出ていないと判断するのが早すぎるようで入力切替が一度で決まることが殆どない。HDMIとUSBーCの切り替え操作をあの忌まわしいタッチセンサー操作で数回行ってやっと切り替わるのでストレス溜まります。


とまあこんな感じで、とにかくタッチ式のスイッチが使いにくい。またレビューであまり触れられてないですが、普段は過敏なくせにたまに反応しなかったり、逆に過敏すぎて勝手に連打したことになったりして、入力切替の時はよく目的の入力を誤って指定してしまうことがあるのだけど、切り替わるのに3秒強かかるのはしょうがないとしても、切り替わった後に謎の5秒強の無敵時間(操作受付拒否時間)があるので1回ミスるだけで計10秒くらい待たされるのが一番ストレス。入力受付復活までの間はイライラしながらスイッチ連打してるし、高橋名人なら160発くらい撃ち込みしてる。

噂のあいつ

ってことで入力切替なんとかしなきゃってなりました。

2 入力切替方法案

2.1 HDMI CEC

昔、子供がすぐテレビの真ん前にかじりついて見はじめるので目に悪そうということでRaspberry Piと超音波距離センサを使って1m以内に近寄ったらテレビの電源を切って、離れたらまた電源を入れるというのを作ったことがあります。そのときはHDMI CECを使ってテレビの電源の制御を行ったので今回もそれでいけるかなと。一番最初に試そうとしたのがこれでだいぶ前なので詳細を覚えていないけど、そもそもPC用モニターでは動かなかったか、任意の入力切替はできなかったかで早々に没になった気がする。

ちなみに近づいたらテレビの電源を切るやつは、子供は結構面白がってわざと近づいたり遠ざかったりして遊んでいたので本来の目的外でそれなりの役目は果たしたけど、邪魔だったので既にご退場いただきました。寝室で普段使わないテレビとはいえ↓こんな感じだったので… センサ間はもう少し離した方がカバー範囲が広くていいけどまとまってた方が持ち運びしやすかったので密集してる。

近寄ったら消すぞ!

2.2 リレータッチボード

人間がやるから誤操作する。ならば人間を排除操作を機械にやらせようということで↓のような製品を使うことも考えました。

リレータッチボード(ドライバ有り) - スイッチサイエンス

これがこのモニタのタッチスイッチでうまくいくかはわからないけど、そもそも現在の入力と切り替え先の入力によってスイッチを押す回数が変わったりと処理が状態に依存するけど状態を取得するのは困難なのでせいぜいタッチスイッチの操作を目視で確認しながら指で直接の代わりにリレー経由でやるくらいにしかならなそうなので没 (少し長く触れてしまって連打状態になっちゃうとかを防止できるくらいはできそうという期待はあるけど)。

2.3 DDC/CI

仕方ないのでモニター関連で色々調べてみるとVESA標準のDisplay Data Channel Command Interface (DDC/CI) というのでホストからモニタにコマンドが送れることが分かりました。また登録は必要だけどVESAのサイトからドキュメントがダウンロードできるのもいいですね ( https://vesa.org/vesa-standards/ )。そしてそのコマンドについて規定している別のVESA標準であるMonitor Control Command Set (MCCS)のドキュメントを見ると Input Select というそのもののコマンドが定義されていました(p.81, Table 8-13: Miscellaneous Functions VCP Codes, Code 60h)。

また自分でプロトコルから実装しなくてもddcutil っていうCLIで使えるツールがaptでインストールできるし、これは余裕で勝てる、…ってこの時はまだ思ってました。

3 立ちはだかるRaspberry Pi Zero / 4の問題

早速 ddcutil を実行してみると…

$ ddcutil detect
No displays found

うん、これが「スンッ」ってやつか…

どうもddcutilのissue 「ddcutil not working on Raspberry Pi 4 ・ Issue #97 ・ rockowitz/ddcutil」 を見てみると、Raspberry Pi 4側の既知の問題(ユーザ空間からDDC/CIで使われている/dev/i2c-2にアクセスできない)で動かないらしい。 今回はまずはRaspberry Pi Zeroで動かしたけどZeroでも4でも同じ結果になったので多分同じ現象っぽい。

Rasberry Piの方でもissue 「RPi4 I2C HDMI interface (/dev/i2c-2) not working from userspace ・ Issue #3152 ・ raspberrypi/linux」 が立っていて、そのissueにHDMIケーブルを改造すれば行けるよっていう コメント がありました。DDCで使っているI2C関連のラインだけをHDMIケーブルから分離してRaspberry Piの汎用のI2Cのピンに接続して制御しようという力こそパワー感あふれるソリューションだった。しかし面倒そうだし手は出さずにしばらくこのissueをウォッチしてたけど結局一向にRaspberry Pi側の改修がされる様子がなかったのでしばらく経ってからようやくケーブル改造することにした (現在はその後の同issueの様子を見ると改修が大体完了したっぽい)。

3.1 HDMIケーブル改造

まずはHDMIケーブルの調達。Raspberry Pi 4がMini HDMI、Raspberry Pi ZeroがMicro HDMIとコネクタが異なる点と、コネクタが小さいと加工が大変なことから通常のHDMIのを購入。安さと失敗したときの再調達のしやすさの観点から↓のAmazonベーシックのにした。

Amazon | Amazonベーシック ハイスピードHDMIケーブル - 3.0m (タイプAオス - タイプAオス) | Amazonベーシック(AmazonBasics) | HDMIケーブル

このHDMIケーブルが思った以上に頑丈(下記の完成版ではいじってないけど特にコネクタ部分)&精緻で調査&加工にはだいぶ苦労しました。 テスターでちまちま調べたところ、このケーブルの場合は下記のような割当でした。内部の配線の色には決まりがないらしいのであくまでもこのケーブルの場合はこうだったという程度の参考情報です。太字の部分がDDCに関わる部分で本来のHDMIケーブルから分離してRaspberry PiのI2C関連のピンに接続する線です。

Pin # Signal Amazon cable color
1 TMDS Data2+ メタリックゴールド内?
2 TMDS Data2 Shield メタリックゴールド内?
3 TMDS Data2- メタリックゴールド内?
4 TMDS Data1+ メタリックブルー内?
5 TMDS Data1 Shield メタリックブルー内?
6 TMDS Data1- メタリックブルー内?
7 TMDS Data0+ メタリックシルバー内?
8 TMDS Data0 Shield メタリックシルバー内?
9 TMDS Data0- メタリックシルバー内?
10 TMDS Clock+ メタリックグリーン内?
11 TMDS Clock Shield メタリックグリーン内?
12 TMDS Clock- メタリックグリーン内?
13 CEC
14 - Reserved (HDMI 1.0-1.3a)
- Utility/HEAC+ (HDMI 1.4+, optional,HDMI Ethernet Channel and Audio Return Channel)
メタリックピンク内の白
15 SCL (I2C serial clock for DDC)
16 SDA (I2C serial data for DDC)
17 Ground (for DDC, CEC, ARC, and HEC) メタリックピンク内のベアケーブル
18 +5 V (min. 0.055 A)[3]
19 - Hot Plug Detect (all versions)
- HEAC- (HDMI 1.4+, optional, HDMI Ethernet Channel and Audio Return Channel)
メタリックピンク内の青

PinとSignalの対応は↓から引用。

HDMI - Wikipedia

実際の作業の様子は下記のような感じ。

ひん剥いて
ぶった切って
電圧変換して
接続する

よしこれで完璧! やってみると、

$ i2cdetect -l
i2c-1   i2c             bcm2835 (i2c@7e804000)                  I2C adapter

$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- 37 -- -- 3a -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- 49 4a -- -- -- -- --
50: 50 -- -- -- 54 -- -- -- -- 59 -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

$ ddcutil detect
Display 1
   I2C bus:             /dev/i2c-1
   EDID synopsis:
      Mfg id:           PHL
      Model:            PHL 328P6VU
      Serial number:    Unspecified
      Manufacture year: 2019
      EDID version:     1.3
   VCP version:         3.0

これは行ける!

$ ddcutil getvcp 0x60
VCP code 0x60 (Input Source                  ): Unsupported feature code (DDC NULL Message)
$ ddcutil setvcp 0x60 0x12
Invalid hex value

なんでよ…

4 さらば ddcutil、ようこそddcci

Raspberry Pi 4/Zeroの問題なのか、モニターの問題なのか、ddcutilの問題なのかよくわからなかったので、切り分けのために他の実装がないか探してみたら、 ddcci というのを見つけた。

$ ddcci-tool -r 0x60 /dev/i2c-1
ddcci-tool version 0.03

Using ddc/ci : 0x37@/dev/i2c-1

Reading 0x60(Input Source Select)
Control 0x60: +/15/8206 [Input Source Select]

こいつ…動くぞ! ちゃんとDisplayPort-1を表す 15 (0x0f) が得られている。

$ ddcci-tool -r 0x60 -w 0x12 /dev/i2c-1
ddcci-tool version 0.03

Using ddc/ci : 0x37@/dev/i2c-1

Writing 0x60(Input Source Select), 0x12(18)
Control 0x60: +/18/8206 [Input Source Select]

$ ddcci-tool -r 0x60 /dev/i2c-1
ddcci-tool version 0.03

Using ddc/ci : 0x37@/dev/i2c-1

Reading 0x60(Input Source Select)
Control 0x60: +/18/8206 [Input Source Select]

ちゃんとHDMI-2を表す 18 (0x12) に画面も切り替わりました。 よし、これでddcutilの問題っぽいことが分かったので調査しよう、 …と思ったけどddcciはシンプルでわかりやすいし、今回の目的の範囲では機能も十分なのでこのままでいい気がしました。 ということであとは物理スイッチをつけるだけ。

5 物理スイッチ

今回のモニターは4つの入力ソースを受け付けるので↓の薄膜パネルスイッチを使うことにしました。

★特売品★薄膜パネルスイッチ - aitendo

薄膜パネルスイッチ

マニュアルとかデータシートとかは特に見当たらなかったけどどうも配線がスイッチの順番とだいぶ違うように見えたので適当にテスターでちまちま配線を調べる。調べた結果は下記の通り。

  • aitendoの商品写真とは違ってパネルに数字は書いてない。 でもちょうど数字の向きとは上下逆に使おうと思うのでこれはこれでよし。
  • ここでは前述のとおり上下逆に使うので、ケーブルを下側、パネルを表側にする。
    • スイッチ部を左から、sw1,sw2,sw3,sw4とする (下記のfritzingの配線図上の数字とは逆順)

    • このときケーブル部の配線は左から、sw2, sw1, sw4, sw3, 共通(GND)となっていた

    • ピッチはRaspberry Piのピンと同一なのでそのままコネクタ毎挿せるようにGPIOが4つ連続になっているところを使うと、ピン番号やGPIO番号との対応表は下記のような感じ

      line_no role pin_no gpio_no
      1 sw2 31 6
      2 sw1 33 13
      3 sw4 35 19
      4 sw3 37 26
      5 gnd 39 -

後から気づいたけど実はこのスイッチの裏面は両面テープになってて剥離紙を剥がしたら配線が露わになりました。そして配線とスイッチの謎の順番になるほどって顔になりました。

ご納得

全体の配線図は以下の通り。 図上でHDMIケーブルの線が繋がれていないピンについてはRaspberry Pi ZeroのMini HDMIコネクタにそのまま接続。

配線図

あとはこれに従って簡単なプログラムを書いて完成。 ddcci版のプログラムはこれ

完成!快適! モニターのタッチパネルでの操作の時と違って切り替えた後の5秒強の無敵時間もないので次々に切り替えられるのがいい。

6 おかえり ddcutil

ということで目的は達成できたのでしばらくこの構成で使っていましたが、ddcutilが動かなかった件が気になったのでちょっと調査をしてみた。 詳細はissue 「getvcp/setvcp 0x60 failed with Philips 328P6VUBREB/11 ・ Issue #162 ・ rockowitz/ddcutil」 で報告したのでそっちを参照してもらうとして、結論から言うとこのPhilipsのモニターが本来とは異なるVCP(MCCS)のバージョンをホスト側に回答してくるため、バージョンに応じて適切に処理を行おうとしていたddcutilがうまく動かないという感じでした。報告後、あっという間に作者の人が対応方法を実装してくれたので無事動くようになった。

対応もしてもらったし、ddcutilは下記のような利点があるのでプログラムをddcutil向けに修正した。

  • 現在もアクティブに開発中
  • 機能も充実
  • ドキュメントも充実
  • ライセンスも明記
  • Raspberry Piのaptリポジトリからインストール可 (今回は最新版が必要なのでgithubのをコンパイルしているけど)

ddcutil版に修正したプログラムはこれ

7 設置

モニターのベゼルにつけてもいい気がするけどより手元に近いデスクにパネルスイッチを設置して完了。超快適。

最終形
机の下

2020年中にまとめようと思ってたけど気づいたら年明けてたし、休みもあっという間に終わりそう。