以前、Raspberry Pi Zero 2Wを使ってWebラジオを作ってみた↓
表示系は最初にLovyanGFXを使おうとしたのだが、何故かうまく動かなかったのでDisplay_Lib_RPIライブラリ を使った。
このライブラリは直接SPIを叩きに行くので、難しい設定等なしで動かせる。ただ、このDisplay_Lib_RPIはシンプルな構造であるが故に、いちいち細かくコードを書く必要があるし、文字を表示するにも幅8dot単位でしか表示できない等、制約も多い。
要するに、とても使いにくいのである。
そのため、ESP32S3版で作った文字の大きさを調整しながら、アーティスト、タイトルの全体を表示する全体表示モード等は めんどくさくて実装していない。
そこで、前回上手くいかなかったLovyanGFXを使って表示させる事に再チャレンジする。
再チャレンジするにあたって、おじさんも少し調べた。
・LovyanGFXをlinuxで使う場合、フレームバッファ(メモリ)にしか描画できない。
(SPIを叩いてLCDにデータを送れない)
なのでSPIを通じてLCDに出力するための別のプロセスが必要。
・毎回全画面をLCDに送ると書き換えに時間がかかるので、画像の差分を検出して
差分データだけをLCDに出力する必要がある。
・別プロセスにデータと通知を渡すために、共有メモリを用意する。
概念図としては、こんな感じ
Geminiに、こんな感じでよろしく、とお願いしたら良い感じにコードを書いてくれた。
と、いうことで、さっそく試してみる。
今回使う機材はこちらのもの↓
次にソフト関連
・新しいSDカードに32bit版 Bookworm Lite(GUI無し)を入れて、sshで接続
・SPIの有効化 (config.txt)
sudo nano /boot/firmware/config.txt と入力
で開いて、#dtparam=spi=onの部分のコメントアウトを外して以下のように
# SPIを有効にする
dtparam=spi=on
・転送プロセスがLCDのRST,CSをGPIO制御するために必要なライブラリ
libgpiod-devをインストール
sudo apt install -y libgpiod-dev
・ユ ーザーを spi および gpio グループに追加
sudo usermod -aG spi,gpio $USER
一旦、リブート
・C++のコードをビルドするために必要なツール一式をインストール
sudo apt update
sudo apt install build-essential cmake git -y
・TrueTypeで日本語表示するためにNoto CJK フォントをインストール。
・FreeType2(フォント描画ライブラリ)の開発用パッケージをインストール
・プロジェクト作業ディレクトリを作成し、LovyanGFX をクローン
sudo apt install -y git
mkdir -p ~/WebRadio && cd ~/WebRadio
git clone https://github.com/lovyan03/LovyanGFX.git
WinSCPで見てみるとこのように展開されている
今回は、LCDが動くまでは早かった。しかしまた、ここからが長かった。
細かなことを書いてもしょうがないが、何十回とやり取りしてようやく、イメージ通りに動くようになった。
Ticker表示もうまく動いている。
今回は最終的に以下のような仕組みで動いている。
LCD1画面分サイズのSpriteを作って、そこに描画していく。
画面の更新が終わったら、2つある共有メモリ領域のどちらか片方にSpriteデータをコピーして、共有メモリの先頭領域に書き換えたことを知らせるためにシーケンス番号、バンク指定を更新。
transfer_deamonは、シーケンス番号が更新されたら、共有メモリをスキャンして前画像と差が有った領域(矩形領域)を判断、その矩形部分のみLCDに転送する。
これから作っていく中で、思わぬ弊害が出て修正が必要になるかもしれない。
でも、まぁ、とりあえず前に作ったWebRadioに移植して、動かしてみる。
今回のコードはこちら
WebRadioディレクトリの下にbuildディレクトリを作り、そこに移動してビルド
cd ~/WebRadio/build
rm -rf *
cmake ..
make -j4
(2回目以降はmake -j4のみで可)
ビルド出来たら、プログラムを起動
cd ~/WebRadio/build
./app_main
もう一つターミナルを開いて、転送プロセスを起動
cd ~/WebRadio/build
./transfer_deamon
これで動き出す。(はず)
「ほぉ、今度は大丈夫なのか?」
今回も自信無いです。





