Raspberry Pi Zero WHにディスプレイを接続し、デスクトップ画面を表示する方法


# 購入した製品
すぐ届くということでAmazonで以下の製品を購入しました。

ラズパイ用 1.3インチ IPS液晶 - 240×240解像度/SPI接続/LCD HAT（ドライバ：ST7789）
https://www.amazon.co.jp/dp/B07KVMK2DZ

接続したらこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/e22d8a57-7af8-92fb-9805-20694857d1c3.png)


# 設定手順
`/etc/modules`ファイルに追記します。
ファイルの一番下に以下を追記してください。

```
spi-bcm2835
flexfb
fbtft_device
```

## ファイル作成
`/etc/modprobe.d/fbtft.conf`ファイルを作成します。
中身には以下2行を記載してください。

```
options fbtft_device name=flexfb gpios=reset:27,dc:25,cs:8,led:24 custom=1 height=240 width=240 rotate=180 speed=40000000 fps=60 bgr=1
options flexfb setaddrwin=0 width=240 height=240 init=-1,0x11,-2,120,-1,0x36,0x70,-1,0x3A,0x05,-1,0xB2,0x0C,0x0C,0x00,0x33,0x33,-1,0xB7,0x35,-1,0xBB,0x1A,-1,0xC0,0x2C,-1,0xC2,0x01,-1,0xC3,0x0B,-1,0xC4,0x20,-1,0xC6,0x0F,-1,0xD0,0xA4,0xA1,-1,0x21,-1,0xE0,0x00,0x19,0x1E,0x0A,0x09,0x15,0x3D,0x44,0x51,0x12,0x03,0x00,0x3F,0x3F,-1,0xE1,0x00,0x18,0x1E,0x0A,0x09,0x25,0x3F,0x43,0x52,0x33,0x03,0x00,0x3F,0x3F,-1,0x29,-3
```

マニュアルには以下が記載されていますが、これだと私の環境ではうまく動きませんでした。

```
options fbtft_device name=flexfb gpios=reset:27,dc:25,cs:8,led:24 speed=40000000 bgr=1 fps=60 custom=1 height=240 width=240
options flexfb setaddrwin=0 width=240 height=240 init=-1,0x11,-2,120,-1,0x36,0x70,-1,0x3A,0x05,-1,0xB2,0x0C,0x0C,0x00,0x33,0x33,-1,0xB7,0x35,-1,0xBB,0x1A,-1,0xC0,0x2C,-1,0xC2,0x01,-1,0xC3,0x0B,-1,0xC4,0x20,-1,0xC6,0x0F,-1,0xD0,0xA4,0xA1,-1,0x21,-1,0xE0,0x00,0x19,0x1E,0x0A,0x09,0x15,0x3D,0x44,0x51,0x12,0x03,0x00,0x3F,0x3F,-1,0xE1,0x00,0x18,0x1E,0x0A,0x09,0x25,0x3F,0x43,0x52,0x33,0x03,0x00,0x3F,0x3F,-1,0x29,-3
```

## SPIの有効化
```
sudo raspi-config
```

`5 Interfacing Option -> P4 SPI -> Yes`を選択

## 結果確認
`/dev`の中に、`fb1`というファイルができていたら成功です。

## ファイルの上書き
```
cd /dev
sudo cp -a fb0 fb1
```

## ツールのインストール
```
sudo apt-get install cmake git
```

## コードのダウンロード
```
cd ~
git clone https://github.com/tasanakorn/rpi-fbcp
cd rpi-fbcp/
mkdir build
cd build/
cmake ..
make
sudo install fbcp /usr/local/bin/fbcp
```

## 自動実行の設定
`/etc/rc.local`ファイルに追記します。
ミスったら起動しなくなるかもしれませんので要注意です。
修正点は最後から2行目に`fbcp &`を追加しました。

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

exit 0
```

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

fbcp &
exit 0
```

## ディスプレイ設定
`/boot/config.txt`に追記します。
以下を追記してください。

```
hdmi_force_hotplug=1
hdmi_cvt=720 720 60 1 0 0 0
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
display_rotate=1
```

マニュアルには`hdmi_cvt=300 300 60 1 0 0 0`と記載されています。
確かにこの設定だと文字は目視できるサイズですが、デスクトップ全体が表示されない可能性がありますので、720x720に変更しました。

## ラズパイの再起動
```
sudo reboot
```

これで画面にデスクトップ画面が表示されているはずです。

## 画面をスリープさせない設定
デフォルトでは数分で画面がスリープしてしまいますが、以下を設定することで画面が表示され続けます。

まず`/etc/xdg/lxsession/LXDE/autostart`に以下を追加します。

```
@xset s off
@xset s noblank
@xset -dpms
```

次に`/etc/lightdm/lightdm.conf`に以下を追記します。

```
[SeatDefaults]
xserver-command=X -s 0 -dpms
```

# トラブルシューティング
## ログイン・ログオフ時の文字だけ画面に表示されるが、デスクトップ画面が表示されない場合

GL Driverで変なものを選択している可能性があります。
（`sudo raspi-config -> 7 Advanced Options -> A7 GL Driver`で何か選んでいる可能性があります）
上記の設定をした場合は`/boot/config.txt`の最終行に1行追加されていると思いますので、その行を削除してrebootしてください。

# 参考URL
https://www.waveshare.com/wiki/1.3inch_LCD_HAT
https://www.waveshare.com/w/upload/6/6b/1.3inch_lcd_hat_user_manual_en.pdf
https://blog.goo.ne.jp/peki-k/e/e62456f9006e41753de574d38eddf63c

# 関連
Raspberry Pi Zero WHに接続した物理ボタン（LCD HAT）にキーバインドする方法
https://qiita.com/hanzawak/items/774214a608efe0a6ab86