Raspberry Pi の HDMI コンソール出力をダッシュボード用にカスタマイズ

Raspberry Pi 4 で Minecraft サーバが作成できたので、Minecraft 大会を開催しました。
そこで使う、e-Sports の簡単なダッシュボードを作ってみました。

![IMG_20200606_152428.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c12f0ca1-ad95-a010-0dd2-a64db7779112.jpeg)

大会では Zoom で音声／カメラを共有しながら Minecraft をプレイします。

1台の Zoom クライアントのカメラ入力として、4台の HDMI 出力を合成しています。

- ローカル会場でのプレイ画面1
- ローカル会場でのプレイ画面2
- イベントタイトル ( 今回は connpass イベントサイトの表示 )
- Raspberry Pi サーバのコンソール出力

HDMI の合成およびカメラ入力を行う処理は、外部機器を使ってハードウェア的に行っています。

# 画面合成

合成用に使用するデバイス : HDMI4入力1出力画面分割切替器 (EHD-606Y ELEVIEW) 

![IMG_20200606_230952.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fa857c37-7475-f018-1ae5-dd971692f800.jpeg)

これで合成したものは以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b36d68d2-b0b7-24aa-4360-f8ccd97696f6.png)



カメラ入力用に使用するデバイス : HDMIビデオキャプチャー (ShuOne-323)
![IMG_20200606_230817.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fa677bdf-48b7-eff9-a2da-ab296480f70d.jpeg)

これを使うことで、Zoom のカメラ入力として使うことができます。Zoom のカメラのピン留めを工夫して、表題のような画面を得ることができます。

# 画面の解像度

ローカル会場でプレイしているマシンも、配信を行っているマシンもゲーミングPCなどではぜんぜんなく、リースアップ中古PCのX230。
https://www.facebook.com/yoshimasa.kawano.52/posts/2988796321189793

解像度も720p(1366x768)のものを4in1している。画面分割切替器ELEVIEW EHD-606Y は1080p対応しているが、4分割した1画面は960x540になり、更に HDMIビデオキャプチャー ShuOne-323 経由で Zoom カメラとして扱うと解像度は更に半分ぐらいに落ちる感じ。

![IMG_20200606_125137.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2e444cc0-dd56-4cc5-a2aa-7a8f8637918a.jpeg)


ゲーム画面やWebブラウザの画面はなんとなくわかるけれども、Raspberry Pi のコンソール出力は工夫する必要があった。

# RaspberyPi コンソール出力の調整

環境 

- 2020-02-13-raspbian-buster-lite
- Raspberry Pi 4 Model B/4GB

## 解像度の調整

最初は Raspberry Pi の config.txt を設定して320x200ぐらいに画面解像度を設定すればいいかなと思ったけれど、そううまくはいかなかった。


画面分割切替器ELEVIEW EHD-606Y は 入力を 720p ないし 1080pに変換しているぽく、ある程度ならスケーリングしてくれるがあまり低い解像度だと額縁表示になってしまう。

いくつか試してみた中では額縁表示にならない最低解像度は 1280x768 60 Hz でした。

その設定をするには、config.txt に以下のように設定します。

```

hdmi_group=2
hdmi_mode=23

```

この値は、
https://elinux.org/RPiconfig
の
「These values are valid if hdmi_group=2 (DMT)」
に掲載されています。
「These values are valid if hdmi_group=1 (CEA)」ではないので注意。

## 文字サイズを調整

上で設定した解像度は720p なので、文字が潰れてしまいます。それに対処するために、コンソールの文字サイズを変更します。

/etc/default/console-setup を編集し、

```

FONTFACE="Terminus"
FONTSIZE="32x16"  
```
を追加します

これで 1280x768 において 80x24文字表示となります。
480x288解像度での12ドットフォントを使っての80x24文字表示に相当しますので、Zoomカメラ入力経由してもなんとか雰囲気で読めるようになります。

## その他の細々した設定

### HDMIに常に出力するようにします。

オペレーションミスを防ぐため、HDMI出力を常にONにしておきます。

/boot/config.txt

```

 hdmi_force_hotplug=1
```
念の為に、オーディオ出力もHDMIに設定しておきます。

```

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

```

### スクリーンOFFの抑制

Raspberry Pi の RASPBIAN LITE はほったらかしておくと表示が消えるのだったかな？？
何か設定して抑制した気もするが忘れてしまった・・・

### 自動ログインの設定

RaspberryPiにはキーボードを繋がずに ssh で操作します。しかしながら HDMI コンソール出力を得るためにログインしないといけないので

raspi-config 
の boot の項目で自動ログインの設定をします。                                                                         

###  screen セッションを自動起動する

ssh で操作している内容を HDMI コンソール出力で表示するために、物理コンソール上で screen セッションを自動起動する設定を .bashrc に記述しています。

screenインストール
```
$ sudo apt install screen
```

以下を ~/.bashrc の最後に追加します。

```
TTY=$(tty)
if [ $SHLVL = 1 ];then
  if [ "${TTY}" = "/dev/tty1" ]; then
    screen -S hogehoge
  fi 
fi
```

単に screen と書くと screen ログイン時に再度 screen を呼んで無限ループになるため、$SHLVLを参照して最初のシェル起動のみ有効になるようにしています。
また、コンソールの自動起動時にのみ適用出るように、 /dev/pts/0 を使っているかどうかの判定をしています。

また、以下のスクリプトを /etc/rc.local に書かれている以下のスクリプトは IP アドレスを画面表示するためのものですが、 screen 起動で表示が消えてしまうので .bachrc の最後に書いておきます。
```

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi


```