ESP32で円形POV(バーサライタ)を作る③(SDカードを使った画像表示編)

ESP32

SDカードに保存した画像データを読み込んでPOVに表示します。回路は1回目を参照ください。

今回の目的

SDカードから画像データを読み込んでPOVに表示するだけであれば、必ずしもマルチコアを使う必要はありません。SDカード内の画像データを変数配列にコピーしてからPOVに表示すれば良いです。ただ、この方法だとSDカードの通信中はPOVの描画は止まってしまいます。最終的な目標は動画の再生であることから連続的な画像の読み込みを実現するため、マルチコアを使用します。

シングルコアでの概要

前回のフラッシュメモリから画像データ1行分を読み込む方法では一回の描画時間(一周の時間/分解能)の中でも読み込みができるだけの速度を出せましたが、SDカードの通信はそれよりも遅いため、(1行だけ読むとしても)間に合いません。そのため、1周(かそれ以上)の間描画を止めてSDカードの通信に専念する必要があります。

上:前回のフラッシュメモリに格納したデータを読み込む方法 下:シングルコアでSDカードから読み込む方法

マルチコアでの概要

Core1はPOVの描画、Core0はSDカードの読み込みに専念させます。画像データを格納する変数配列は2つ用意し、片方の配列にSDカード内データを格納しているのと並行してもう片方の配列のデータをPOVの描画に使用します。

これのメリットとしては、例えば画像データの読み込みが1周の間に間に合わなくとも、すでに読み込み済みの配列のデータの方を使えば描画が止まらないという点があります。読み込みとどちらのデータを使うかというところを判断するために、プログラムでは複数のフラグを立てて管理しています。また、SDカードからの読み込み以外でもWiFi/BTを介した通信・データ送信もCore0で行うことにより、POVで描写しながらリアルタイムでできるというメリットもあります。

SDカードに保存するデータ

前回の画像変換のPythonプログラムで生成されたbmpファイルを保存します。今回はプログラムの実証用にA/Bと描かれた画像2枚をSDカードへ保存します。
画像変換のPythonプログラムは前回を参照ください。

Arduinoプログラム

基本は前回と同じですが、データの読み込みがフラッシュメモリからSDカードへと変わっており、Core0で読み込みを行っています。

プログラムの補足

  • 50行目:BMPはBGRx8bitのバイナリデータが並んでいますが、1列ごとのバイナリデータの数を4の倍数にする必要があります。そのため画像の幅(LED数)が4の倍数でない場合は単純に画像の幅x3の配列を用意するとズレていってしまうので、上記プログラムのように4の倍数になるように調整します。
  • 116行目:Core0の設定です。設定値は割りと適当です(エラーが出なければOK)。
  • 195,198行目:今回のプログラムは実験要素が大きいので読み込む画像のファイル名はここで直接記載しています。
  • 214行目:これがマルチコアで結構躓いた所なのですが、マイコンにはWDT(ウォッチドックタイマー)というものがあり、プログラムが暴走・停止していないかを定期的に監視しています。Core1で実行されるLOOPの中ではLOOPが繰り返されるたびにWDTへ信号を送っているらしく特に意識する必要は無いのですが、例えばWhileループで長時間繰り返し続けるとWDTエラーが発生します。Core0ではWhileで永久ループを回しているため、定期的にWDTへ信号を送ることをしないとエラーが発生します。具体的には”delay(1)”か”vTaskDelay(1)”を挟むとその間にWDTとの通信が行われるらしいです。

実際の動き

回転するごとにAとBの画像が切り替わります。(よく見たら文字が鏡写しになっていますね。。。)

次回

次回は最終回、SDカードに保存した動画データを読み込んでPOVに表示する方法です。

コメント

タイトルとURLをコピーしました