こんにちは,HAVRMです.
試しに買ったDisplay HAT MiniをRaspberry Pi Zero WH(2018)につけて画面の代わりにしようとしたら思いのほか苦労したので手順等まとめておこうと思います.
注意:最近販売された(売り切れで買えない)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に変換するハブ,分解できそうという理由で選んだ記憶があります)
- ES-KB01X1(超小型キーボード,内蔵できそうとかという理由だった記憶が...)
- Display HAT Mini(上記のようにSwitch Scienceで購入しました)
Display HAT Miniwww.switch-science.com
(以下詳細は後述)
- Raspberry Pi 3 Model B
OSのインストール
特にひねりはなく,Raspberry Pi Imagerを使ってRaspberry Pi OS 32bitをSDカードに書き込みました.昔と比べてだいぶ楽になりましたね...実際の操作方法等は調べれば出てくるのでそのあたりを参考にしてください.
実際の作業
実際に作業するのですが,普通の方法?ではうまくいかないです.いくつかあるのですが,理由としては以下のものがあります.
- なぜかRaspberry Pi Zeroでディスプレイ用のコードをコンパイルすると画面が表示されない.以下で言及されています.当初出たエラーで調べました.
- Display HAT Miniはいろいろなディスプレイに対応したライブラリ(「juj/ili9341」,以下にURLを添付します)ではなく,そこからフォークされたものを使う(なお販売元(Pimoroni)のサイトには元のライブライのリンクが貼ってあります).
このあたりの理解,確認が遅れたため手間取りました...
fbcp-ili9341をダウンロードしコンパイルする
さて,実際に作業を行うのですが,上記のようになぜかRPi0WHでコンパイルすると表示されません(バックライトは点きます).そのため上記のissuesの中であるように別のRaspberry Piでコンパイルします(該当コメントは以下のものです).手元にRaspberry Pi 3 Model B(Model B+ではないです,以下RPi3B)があったのでそちらで作業します.
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のものをスクショしています.
この画面の「Interface Options」を選択すると次の画面に遷移します.
この画面の「SPI」を選択し,遷移した画面で「Yes」を選択します.
設定が終わると次の画面が表示されるので「OK」で終了します.
その後に最初の画面に戻るので「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ポートのオプションも追加しておきます.
$ 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を起動してディスプレイを起動する
これらの準備が終わったら実際に電源をつけて表示させましょう.起動した後(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 &
これで次の起動時から自動で画面が点くようになります.
最後に
いかがでしたか.実際に手順がわかると数分で終わるような作業ですが,実際には1日近くかかりました...やり方等はしっかりしてほしいですね...