HAVRMの空空活動誌

「空空」は「うつらうつら」と読むらしいです.まぁ常に寝不足なもんで...

Raspberry Pi Zero + Pimoroni Display HAT Miniで画面表示

こんにちは,HAVRMです.
試しに買ったDisplay HAT MiniをRaspberry Pi Zero WH(2018)につけて画面の代わりにしようとしたら思いのほか苦労したので手順等まとめておこうと思います.

Raspberry Pi Zero + Display HAT Miniで表示している様子

注意:最近販売された(売り切れで買えない)Raspberry Pi Zero 2ではなく,その前のRaspberry Pi Zeroです.ZeroでできてZero 2でできないことはないと思いますが,違う可能性はあります.

参考:この作業は2023/6/1に作業した内容です.バージョンアップ等で変わる可能性があります.

はじめに

もともとRapsberry Pi Zero WH(以下RPi0WH)が販売された当初に買っていたのですが,想像以上の性能の悪さと忙しさで長年放置していました.最近ある程度時間ができ,また小型ディスプレイやカメラ等色々増えてきたので何かできないかと掘り出して使い始めました.Switch Scienceでいろいろ買う際についでにDisplay HAT Miniを購入したので,それを使おうとしたら想像以上に苦労しました...

使ったもの

RPi0WHなので必要電力は少なく(5V 150mA)なので電源を気にする必要なはないです.ただ,USBがOTG対応のMicro Bであり,またディスプレイポートがMini HDMIなのでそのあたりは集めるのに苦労します.今回は以前RPi0WH購入時に合わせて買ったものを使いました.

  • RPi0WH(当時¥1,500ぐらいだったと思います)
  • Micro SDカード(Amazonで5個まとめ買いしたものです)

  • MRS-MBH10BK(USB Micro BからUSBに変換するハブ,分解できそうという理由で選んだ記憶があります)

www.elecom.co.jp

  • ES-KB01X1(超小型キーボード,内蔵できそうとかという理由だった記憶が...)

  • Display HAT Mini(上記のようにSwitch Scienceで購入しました)

Display HAT Miniwww.switch-science.com
(以下詳細は後述)

OSのインストール

特にひねりはなく,Raspberry Pi Imagerを使ってRaspberry Pi OS 32bitをSDカードに書き込みました.昔と比べてだいぶ楽になりましたね...実際の操作方法等は調べれば出てくるのでそのあたりを参考にしてください.

実際の作業

実際に作業するのですが,普通の方法?ではうまくいかないです.いくつかあるのですが,理由としては以下のものがあります.

  • なぜかRaspberry Pi Zeroでディスプレイ用のコードをコンパイルすると画面が表示されない.以下で言及されています.当初出たエラーで調べました.

github.com

  • Display HAT Miniはいろいろなディスプレイに対応したライブラリ(「juj/ili9341」,以下にURLを添付します)ではなく,そこからフォークされたものを使う(なお販売元(Pimoroni)のサイトには元のライブライのリンクが貼ってあります).

github.com


このあたりの理解,確認が遅れたため手間取りました...

fbcp-ili9341をダウンロードしコンパイルする

さて,実際に作業を行うのですが,上記のようになぜかRPi0WHでコンパイルすると表示されません(バックライトは点きます).そのため上記のissuesの中であるように別のRaspberry Piコンパイルします(該当コメントは以下のものです).手元にRaspberry Pi 3 Model B(Model B+ではないです,以下RPi3B)があったのでそちらで作業します.

github.com

OSを書き込んだSDカードをRPi3Bに挿して起動する + 初期設定

Raspberry Pi 4や3 Model B+/Aとかでもいいとは思いますが,手元にあったのはRPi3Bだったのでこれを使いました.まず起動すると,初期設定等(SDカードの容量拡大等)行われますので,終わるまで待ちます.
軌道が終わった後「sudo apt update」と「sudo apt upgrade」を行いアップデートするか,画面右上に表示されるアップデート通知からアップデートしてください.その際はインターネットが必要なのでWifi等でインターネットにつなげてください.

SPIを有効化する

次にDisplay HAT Miniとの通信のためにSPIを有効化します.いつもの設定ソフトを以下のコマンドで開きます.

$ sudo raspi-config

コマンドを打つと以下の画面が表示されます.なお画面はSSHのものをスクショしています.

raspi-config初期画面

この画面の「Interface Options」を選択すると次の画面に遷移します.

raspi-config「Interface Options」画面

この画面の「SPI」を選択し,遷移した画面で「Yes」を選択します.

raspi-config「SPI」画面

設定が終わると次の画面が表示されるので「OK」で終了します.

raspi-config「SPI設定完了」画面

その後に最初の画面に戻るので「Finish」で終了します.

ライブラリーのコンパイル

今回使うライブラリはPimoroniが公開しているものになります.
github.com

ここに書いてある通り,作業していきます.まずは必要なソフト(cmake)をインストールします.

$ sudo apt-get install cmake

次にクローンするのですが,URLが異なります.Display HAT Mini用のブランチ(feature/pimoroni-display-hat-mini)があるのでそれをダウンロードします(なおGithub上のURLはそもそもフォークする前の「juj/ili9341」のURLなので注意してください).

$ cd ~
$ git clone -b feature/pimoroni-display-hat-mini https://github.com/pimoroni/fbcp-ili9341.git

次にコンパイル等行いますが,オプションについてはフォークする前のGithubにあるプルリクエスト(URLはPimoroniのサイトにあります)を参考にしますが,バックライト関係とDCポートのオプションも追加しておきます.

github.com

$ cd fbcp-ili9341
$ mkdir build
$ cd build
$ cmake .. -DPIMORONI_DISPLAY_HAT_MINI=ON -DSPI_BUS_CLOCK_DIVISOR=40 -DDISPLAY_BREAK_ASPECT_RATIO_WHEN_SCALING=ON -DBACKLIGHT_CONTROL=ON -DGPIO_TFT_DATA_CONTROL=9 -DGPIO_TFT_BACKLIGHT=13
$ make -j
/boot/config.txtの編集

これだけだとうまく表示できないので「/boot/config.txt」を編集します.参考はプルリクエスト中の以下のコメントです.
github.com

「/boot/config.txt」をテキストエディタでsudoを使って開き(自分は「nano」を使っているので「$ sudo nano /boot/config.txt」となります),以下の行をコメントアウトします.

...
# Enable DRM VC4 V3D driver
#dtoverlay=vc4-kms-v3d   ←この行をコメントアウトします
max_framebuffers=2
...

なお,HDMIを刺しているときにDisplay HAT Miniを使うとHDMIの画質になってしまう(解像度以上の画像になるため文字等読めない)のを防ぐために「/boot/config.txt」に以下の行を追加してもいいです.

hdmi_group=2
hdmi_mode=87
hdmi_cvt=320 240 60 1 0 0 0

なおGithubには「hdmi_force_hotplug=1」もするよう書いてありますが,書いた場合動かなかった気もします.自分はこれらの設定をせずに使っています.

これで設定が終わったので動かせるはずですが,Display HAT MiniはRPi0WHに取り付けたいのでRPi3Bには取り付けていないのでここで一度シャットダウンして,RPi0WHに挿しなおします.

RPi0WHへDisplay HAT Miniを取り付ける

電源をつける前にRPi0WHにDisplay HAT Miniを取り付けます.買ったときに六角の支柱が同封されていますが,この支柱に合わせた深さまで挿します.とても硬く,相当な力が必要でした...
実際にはソケットは最後まで刺さらず,写真のように少し隙間ができます.

RPi0WHにDisplay HAT Miniを指した様子

RPi0WHを起動してディスプレイを起動する

これらの準備が終わったら実際に電源をつけて表示させましょう.起動した後(RPi3BからRPi0WHにSDカードを刺しなおしても何も問題なく使えます),次のコマンドを打ってディスプレイを立ち上げます.

$ sudo /home/pi/fbcp-ili9341/build/fbcp-ili9341 &

ユーザ名が「pi」以外の場合は上記コマンドの「pi」をユーザ名に変えてください.
これで実際につくはずです.

起動したら常につくようにする

これだと毎回立ち上げないといけないので起動時に自動で実行するようにしましょう.「/etc/rc.local」にsudo権限で先ほど実行したコマンドを書き込みます.

sudo /home/pi/fbcp-ili9341/build/fbcp-ili9341 &

これで次の起動時から自動で画面が点くようになります.

RPi0WH起動時

最後に

いかがでしたか.実際に手順がわかると数分で終わるような作業ですが,実際には1日近くかかりました...やり方等はしっかりしてほしいですね...