お父にゃんの電子工作

お父にゃんの電子工作

暇なおじさんが、電子工作(主にラジオ製作)をして勝手な感想を書く

以前、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 フォントをインストール。 

sudo apt install fonts-noto-cjk

・FreeType2(フォント描画ライブラリ)の開発用パッケージをインストール

 sudo apt install -y libfreetype6-dev
 

・プロジェクト作業ディレクトリを作成し、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に移植して、動かしてみる。

 

今回のコードはこちら

LovyanGFX_test

 

WebRadioディレクトリの下にbuildディレクトリを作り、そこに移動してビルド

cd ~/WebRadio/build
rm -rf *
cmake ..
make -j4

(2回目以降はmake -j4のみで可)

 

ビルド出来たら、プログラムを起動

cd ~/WebRadio/build

./app_main

 

もう一つターミナルを開いて、転送プロセスを起動

cd ~/WebRadio/build

./transfer_deamon

これで動き出す。(はず)

 

 

「ほぉ、今度は大丈夫なのか?」

今回も自信無いです。