ESP32 でバーサライタ作製

Home > 電子工作 > ESP32 でバーサライタ作製
すき 1
うんこ 1

以前つくったPOV(Persistent Of Vision=残像)表示装置バーサライタのマイコンをESP32にしてみました。高速で優秀なESP32で更に無線も使えるので、表示画像をBluetoothで切り替えなども試してみました。

“キング・オブ・ダークネス” EVIL の魔法陣を自作

動作

スマホで画像を切り替えるとPOVの表示が切り替わります。無線搭載のESP32ならではです。

 

 

構成

基本構成は前回とほぼ同じです。回転部にLEDテープDotstarとマイコン、フォトリフレクタを搭載し、ワイヤレスチャージモジュールを使って回転部への給電します。

今回はLEDテープを2列にして表示の高分解能化をはかりました。

またスマホアプリBlynkでBluetooth介して信号を送って表示する画像を切り替えます。

部品

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

     

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

     
  • LEDテープ Dotstar

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

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

POV装置

ESP32の高速動作(CPUクロック周波数 240MHz )をいいことにSPIを2個出力してLEDテープを2列にしました。29セルの間に28セルが配置されるように設置しました。

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

 

Blynk設定

スマホとESP32をスマホアプリのBlynkを用いてBluetooth通信させてPOV表示させる画像を切り替えます。Blynkアプリのバージョンは2.27.1。
 

新規プロジェクトを作成します。HARDWRE MODELはESP32 Dev Boardを選択。CONNECTION TYPEはBluetoothを選択。AUTH TOKENはArduinoコード生成時に使用します(アカウントに登録したメアドに送信されます)。
 

Bluetoothウィジェット、Vertical Sliderウィジェット、Image Galleryウィジェットを配置します。
 

Vertical SliderウィジェットでヴァーチャルピンV0に最小値 1、最大値 2を設定できるようにします。
 

Image Galleryウィジェットで入力をヴァーチャルピンV0として、2個の画像のあるURLを指定します。V0 = 1でロックマン、V0 = 2でレナが選択されます。

Arduino IDEコード

ArduinoでESP32のコードを作成しました。環境設定は以下の通りです。ライブラリのバージョンは1.0.1。
 https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/boards_manager.md

以下のDotstar用ライブラリを使用しています。
 https://github.com/adafruit/Adafruit_DotStar

フォトリフレクタ QTR-1A用のライブラリは以下を使用しました。
 https://github.com/pololu/qtr-sensors-arduino

更にBlynk用ライブラリも使用します。バージョンは0.6.0。
 https://github.com/blynkkk/blynk-library

[スケッチの例] -> [Blynk] -> [Boards_Bluetooth]-> [ESP32_BT]を参考にコード生成しました。

LEDテープ Dotstarを2列使用しているのでSPIを2個出力しています。
 stripH:DATA-GPIO13 、CLK-GPIO14
 stripV:DATA-GPIO23 、CLK-GPIO18

フォトリフレクタ QTR-1Aで1周する時間を測定して表示する発光パターンを切り替えています。1周を100分割して画像を表示します。

ヴァーチャルピンV0の値を受信して表示する画像の配列を切り替えます。配列はgraphics.hファイルに記載しています。

57(LED数) × 100(1周の分割数)の配列を2画像分(rock[], rena [])記載しています。
画像配列の生成方法は次の節で説明します。

 

表示グラフィックデータ作成手法

Pythonで表示データ生成プログラムをこしらえました。画像処理ライブラリのopenCVとPillowを利用しています。

表示したい画像を取り込んで縮小して極座標変換してLEDの数 (29+28 = 57) ×1周の分割数 (100)の色コードの配列を生成します。確認用に変換後の画像も出力します。

全体の輝度 (Bright)をパーセンテージで指定できるようにしました。

中心LEDの輝度を端のLEDに対するパーセンテージ (Led0Bright )で指定できるようにして、端から中心に徐々にLEDの輝度を下げれるようにしました。
これによって中心が異常に明るくなることを避けれます。

 

元画像

 

変換画像

全体輝度 [%]   Bright = 30 
中心LEDの輝度 [%]  Led0Bright = 10
サイズ 57×100ピクセル

生成された57×100の色データをgraphics.hにコピペします。

Blynk Bluetooth接続

BlynkアプリでBluetoothウィジェットをクリックします。

“Connect Bluetooth device”をクリックするとBluetoothデバイスの検索が始まり”Blynk”というデバイスが表示されますのでクリックして接続します。

接続ができましたらアプリを実行して、スライダでPOV表示画像を切り替えが可能となります。

 

 

製作の流れ

POV装置にESP32を適応するに際して、いろいろと紆余曲折ございましたので記載します。

割り込み

フォトリフレクタ QTR-1Aの出力で割り込みして回転速度検出したかったのですが、

がESP32ではうまく動きませんでした。

FALLINGモードなので入力ピンitrPinがLOWになると1度だけ割り込まれてRotCount()関数が呼び出されるはずなのですが、何度も割り込んでくるのです。。。

ちょっと原因不明。チャタリングとかではないはず。
 https://www.switchdoc.com/2018/04/esp32-tutorial-debouncing-a-button-press-using-interrupts/

まぁ割り込みなしでもLEDテープ1列(29セル)で250分割余裕だったので。。今後の課題とさせていただきます。

 

ハードウェアSPI

今回のコードではSPIはソフトウェアSPIとして使用しています。

ESP32は複数のハードウェアSPIを搭載しておりArduinoでも2個(HSPI, VSPI)使用できます。ソフトウェアSPIよりハードウェアSPIのほうが一般的に高速です。

しかし、Dotstarライブラリで複数個のハードウェアSPIを使用できるようにするのはライブラリ改造が必要そうなので断念しました。。

マルチタスク

ESP32はArduino環境でもデュアルコアを使用することができます。以下の記事が非常に参考になります。
 Arduino – ESP32 のマルチタスク ( Dual Core ) を試す

私もデュアルコアに挑戦して CORE0でフォトリフレクタ回転検出、CORE1でLED発光処理させてみたのですが、うまくLEDが光りませんでした。

 

これも根が深そうなので、今後の課題とさせてください。。。

2枚羽化

当初、1枚羽から2枚羽にして高分解能化を目指しておりました。

回転の際にそれぞれのLEDは少しずれて配置しているので、隙間なく絵が出るはずです。

 

SPI2個出力にしたためか250分割→140分割くらいが限界でした。
 

1枚羽より密集した絵が表示できましたが、半周差があるためかどうしても隙間感が出ていたので結局1枚羽で2列に修正しました。そしてマージンとって1周100分割としました。

追記

もろもろ解決

本ブログでの課題は以下で解決いたしました。是非ご覧ください。

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

「ESP32 でバーサライタ作製」への1件のフィードバック

コメントはこちらから

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

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