Categories: 工作・開発

ESP32-S3のSIMD命令を使って電子ペーパーを最大20fps更新する自作ドライバー「EPD_Painter」がGitHubで公開

電子ペーパーディスプレイは低消費電力と視認性の高さが魅力だが、更新が遅いというイメージがある。その常識を覆そうとする試みがGitHubで公開されている。

tonywestonuk氏が開発した「EPD_Painter」は、960×540の電子ペーパーを最大毎秒20フレーム相当で更新できるESP32-S3向けのオープンソースドライバーだ。対象ハードウェアはM5Stack M5PaperS3とLilyGo T5 S3 GPS。

速度の秘密は3つの設計判断にある。第1に、ESP32-S3に内蔵された128ビットのSIMDベクターユニットを使い、ウェーブフォーム変換・ピクセルパッキング・差分検出を64ピクセル単位でまとめて処理するカスタムアセンブリコードだ。通常のCによるスカラー処理と比較して、同じ処理が約2.67倍速い。第2に、Arduino標準のesp_lcd_panel_io_i80インターフェースを迂回し、LCD_CAMペリフェラルのDMAを直接制御する方式で転送オーバーヘッドを削減した。8ビットパラレルバスを80MHzで駆動し、1行240バイトを3マイクロ秒でDMA転送する。第3に、前フレームから変化したピクセルだけを更新するデルタ更新方式と、ウェーブフォームレンダリングをバックグラウンドコアで並行実行するデュアルコアパイプラインの組み合わせだ。

更新品質は3段階で切り替えられる。高品質モードが5fps(精細なグレー表現、ゴーストが少ない)、通常モードが10fps、高速モードが最大20fpsで、いずれもフル画面更新だ。パーシャル更新機能は持たないが、「0.1秒で全画面を更新できるなら部分更新は不要」とのことだ。

ディスプレイの特性上、電源オフ後も画像が表示され続けるため、DCバランス(明暗のパルス数が均衡していないとパネルが劣化する)の管理機能も実装されている。シャットダウン時には現在の画面をNVSに保存し、次回起動時に「逆再生」でDCバランスを回復する。

Adafruit GFXとLVGL v9の両方にバインディングが用意されており、テキスト描画・図形・カスタムフォントのほか、GPSと組み合わせた時計やOpenStreetMapのタイル表示といったサンプルも含まれている。

関連情報

FabScene編集部

FabScene編集部