やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Raspberry Pi 4B に HDMIケーブル A-D + 変換キャップ type A-C でディスプレイ表示する

 やっとできた。

ハードウェア

  • Raspberry Pi 4B
    • 電源 5V 3.0A
    • SDカードスロット
      • SDカード(32GB)
    • USB 3.0
      • HDDケース
        • HDD 2.5inch
    • HDMI type D
      • HDMI ケーブル D-A
        • HDMI 変換キャップ A-C
          • ディスプレイ HDMI type C

ソフトウェア

 ディスプレイに表示された! (写真は割愛)

 ただし解像度がおかしかったため、以下のように修正した。(/boot/config.txtで設定したはずなのに……)

解像度の修正

  1. システムメニュー
  2. 設定
  3. Screen Configuration (なぜかVNC越しでは表示されなかった)

 ダイアログが出るので以下のように操作する。

  1. メニュー
  2. Configure
  3. Screens
  4. HDMI-1
  5. 解像度
  6. 1920x1080(ディスプレイに合わせたサイズにすること)

f:id:ytyaru:20191205101834p:plain

 するとHDMI-1の設定が現れるので、念の為クリックして最前面に表示する。

f:id:ytyaru:20191205101840p:plain

 最後にこれを適用する。

  1. メニュー
  2. Configure
  3. 適用

f:id:ytyaru:20191205101919p:plain

 一瞬まっくらになった後、指定した解像度で表示された。成功!

/boot/config.txt

/boot/config.txt

# For more options and information see
# http://rpf.io/configtxt
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
#disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
#hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on

# Uncomment this to enable infrared communication.
#dtoverlay=gpio-ir,gpio_pin=17
#dtoverlay=gpio-ir-tx,gpio_pin=18

# Additional overlays and parameters are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

# 2019-11-29
program_usb_boot_mode=1
program_usb_boot_timeout=1

[pi3]
# 2018-09-22 cocopar 13.3inch 16:9 Display
max_usb_current=1
hdmi_group=2
hdmi_mode=82
hdmi_cvt 1920 1080 60 6 0 0 0
gpu_mem=256
# 2018-09-21 Elecrow Display start
# 古いディスプレイ(1024x768まで対応)だとブートしなくなる。(ディスプレイが暗い状態でチカチカするのを無限ループする)その場合はコメントアウトする。
#max_usb_current=1
#hdmi_group=2
#hdmi_mode=1
#hdmi_mode=82
#hdmi_cvt 1920 1080 60 6 0 0 0
#hdmi_drive=2

[pi3+]
# 2018-09-22 cocopar 13.3inch 16:9 Display
max_usb_current=1
hdmi_group=2
hdmi_mode=82
hdmi_cvt 1920 1080 60 6 0 0 0
gpu_mem=256
# 2018-09-21 Elecrow Display start
# 古いディスプレイ(1024x768まで対応)だとブートしなくなる。(ディスプレイが暗い状態でチカチカするのを無限ループする)その場合はコメントアウトする。
#max_usb_current=1
#hdmi_group=2
#hdmi_mode=1
#hdmi_mode=82
#hdmi_cvt 1920 1080 60 6 0 0 0
#hdmi_drive=2

[pi4]
hdmi_safe=1
hdmi_force_hotplug=1

# Enable DRM VC4 V3D driver on top of the dispmanx display stack
dtoverlay=vc4-fkms-v3d
max_framebuffers=2

# 2019-11-29
[HDMI:0]
# 2018-09-22 cocopar 13.3inch 16:9 Display
  max_usb_current=1
  hdmi_group=2
  hdmi_mode=82
  hdmi_cvt 1920 1080 60 6 0 0 0
  gpu_mem=256
  program_usb_boot_mode=1
  program_usb_boot_timeout=1

# 2019-11-29
[HDMI:1]
# 2018-09-21 Elecrow Display start
# 古いディスプレイ(1024x768まで対応)だとブートしなくなる。(ディスプレイが暗い状態でチカチカするのを無限ループする)その場合はコメントアウトする。
  max_usb_current=1
  hdmi_group=2
  hdmi_mode=1
  hdmi_mode=82
  hdmi_cvt 1920 1080 60 6 0 0 0
  hdmi_drive=2
  program_usb_boot_mode=1
  program_usb_boot_timeout=1

[all]
#dtoverlay=vc4-fkms-v3d

 念の為Pi3B, Pi3B+の設定も追記した。

 Pi3B, Pi3B+のときと比べてPi4Bには以下も追記した。ないとディスプレイが「信号なし」となって映らなかった。もしかしたらhdmi_safe=1だけでいいかも。

hdmi_safe=1
hdmi_force_hotplug=1

 設定はデフォルト状態に対して以下を参考に追記したもの。

 hdmi_mode, hdmi_mode, hdmi_cvt, hdmi_driveなどは各ディスプレイ購入時メーカに問合せて教えてもらった値。わからないときはURL先をよく読むとよい。調べ方まで書いてある。

 設定ファイルを見ての通り、以下のように1920x1080の解像度に指定していたはず。なのに初回起動時は設定されていなかった。原因不明。

[pi4]
[HDMI:0]
  hdmi_cvt 1920 1080 60 6 0 0 0

問題

消える解像度の設定

 なぜか再起動すると解像度の設定が消えていた……。

 つまり再起動するたびに設定し直さねばならない……。これはひどい。原因不明。/boot/config.txtも反映されていないし。もうHDMI関係はダメダメ。

不明なHDMIポート関係

 HDMIポートの表示や関係性が謎。私の環境ではそれぞれのデバイスでHDMIポートが以下のように番号付けされていた。

Pi4B ディスプレイ
HDMI 0 HDMI 1
HDMI 1 HDMI 2

 これらの関係がわからない。多分これらの番号を一致させる必要はないと思う。

 ちなみに今回ケーブル接続しているポートの組合せは以下。

Pi4B ディスプレイ
HDMI 0 HDMI 2

番号の違い

 番号は0から始めるか1から始めるかの違いによって値が変わっている。それ自体が紛らわしくて統一して欲しいところだが、まだ我慢できる。

関係

 じつはポート同士が特定の組合せでないとダメだったりする? 例えば以下みたいに。

是非 Pi4B ディスプレイ
HDMI 0 HDMI 1
HDMI 1 HDMI 2
HDMI 0 HDMI 1
HDMI 1 HDMI 2

 多分そんな必要は無いと思っている。

 ただし、Pi4BがHDMIディスプレイを1台だけアクティブにする場合、HDMI 0を使う必要があるようだ。HDMI 1だと問題あるらしい。以下参照。

 なので、Pi4B側のHDMIポートは0にケーブルを挿している。ディスプレイ側にそんな制限はないと思っているので、適当にHDMI 1 でなくHDMI 2 に挿している。

設定が指しているのはどっち?

/boot/config.txt

[pi4]
[HDMI:0]
  hdmi_cvt 1920 1080 60 6 0 0 0
[HDMI:1]
  hdmi_cvt 1920 1080 60 6 0 0 0

 0, 1の番号割当はPi4Bの基盤に書いてあるものと一致する。なので/boot/config.txtでは基盤の位置におけるHDMIポートに対する設定だと思っている。

Screen Configuration

 解像度の修正にて修正したときの画面キャプチャをよく見ると、1,2という番号割当だった。これはPi4B基盤でなくディスプレイの番号割当と一致する。

f:id:ytyaru:20191205101840p:plain

 え、もしかして、こっちはディスプレイのポート番号に対する設定なの?

 そう思って、HDMI 2の設定を見てみら以下。

f:id:ytyaru:20191206094946p:plain

 ちょ、1920x1080がないんですけど? HDMI 1のときは以下のようにたくさん選択肢があったのに、なぜ?

f:id:ytyaru:20191205101834p:plain

 そもそも、HDMI 1の設定を1920x1080にしたら実際にディスプレイの解像度があがった。なので、私はそれで設定できたと思っている。

一体どっちなの?

 それぞれの根拠は以下。

  • Screen ConfigureにおけるHDMI 1を設定すべきと言えるときの根拠
    • 実際にディスプレイの解像度があがった(デスクトップ画像が細かく小さく広く表示された)
  • Screen ConfigureにおけるHDMI 2を設定すべきと言えるときの根拠
    • ディスプレイ上に表示されるポート番号とScreen Configureダイアログに表示されるポート番号が一致している

 実際の解像度が変わったことこそ正しさの証だと考える。ポート番号も、基盤は0始りで、Screen Configure1始りと考えれば、一致している。

 よって「Pi4B基盤HDMI 0使用のときはScreen ConfigureにおけるHDMI 1を設定すべき」ということでいいはず。(ディスプレイ側のポート番号は無関係、のはず)

 それなのに再起動後には設定が消えてしまう。たぶんそれとこれとは別件、だと思う。自信はない。私の設定ミスなのか、Raspbianのバグなのか。

 つまり、私の予想では以下のような対応だと思っている。

HardSoft
Pi4BDisplay/boot/config.txtScreen Configuration
0101
1212

VNCログインURL

 Pi4BへVNCログインするときのURLでもポート番号が必要になる。

 Pi3B+からPi4BへSSHログインする。

ssh Pi4Bのユーザ名@Pi4BのIP
ssh pi@192.168.11.10

 SSHログインした端末にてVNCサーバを起動する。

vncserver -randr=ディスプレイの解像度
vncserver -randr=1920x1080

 このとき以下のようにIPアドレスの後ろにHDMIポート番号らしき番号:1が表示される。VNC Viewerでログインするときはその番号まで含めないとログインできない。

...
New desktop is raspberrypi:1 (192.168.11.10:1)

 さらに、以下コマンドをもう一度やると、今度は:2となる。

vncserver -randr=1920x1080
...
New desktop is raspberrypi:1 (192.168.11.10:2)

 なので、VNCではポート番号を1から数える方式だと思っている。それが確かならHDMIポート番号の対応表は以下になる。

HardSoft
Pi4BDisplay/boot/config.txtScreen ConfigurationVNC
01011
12122

謎のフリーズ

 なんか作業中、勝手にフリーズした。タスクバーのアイコンなどが☓印になったり、デスクトップ画像が消えて白くなったりした。

 仕方ないので再起動したら、以下のような状態だった。

  1. ブート時、画面左上にラズベリーパイ画像が4つ表示されるとき、解像度は超低い(たぶん640x480くらい?)
  2. ブート後、デスクトップは1920x1080っぽい

 あれ、解像度の設定が生きている? うまくいったっぽい。

 たぶんRaspbian Busterはまだバグだらけと思われる……。

/boot/config.txt調整(黒枠の排除)

disable_overscan=1

 以下を追記した。

hdmi_ignore_edid=0xa5000080
disable_overscan=1
設定 意味
hdmi_ignore_edid=0xa5000080 ディスプレイから送信される設定を無視する
disable_overscan=1 ディスプレイ外枠に黒いのが表示されるのを無視

 以下の箇所に。

[pi4]
hdmi_safe=1
hdmi_force_hotplug=1
hdmi_ignore_edid=0xa5000080
disable_overscan=1
...

 再起動。しかしデスクトップの外枠四方に黒枠が表示されてしまう。そのせいでディスプレイより一回り小さく表示されてしまう。でも、大体1920x1080の解像度になっていると思う。

hdmi_safe=1の消去

 黒枠が出る原因はhdmi_safe=1かもしれない。video.mdによるとhdmi_safe=1にすると以下のような設定をしたのと同じらしい。

hdmi_force_hotplug=1
hdmi_ignore_edid=0xa5000080
config_hdmi_boost=4
hdmi_group=2
hdmi_mode=4
disable_overscan=0
overscan_left=24
overscan_right=24
overscan_top=24
overscan_bottom=24

 このうち以下の部分が無駄な黒枠と思われる。

disable_overscan=0
overscan_left=24
overscan_right=24
overscan_top=24
overscan_bottom=24

 その後にdisable_overscan=1としているわけだが、黒枠が出てしまっていた。一旦設定した後にdisableにしてもダメなのだろうか?

 なら、必要なものと不要なものを選別して以下のようにしてみる。

[pi4]
hdmi_force_hotplug=1
hdmi_ignore_edid=0xa5000080
disable_overscan=1
...

 再起動。ブート時のラズパイ画像からして高解像度で表示された。デスクトップも黒枠がなくなった上、1920x1080の解像度になった。

 ついに成功!

所感

 やっとPi4Bにおける最低限のハードウェア動作確認ができた!

 あとはソフトウェア的な問題だけだと思う。システム更新を待つなり有志の仕事を待つなりしてゆっくりやろう(他力本願)。ハードウェアの致命的な初期不良はなさそうで、とりあえず一安心。

 とはいってもGPIO、I2C、BlueTooth、PoEについては未確認だが。

 いつかすべての手順をキレイにまとめたい。

前回まで

 ハード。

 ソフト。

 設定。

 企業。