前回の記事に続き、ESP32-S3搭載LCD開発基板 (JC3248W535)で遊びます。
yokomumu.hateblo.jp
今回は、サンプルコードを解析しつつ、超簡易MP3プレイヤーを作成します。まずは、JC3248W535に添付されているサンプルのMP3プレイヤーの構造をざっくりと図に起こしました。
サンプルのMP3プレイヤーの構造
一番下のハードウェアに対して、オーディオ関連はArduino Audio Library、描画と入力関連はBSPとLVGLが担当しています。ここで、聞きなれないBSPという単語が出てきましたが、これはボード支援パッケージ(B oard S upport P ackage)というもので、一般的にはハードウェアメーカーが提供するデバイスドライバーのようなものです。LVGLは、この上に乗っています。
ここで問題なのは、BSPが古いLVGL 8.xにしか対応しておらず、将来的に最新版に差し替える必要が出てきた場合(今回は初っ端から差し替える予定ですが)、BSPを大幅に書き換えなくてはいけないところです。基本的にBSPにはユーザーは手を加えません。ハードウェア固有のコードであり、バグ修正以外の理由で書き換える理由は余り無いためです。
現状最新版のLVGL 9.xを使う場合、このBSPは使えません。そこで、色々とWebを泳ぎ回っていたところ見つけたのがGFX(組み込み向けグラフィックスライブラリ)を使ったLVGLのサンプルです。
このサンプルは、下のGitHubで公開されています。(ありがとうございます!)
github.com
これに入れ替えてMP3プレイヤーを作成する場合、以下のような構造になります。
これから作成するMP3プレイヤーの構造
GFX LibraryはLCDパネルの制御のみに特化しており、LVGLを使うためにはタッチパネルの制御用にグルードライバを自分で起こす必要があります。有り難いことに、こちらのコードも同梱されています。
失礼ながらこちらのコードはかなり乱暴なコードでして、毎フレーム全エリアを更新しているため非常に重いコードです。実際に動く物を作る場合には改良しながら使う必要があるでしょう(それほど難しくはありません)。サンプルということですが念のため。
そして実際に作ってみたのが写真のようなデバイスです。
実際に動作しているMP3プレイヤー
タッチしても何も動作しませんが、/musicディレクトリの下にあるオーディオファイルをひたすら再生し続けるだけのものです。
これから色々と手を加えてそれらしくしてみようと思います。
ひとまずGitHubに現状のコード置いておきました。興味のある方はZIPファイルでダウンロードしてコンパイルしてみてください。PlatformIO用です。
github.com
2026/02/17追記:画面のリフレッシュタイミングをVSyncと同期するなど最適化しました
なお、恐らくそのままではESP-IDFのヘッダファイルが足りないと怒られてコンパイルが通らないはずです(ESP-IDFの問題です)。実際には参照しないヘッダファイルなので、単純に黙らせるだけでOKです。
直すのが面倒な方は、エラーコードをGitHub Copilotにでも食わせれば適当に直してくれるでしょう(笑)
次回へと続きます。