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

Home > 電子工作 > ESP32でバーサライタ 高分解能化
すき 0
うんこ 0

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

ESP32 でバーサライタ作製

前回の課題

割り込み制御できない

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

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

ハードウェアSPI

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

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

マルチタスク

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

 

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

割り込み制御

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

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

 

構成

部品

  • マイコン ESP32-DevKitC ESP-WROOM-32開発ボードV2

     

  • フォトリフレクタ QTR-1A

     
  • シュミットトリガインバータ TC7W14FU


     

  • MSOPパッケージ

     
  • LEDテープ Dotstar

     
  • ワイヤレスチャージモジュール

     
  • マブチモーター RS-540SH

装置

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

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

手持ちです。

参考

ハードウェアSPI

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

この際に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

Arduinoコード

修正したDotsterライブラリと表示データgraphics.hをインクルードして、マルチタスク、割り込みによる回転検出を導入しています。

 

 

動作

LEDテープ2列(計57セル)で1周200分割での表示が可能となりました。

細かいところも割とうまいこと表示できててうれしいです。折角のESP32なので無線で映像制御とか今後試す予定です 😆 。

付録

高分機能化に向けて色々条件変えて試したので本装置での1周の分解能を表にまとめます。

  • 割り込みなし(回転検出をloop内で実行)の時の分解能
      ソフトウェアSPI ハードウェアSPI
    シングルコア 100 100
    デュアルコア LED正常に点灯しない 160
  • 割り込みで回転検出実施時の分解能(正規化)
      ソフトウェアSPI ハードウェアSPI
    シングルコア 120 120
    デュアルコア 200 200

 

ESP32ではソフトウェアSPIとハードウェアSPIで分解能に大きな差はありませんでしたがソフトウェアSPIはLED表示の際に輝度にムラがありました。

以下は割り込みあり、デュアルコア、ソフトウェアSPIでの動作です。

次の記事

バーサライタに映像を無線転送

「ESP32でバーサライタ 高分解能化」への2件のフィードバック

  1. はじめまして!
    私も球体POVを作成しています.今年のMakerFaireTokyo2019にも出展しました.
    https://www.youtube.com/watch?v=oyAgYzRlOu4
    マイコンはESP32(m5stack),LEDはAPA102-2020を使用しています.
    https://twitter.com/Yakatano/status/1158398492449992705?s=20

    コレを見ていただくとわかるんですが,LEDのPWM点滅がそのまま映像として出てしまっています...例えば赤が255だとキレイに横線がはいるのですが,赤が減ると点線になってしまいます(これはこれで味があって良いのですが)
    今は位相同期していないなど,まだ足りない部分があるかと思いますが,homemadegabageさんのところではキレイに表示されていますよね.

    現在,FastLEDというライブラリを使用しており,
    https://github.com/FastLED/FastLED
    これが原因の一つかと類推しています.これはおそらくハードウェアSPIを使っていないので,homemadegabageさんのAdafruit_DotStar_VSPI.h を試してみようかとも思っています.
    もしお気づきの点などありましたら,ご指摘いただけると助かります.

    POVを作る者としてhomemadegabageさんのページはよく参考にさせていただいています.
    今後ともがんばってください!

    この制作記も近いうちにアップしますー

  2. コメントありがとうございます!
    すごいですね!私は以前、球体POVは作りこみが難しくて断念いたしました。。

    私の認識ですとAPA102はリフレッシュレートが19.2 kHzと非常に高速のため, 色データ0-255で残像に影響は出ないという認識でした。

    全体の輝度を決定するグローバル輝度は低周波数のPWMパターン( ~440 Hz)を重畳
    しているようなので残像に関係しそうですが、
    私がAPA102でバーサライタでグローバル輝度下げても極端に色飛びすることはなかった記憶です。

    私はAdafruit_DotStarライブラリを使用しておりますので、FastLEDライブラリの影響でしょうか?
    FastLEDライブラリの輝度コントロール方法など確認必要でしょうか。

    Adafruit_DotStarで一度比較してみてはいかがでしょうか?
     https://github.com/adafruit/Adafruit_DotStar

    製作ブログ楽しみしております!

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください