Home Made Garbage

ESP32でバーサライタ 高分解能化

ホーム
電子工作
Raspberry Pi
IOT
WEB

前回、課題となったPOV(Persistent Of Vision=残像)表示装置バーサライタの高速化が実現できましたのでご報告いたします 😀 。

ESP32 でPOVディスプレイ作製

前回の課題

割り込み制御できない

フォトリフレクタ QTR-1Aで回転を検出(1周の時間計測)しており、フォトリフレクタの出力を受けて割り込み制御したかったのですがESP32ではattachInterrupt()うまく機能しない。

例えば立下り検出モードにして入力をGNDに落とすと、一度だけ割り込み関数を呼んでほしいのだが何度も割り込み検出してしまう。

ハードウェアSPI

SPI制御LEDテープDotstarのライブラリではESP32のハードウェアSPIを使用することができなかった。

前回はソフトウェアSPIで制御した。

マルチタスク

前回はCORE0でフォトリフレクタ回転検出、CORE1(loop)でLED発光処理させてみたのですが、うまくLEDが光りませんでした。

 

 
 
 
 
以下、高速化に向けた解決編です。

割り込み制御

あいにくオシロスコープを持ってないので予測ですがチャタリングが原因だと考えられます。
ということでシュミットトリガと抵抗器とコンデンサをフォトリフレクタの出力とESP32の割り込み検出ピン(D34)に挿入しました。

抵抗10kohmとコンデンサ0.1uFでチャタの急峻電圧変動をフィルタしてシュミットトリガのヒステリシス判定でチャタリングを完全除去して正常な割り込み動作を実現しました。

 

構成

部品

装置

前回同様、LEDは2列にして29セルの間に28セルが配置されるように設置しました。

また光を拡散させるために切ったクリアファイルでコートして さらに包帯などをとめるテープを貼ってみました。

手持ちです。

参考

ハードウェアSPI

Hackster.ioのSPRESENSEのコンテストにSPRESENSEを使用したバーサライタを投稿しました。

I made a full color POV display using SPRESENSE and DotStar LED tape. By HomeMadeGarbage.

この際にDotsterライブラリを改造してハードウェアSPIを強制的につかうスキルが身についたので、今回ESP32でもハードウェアSPIを使うためにライブラリの改修を行いました。

ESP32は2つのSPI出力(VSPI, HSPI)があります。
Adafruit_DotStar.cpp と Adafruit_DotStar.h を改造して

Adafruit_DotStar_VSPI.h、Adafruit_DotStar_VSPI.cpp
Adafruit_DotStar_HSPI.h、Adafruit_DotStar_HSPI.cpp
をつくってハードウェアSPIであるVSPI, HSPIでLEDテープを制御しました。

以下のようにcppファイルを修正しました。

SPI終了や送信クラス、ヘッダファイルもうまいこと修正します(ここでは割愛)。

マルチタスク

割り込み動作と2つのハードウェアSPI制御が実現できたことにより、CORE0とCORE1でそれぞれ1本づつLEDを制御して高速動作を実現できました。

1周 200分割の分解能での表示が可能となりました。

バーサライタ表示データ生成

折角容量の多いESP32なので動画を表示させてみたく、pythonでGIFファイルからフレームごとにバーサライタ表示用に画僧縮小と色抽出して配列生成するプログラムを作成しました。

抽出するフレーム数と1周の分割数(ここでは200)を指定してGIFファイルからバーサライタに表示するRGB配列データ(graphics.h)を生成します。

pythonコード

 

以下のGIFを7フレーム分抽出しました。

生成された graphics.h