「PovRanianについて」タグアーカイブ

PovRanian 作例と代替部品の紹介

ここではハンディーバーサライタ PovRanian (ポブラニアン)の 作例や代替部品の紹介を記載していきます。

製作レシピは以下で販売しております。

PovRanian の製作レシピ

 

 PovRanian 製作の様子

 

暮らしいきいきアイディア

代替部品や製作の工夫をまとめます。

ラッチスイッチ 代替 (2021/7/4)

レシピで紹介していた以下の電源スイッチがAmazonで購入できなくなってしまいました。

  • uxcell 押しボタンスイッチ 懐中電灯用 ラッチスイッチ 2-ピン AC 250V 1.5A 12 x 8 x 8mm 5個入り

以下の商品が代わりに使用できます。

 

スイッチ部は全く同じ形状のようです。

 

電極を曲げて使用できます。

PovRanian の筐体を3Dプリンタにて

昨年末に購入した3DプリンタでPovRanian の筐体を作ってみました!
今までは木とか金具で構成していたので。。。

 

 

回転部

今回は満を持してFusion360で設計することといたしました!

マイコンやフォトリフレクタの3Dモデルも販売元から提供されており設計の助けとなりました♪

 

 
めちゃくちゃ試行錯誤して製作を進めました。。。

 

うまいこと中に詰め込み配線

 
回転部完成!

 
黒フィラメントでシックに仕上げました。

乾電池

電池もスマートに内蔵したいと考え電極を購入し、電池ボックスの設計も実施いたしました。

これまた試行錯誤して、なんとか電極を固定し単三電池をピッタリ入れるボックスが作製できました。

 

取っ手部

試作機1号

電池を持ち部分に収納する形で製作してみました。
DCモータもネジ穴を設けてきっちり固定します。

 
乾電池4本を並列に配置しましたので取っ手が太くなり過ぎました。。。

試作機2号

電池を2直列2並列に配置するようにして取っ手を細く持ちやすくしました。

 
また電源スイッチにラッチスイッチを採用しました。

試作機3号

各種微調整し、電池の極性を明示するためにケースには文字を入れてみました。

 

 

モータ収納部が円形のためか出力の際にベッドから離れて反ってしまうことがありました。

 
これはモデルを下敷き(ブリムというらしい)の上に出力することで解決しました。
意外にもブリムは簡単に取り外しできました。

 

おわりに

正月休みのほぼすべてとその後も仕事終わりに深夜まで夢中になって、筐体設計を頑張りました。

ツールの使い方から学習し、さらには形状によって変わりゆく3Dプリンタの出力具合いに悩み 試行錯誤を繰り返しメチャクチャ時間を使いました。

そのぶん木や金具を組み合わせていたのとは比べ物にならないほどに狂おしい新生PovRanianが爆誕しました。

引き続き3Dプリンタで色々なものを製作してゆきたいです!

 

レシピ販売

ShopでPovRanianの製作レシピの販売を開始しました。

レシピは 全22ページ 税込み¥500です。
筐体3Dモデルとサンプルコードは以下リンクで無料でダウンロードできますのでデータだけでもDLしてみてください。

PovRanian の製作レシピ

 

ハンディバーサライタ PovRanianの表示映像生成フォームの仕組み

Arduino Advent Calendar 2019 | 22日目

今年は念願のHomeMadeGarbageのオフィシャルショップを開店することができ、ハンディバーサライタPovRanian (ポブラニアン)を出品いたしました。
画像や図形をフルカラーで表示することができます。

 

PovRanianを販売するに際して一番の障壁が表示画像の更新でした。Arduino等の環境をお客様に用意していただき、表示データを生成してもらうのは現実的ではありません。

そこでウェブ上で表示映像データを生成しPovRanianにドラッグ&ドロップするだけの仕組みを構築しました。

ハンディ バーサライタ PovRanian の表示映像フォーム使用方法

色々検討してやっとできた表示映像生成フォームですので紹介させてください。
 

 

仕組み検討

バーサライタPovRanianをご購入いただいたのちに自由に表示映像をカスタマイズしてもらうべく、PovRanianに搭載するマイコンに表示データを書き込む手法を色々検討しました。

手法1: Arduino IDE

バーサライタのArduinoコードについては公開しておりますので、おのおのカスタマイズいたたくことも可能なのですが、Arduino IDEや各種ライブラリをダウンロード、インストールする必要があり現実的ではないので却下!

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

手法2: CircuitPython

Adafruitが提唱するCircuitPythonも検討しました。
AdafruitのCircuitPython対応マイコンであれば.pyファイルをドラッグ&ドロップするだけで買い込みが可能です。

CircuitPythonをつかってみた

 

しかし、処理が遅く割り込みもサポートしていないためバーサライタには向かないので断念しました。。。

手法3: uf2ファイル

MakeCode MakerでAdafruit SAMD21系マイコンのプログラミングを試したときに、コーディング後にuf2ファイルというものを生成しマイコンにドラッグ&ドロップで書き込んだことを思い出しました。

コードのバイナリをuf2ファイル化する手法も公開されておりましたのでPovRanianのデータ更新にはuf2ファイルを使用することにいたしました。

Microsoft MakeCode で ビジュアルプログラミング

uf2ファイルとは

Microsoftがマイコンフラッシュ向けに開発したファイル形式とのことです。

 

uf2ファイルはAdafruitのSAMD21(M0)やSAMD51(M4)系のボードでも利用可能です。
PovRanianは Adafruit Trinket M0 を利用しています。

プログラムのバイナリでuf2ファイルを生成するpythonコードも公開されております。
M0系のマイコン用の場合の変換は以下のように実行します。

uf2conv.py -c -o test.uf2 test.bin

 

PovRanian表示映像フォーム

PovRanian 表示映像フォームは以下
 http://homemadegarbage.0t0.jp/PovRanian/

表示映像フォーム構成概要

PovRanian 表示映像フォームは自宅のラズパイサーバで構築されています。
フォームの入力内容から表示データを生成しコンパイル・ファイル変換を実施してuf2ファイルを返します。

フォームの入力を受けて表示画像データgraphics.hを生成します。

graphics.hとPovRanian用のArduinoコードをマージしてarduino-cliで.inoファイルをコンパイルしてバイナリファイルcode.binを生成します。
コマンドでArduinoコードをコンパイルできるarduino-cliは以下で公開されています。
 https://github.com/arduino/arduino-cli

arduino-cliでのコンパイルは以下のように実行します。

arduino-cli compile --fqbn adafruit:samd:adafruit_trinket_m0 [コードのフォルダ指定] 

code.binをさきほど紹介した uf2conv.py でuf2ファイルに変換してダウンロードファイルとして返します。

uf2ファイル生成

PovRanian 表示映像フォームにて1つ以上の映像の設定ができるとコード生成ボタンがアクティブにまります。

“コード生成”をクリックするとファイルの作成が開始し、しばらく待つと
PovRanian.uf2ファイルがダウンロードされます。

uf2ファイルのPovRanianへの書き込み

PovRanianに搭載されているマイコン(Adafruit Trinket M0)のマイクロUSB端子とPCを接続します。

 
USBケープルを接続するとLEDが点灯します。リセットボタンをダブルクリックしてLEDが緑色になるとPCにTRINKETBOOTディスクとして認識され表示されます。

 
 
 
 
TRINKETBOOTディスクに先ほど生成したPovRanian.uf2ファイルをドラッグ&ドロップします。
認識されるとすぐにTRINKETBOOTディスクは閉じます。
 
以上でインストール終了です(簡単!!)。
 
あとはPovRanianの電源を入れて映像をお楽しみください♪
 
 

おわりに

以上でPovRanianの表示映像のカスタマイズが容易に実行できるようになり、販売開始することができました。

 

来年は文字出力などフォームのバージョンアップも目指します。

ハンディ バーサライタ PovRanian の使い方

ハンディ バーサライタ PovRanianの使用方法をご紹介します。

 

 

映像生成

表示映像フォームサイトでPovRanianに表示する映像データを生成します。

ハンディ バーサライタ PovRanian の表示映像フォーム使用方法

コード生成でPovRanian.uf2ファイルがダウンロードされます。

コードをインストール

PovRanianに搭載されているマイコン(Adafruit Trinket M0)のマイクロUSB端子とPCを接続します。

 
USBケープルを接続するとLEDが点灯します。リセットボタンをダブルクリックしてLEDが緑色になるとPCにTRINKETBOOTディスクとして認識され表示されます。

 
 
 
 
TRINKETBOOTディスクに生成したPovRanian.uf2ファイルをドラッグ&ドロップします。
認識されるとすぐにTRINKETBOOTディスクは閉じます。
 
以上でインストール終了です。

PovRanianの起動

スライドスイッチを上側にすると回転しLEDが点灯して映像が表示されます。
スライドスイッチを下側にすると回転が停止しLEDが消灯します。

 

 

電池

PovRanianはモータ回転用に1本、LED制御用に3本の合計4本の単3電池を使用します。

 
制御用の単3電池ソケットのフタは少し外しにくいのでお気をつけください。上のほうを少し押しながら下げると開けやすいです。閉めるときもフタの上部を押しながら差し込みます。

電池の方向にお気を付けください。ケース底のガイドに従ってください。

 

注意事項

  • 回転部に物や人が接触しないように十分距離を取りましょう。当たると痛いです。


 

  • モータ用の単3電池はアルカリの新品ですと高速すぎて絵が正しく出ない場合があります。多少使用したアルカリ電池かマンガン電池のご使用を推奨します。
     
  • 制御用の単3電池 3本は3本トータル電圧が4.0V以上になるようにしてください。充電式ニッケル水素電池ですと電圧が低く起動しない場合があります。
     
  • モータの回転軸を固定するジョイントのネジが緩んでいると危険です。しっかり閉めてご使用ください。ネジには六角穴があいており、1.5mmの六角レンチで閉めます。
     

    モータの軸は一部平らになっていますので、そこにネジが当たるように閉めてください。

ハンディ バーサライタ PovRanian の表示映像フォーム使用方法

PovRanianに表示する映像データを生成するサイトの使用方法をご紹介します。
 
 http://homemadegarbage.0t0.jp/PovRanian/
 

 

基本操作

表示映像フォームの基本操作をご紹介します。

映像は最大で5種表示できます。
 
  • 映像:画像や図形を選択できます。
  • 色:図形の色を選択します。
  • 回転:映像の回転の有無及び回転方向を選択します。
  • スピード:回転スピードを選択します。
  • 開始秒数:映像の表示を開始する秒数を指定します。
    最小値は0.001秒で指定可能です。
    映像No. 1の開始時間は自動的に0秒になります。また未入力の場合も自動的に0秒になります。
  • 終了秒数:映像の表示を終了する秒数を指定します。
    最小値は0.001秒で指定可能です。
    未入力の場合は自動的に999秒になります。

表示はループで電源を切るまで続きます。

映像の指定

映像は画像と図形のいずれかが選択できます。

画像

    好きな画像を選択して表示できます。画像形式は以下のようにしてください。
  • フォーマットはJPEGまたはビットマップ
  • サイズは 47px × 47px 以上の正方形か横長の長方形

画像選択後に”ファイル選択”をクリックで画像ファイルを指定できます。

回転と表示時間も指定できます。

以下の画像を指定すると

 
以下のような表示になります。

 
画像の黒(#000000)は透過しますので更に以下の画像を映像No 2として追加し重ねると

 
黒が透過して映像No 1の令和が見えます。

 

図形

図形として星、四角丸が選択できます。

 

星を選択すると色、回転と表示時間が指定できます。

色を赤(#ff0000)にした場合は以下のような表示になります。

 

四角

四角を選択するとサイズ、色、回転と表示時間が指定できます。サイズは9, 12, 14, 17, 20, 24の6種類から選べます。四角の頂点のLED位置を示しています。

 

以下はサイズ24、色を緑(#00ff00)にした時の表示です。

 

丸を選択するとサイズ、色と表示時間が指定できます。サイズは3~24の22種類から選べます。

 
以下はサイズ17、色を青(#00ff00)にした時の表示です。


 
 

色の指定

映像で図形を選択すると図形の色を指定できます。デフォルトでは白(#ffffff)が設定されます。色をクリックするとカラーピッカーが表示されます。色を設定して”選択”をクリックして決定します。

回転の指定

画像と図形で星と四角を選択すると回転の有無と方向、スピードを指定できます。

回転は”なし”か”時計回り”、”反時計回り”を選べます。

 
“時計回り”か”反時計回り”を選択すると回転スピードを1~10で選択できます。

 
以下は星(赤)を時計回りのスピード5、四角(黄色)を反時計回りのスピード10、画像(ソニック)を時計回りのスピード1とした時の表示です。

 
 

表示時間の設定

各映像の開始秒数と終了秒数を指定して表示タイミングを指定できます。0.001秒単位で指定可能です。

映像No. 1の開始時間は自動的に0秒固定になります。
未入力の場合は開始時間は自動的に0秒、終了秒数は999秒になります。

各映像の最も大きい終了秒数が経過するとまた0秒に戻って表示はループします。

 

表示時間を細かく設定すればアニメーションも可能です。
以下の動画は5枚の絵を0.1秒づつ表示しています。

コード生成

1つ以上の映像の設定ができるとコード生成ボタンがアクティブにまります。

“コード生成”をクリックするとファイルの作成が開始し、しばらく待つと
PovRanian.uf2ファイルがダウンロードされます。

 

PovRanianへコードをインストール

PovRanianに搭載されているマイコン(Adafruit Trinket M0)のマイクロUSB端子とPCを接続します。

 
USBケープルを接続するとLEDが点灯します。リセットボタンをダブルクリックしてLEDが緑色になるとPCにTRINKETBOOTディスクとして認識され表示されます。

 
 
 
 
TRINKETBOOTディスクに先ほど生成したPovRanian.uf2ファイルをドラッグ&ドロップします。
認識されるとすぐにTRINKETBOOTディスクは閉じます。
 
以上でインストール終了です(簡単!!)。
 
あとはPovRanianの電源を入れて映像をお楽しみください♪
 

ハンディ バーサライタ PovRanian の製法

ハンディ バーサライタ PovRanian (ポブラニアン)に表示する映像を生成するサイトを立ち上げました。

画像や図形を組み合わせて空中にお好みの絵を投影できます。
 

ここではPovRanian 装置の製法を紹介いたします。

 

 

 

電気系構成

以下がPovRanianの電気系の構成図です

 

モータを単三電池1本で動かして回転部のLEDを回します。回転部にはLEDのほかに回転を検出するフォトリフレクタとマイコンが載っており、給電にはワイヤレスチャージモジュールを使用しています。

電気系部品

 

持ち手の作り方

持ち手にはモータ、電池、ワイヤレスチャージモジュールの給電側が載っています。

1. 木材による筐体

持ち手や電池ボックス固定材としてブロック木を使用しました。スプレーで黒く塗っています。サイズは以下の通りです。

持ち手木材:30mm × 20mm × 140~170mm
電池固定材:12mm × 12mm × 65~75mm

上記サイズはあくまで参考ですが電池固定材は回転部にあたらない程度に近づける必要があるので長さは注意が必要です。

電池固定材の先端はフォトリフレクタの回転検知のマーカーとして使用するため、黒字に対して白いテープでしるしを貼っています。塗装時にマスキングテープを線上に貼って黒く塗らないようにしても良いです。

2. モータ固定

以下の金具を使用して、モータを固定します。

 

L字金具

創造工房 BX-289 2個入りを2セット 

 

コの字金具

創造工房 BX-291 2個入りを1セット 

 

L字金具を2つずつネジ穴2個分重ねて、電池固定材にねじ止め(タッピング皿ネジ 2 × 6) もう一方はM3×8の小ネジで固定します。

 

電池固定材への固定はマーカのある先端から16mmほど離します。

 

モータの幅だけ(28mm)離してねじ止め(タッピング皿ネジ 2 × 10)します。電池固定材と持ち手材とが水平になるようにします。

 

コの字金具と一緒にモータをねじ止め(M3×8)します。

 

電池ボックス、ワイヤレスチャージモジュールの給電側を両面テープで貼り付け、スライドスイッチはねじ止めします。配線は構成図の通りです。モータは単三電池1本で駆動します。ラベルが貼ってあるほうからみて左をプラス電位になるように配線してください。

スイッチはM3ナットを挟んで浮かしてねじ止め(タッピング皿ネジ 2 × 10)しています。

ワイヤレスチャージモジュールのコイルはコの字金具にレジンで固めて固定しました。

 

 

回転部の作り方

4mm厚、10mm幅、250mm長の木の平棒にLEDテープを貼り付けます。先頭のLEDの中心の裏に穴をあけてネジ M2×20 を通します。これが回転軸となります。

見栄えをよくするためにアクリル円板 2mm厚、直径50mmの真ん中に穴をあけて回転軸に通して棒に接着しています。そこにワイヤレスチャージモジュールの受信側のコイルを貼り付けます。

上の写真のようにフォトリフレクタとワイヤレスチャージモジュールの受信側の基板とマイコンを接着、配線します。フォトリフレクタは電池固定材のマーカを検出できるように位置を調整して固定します。

回転軸にはジョイントの2㎜穴側をはめて固定します。3.17mm穴側はモータとつながります。六角穴(1.5mm)付止めネジで固定します。

 

回転軸に対して重量のバランスをとるために端に重りを付けて調整します。以下の好きなサイズに小分けできる金具をねじ止め(タッピング皿ネジ 2 × 6)して調整しました。

 

以上で回転部の完成です。配線は基本構成を参照ください。

 

 

必要部品まとめ

電気系部品

筐体(持ち手)部品

  • 持ち手木材:30mm × 20mm × 140~170mm
  • 電池固定マーカ木材:12mm × 12mm × 65~75mm
  • L字金具 創造工房 BX-289 2個入りを2セット
  • コ字金具 創造工房 BX-291 2個入りを1セット
  • 小ねじ M3×8: 4個
  • タッピング皿ネジ 2×6: 2個
  • タッピング皿ネジ 2×10: 4個

回転部部品

注意事項

  • 回転部に物や人が接触しないように十分距離を取りましょう。当たると痛いです。


 

  • モータ用の単3電池はアルカリの新品ですと高速すぎて絵が正しく出ない場合があります。多少使用したアルカリ電池かマンガン電池のご使用を推奨します。
     
  • モータの回転軸を固定するジョイントのネジが緩んでいると危険です。しっかり閉めてご使用ください。ネジには六角穴があいており、1.5mmの六角レンチで閉めます。
     

    モータの軸は一部平らになっていますので、そこにネジが当たるように閉めてください。

バーサライタ装置の製法

これまで作成してきたバーサライタ装置のハードの製法をざっくりと記載いたします。

 

 

基本構成

マイコンにAdafruit Trinket M0を使用した場合の構成図が以下となります。

モータを単三電池1本で動かして回転部のLEDを回します。回転部にはLEDのほかに回転を検出するフォトリフレクタとマイコンが載っており、給電にはワイヤレスチャージモジュールを使用しています。

 

主な部品

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

     
  • LEDテープ Dotstar

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

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

     
  • 電池ボックス 単3×1本

     
  • 電池ボックス 単3×3本

     
  • スライドスイッチ

その他 固定具などの詳細は以下に記載いたします。
 

持ち手の作り方

持ち手にはモータ、電池、ワイヤレスチャージモジュールの給電側が載っています。

1. 木材による筐体

持ち手や電池ボックス固定材としてブロック木を使用しました。スプレーで黒く塗っています。サイズは以下の通りです。

持ち手木材:30mm × 20mm × 140~170mm
電池固定材:12mm × 12mm × 65~75mm

上記サイズはあくまで参考ですが電池固定材は回転部にあたらない程度に近づける必要があるので長さは注意が必要です。

電池固定材の先端はフォトリフレクタの回転検知のマーカーとして使用するため、黒字に対して白いテープでしるしを貼っています。塗装時にマスキングテープを線上に貼って黒く塗らないようにしても良いです。

2. モータ固定

以下の金具を使用して、モータを固定します。

 

L字金具

創造工房 BX-289 2個入りを2セット 

 

コの字金具

創造工房 BX-291 2個入りを1セット 

 

L字金具を2つずつネジ穴2個分重ねて、電池固定材にねじ止め(タッピング皿ネジ 2 × 6) もう一方はM3×8の皿ネジで固定します。

 

電池固定材への固定はマーカのある先端から16mmほど離します。

 

モータの幅だけ(28mm)離してねじ止め(タッピング皿ネジ 2 × 10)します。電池固定材と持ち手材とが水平になるようにします。

 

コの字金具と一緒にモータをねじ止め(M3×8)します。

 

電池ボックス、ワイヤレスチャージモジュールの給電側を両面テープで貼り付け、スライドスイッチはねじ止めします。配線は構成図の通りです。モータは単三電池1本で駆動します。ラベルが貼ってあるほうからみて左をプラス電位になるように配線してください。

スイッチはM3ナットを挟んで浮かしてねじ止め(タッピング皿ネジ 2 × 10)しています。

ワイヤレスチャージモジュールのコイルはコの字金具にレジンで固めて固定しました。

 

 

回転部の作り方

回転部の作りは使用するマイコンによって異なります。

 

Adafruit Itsy Bitsy M0 Express版

 

ESP32版

 

SPRESENSE版

Adafruit Trinket M0版

ここでは小さくてかわいいマイコンAdafruit Trinket M0を使った回転部の製法を紹介します。

4mm厚、10mm幅の木の平棒にLEDテープを貼り付けます。先頭のLEDの中心の裏に穴をあけてネジ M2×20 を通します。これが回転軸となります。

見栄えをよくするためにアクリル円板 2mm厚、直径50mmの真ん中に穴をあけて回転軸に通して棒に接着しています。そこにワイヤレスチャージモジュールの受信側のコイルを貼り付けます。

上の写真のようにフォトリフレクタとワイヤレスチャージモジュールの受信側の基板とマイコンを接着、配線します。フォトリフレクタは電池固定材のマーカを検出できるように位置を調整して固定します。

回転軸にはジョイントをはめて固定します。他方はモータとつながります。

 

回転軸に対して重量のバランスをとるために端に重りを付けて調整します。以下の好きなサイズに小分けできる金具をねじ止めして聴視しました。

 

以上で回転部の完成です。配線は基本構成を参照ください。

 

 

おわりに

ざっくりですが、バーサライタのハード面の製法を紹介いたしました。

不明点等ございましたらお気軽にお問い合わせください。作る人いるかしら 🙄 ?

 

応用

狭ピッチのLEDを用いて表示分解能をあげてみた

詳細リンク

筐体を3Dプリンタでこしらえた

PovRanian の筐体を3Dプリンタにて

レシピ販売

Shopで3Dプリンタで筐体を出力して作るPovRanianの製作レシピの販売を開始しました。

レシピは 全22ページ 税込み¥500です。
筐体3Dモデルとサンプルコードは以下リンクで無料でダウンロードできますのでデータだけでもDLしてみてください。

PovRanian の製作レシピ

 

SPRESENSE のマルチコアプログラミングで バーサライタ

ついにSPRESENSE にArduino IDEでのマルチコアプログラミング環境が誕生しました。

 

前回SPRESENSEを使用して製作したバーサライタ(POVディスプレイ)にマルチコアを導入してどれほどの高速動作が達成されるのか観てみました!

スマート靴占い 『 IしたoTんきになぁ〜れ 』

 

 

マルチコアプログラミング

SPRESENSEは6つのCPUを搭載しております。Arduino  IDE環境でのプログラミング詳細は以下の公式のドキュメントの記載の通りです。

 
MPライブラリというマルチコア用のライブラリが今回追加となりました。Mainコアと5つのSubコアの制御やコア間の通信を司ります。

コアごとにArduinoプログラムを用意して、コアを指定してコンパイルというなかなかの力技です(;^ω^)

構成の概要

3つのCPUを使用してバーサライタしてみました。

  • Mainコア:フォトリフレクタで回転を検出して2つのSubコアに発光タイミングを送信
  • Sub1, 2コア:Mainコアからのタイミングを受けてSPIテープLED Dotstarを発光

 

Arduino IDEコード

Mainコア

フォトリフレクタでバーサライタ装置のマーカを検出して割り込みで回転時間を測定してMP.Send関数で表示すべき画像のアドレスを各Subコアに渡しています。

コア間でメモリが共有されているので表示データのアドレスだけを渡しています。

 

LED表示画像データ graphics.h は画像やGIFからpythonで生成しています。画像の色データを極座標変換してLED用に配列にしています。またLED位置によって輝度を線型的に調整してバーサライタ表示時に明るさが均等になるようにしています。Divで1周当たりの画像分解能を指定しています。

 

Sub1コア

Mainコアからの画像アドレスをMP.Recv関数で受けてLED発光させます。MP.RecvTimeout関数でデータ受信の待ちモードを指定しており、ここではMP_RECV_BLOCKINGでデータを受信するまで永久に受信待ちに入るモードにしています。

Adafruitが提供するライブラリのハードウェアSPI使用では拡張ボードのSPI4しか使用できないためAdafruit_DotStar.cpp と Adafruit_DotStar.h をメインボード用に改造して
Adafruit_DotStar_SPI5.h、Adafruit_DotStar_SPI5.cpp
をつくってSPI5でLEDテープを制御できるようにしました。

 

Sub2コア

Mainコアからの画像アドレスをMP.Recv関数で受けてSPI4でLEDテープを発光させます。

 

 

動作

1コアから3コアにすることで1周での画像分解能が120から400にまで向上しました!わーい!!

性能指数:LED 57個 × 回転速度 730rpm × 400分解能 ÷ 100 = 166440 hPOV

 
ちなみに性能指数とはバーサライタの性能を示す独自の指標です。

 性能指数  [hPOV(ヘクトポブ)] = LED数 × 回転数 × 一周の分解能 ÷ 100

次は今回のアップデートでフラッシュメモリへの読み書きのライブラリも追加されたので長尺の動画表示にトライしたいです。

マルチコアへの道

シングルコア

性能指数:LED 58個 × 回転速度 730rpm × 120分解能 ÷ 100 = 50808 hPOV

デュアルコア

性能指数:LED 58個 × 回転速度 730rpm × 220分解能 ÷ 100 = 93148 hPOV

その後の話

フラッシュ仕様検討

分解能が上がったことによって表示データが大きくなり、現状ですと5フレームしか書き込めない状態です。

SPRESENSEのコンパイルされたコードはフラッシュメモリにインストールされ、実行されるときにSRAMに展開されて実行されます。
SRAMは1.5MBのうちのMineコアが768kB、Subコアが128kB割り当てられます。

表示データに使用できる容量はSRAMサイズを超えられないのです。。。

そこで8MBもあるフラッシュを有効に使用できないか検討しました。
Fileライブラリを使用するとフラッシュにファイル形式でデータを保存できます。

そこで表示データ(LED57個 × 分解能400の32ビットデータ)をテキストデータとしてフラッシュに保存して、再度読み込んで配列にする実験をしました。
テキストデータを1文字づつ読んで32ビット分で文字列にして16進数に変換して配列化しました。

1フレーム分の配列を読み込むのに3分20秒もかかりました。。。。

マルチコアで読み込んで配列生成しながら、長尺の動画を表示したかったのですが時間がかかり過ぎのため断念しました。。。

参考

装置構成の変更

2本のLEDテープの配置を2本平行ではなく、1直線に並べました。回転の際の表示のずれを抑えるためです。

 

ずれが軽減され精度が増しました。でももっとやりたくなっちゃう。。キリがないww

 

さいごに

今回のSPRESENSEバージョンアップによってバーサライタの性能が大きく向上しました。

いつかフラッシュメモリの使用も気軽にできるようになるかと思います。今回のバージョンアップのように。

祈りを込めて。。。

そして バーサライタ装置をステージ上にそっと置き
 地を引きずりながら漂う煙のようにその場を後にした。

しかし その表情はどこか誇らしげであったという

SPRESENSE で バーサライタ

あいかわらずバーサライタ製作沼にドはまり中のお父ちゃん

SonyのマイコンSPRESENSEでもバーサライタを作っておりました。

https://homemadegarbage.com/en/spresense-pov01

SPRESENSEはGPSやハイレゾオーディオコアを有する高性能マイコンで、なんとARMコアが6個も搭載してあるのです。しかし現状Arduino IDE環境ではマルチコア設計はできません。

 

しばらくSPRESENSEでの製作は手を止めていたのですが、ある日耳寄りな情報が舞い込んできました。

次のバージョンアップでマルチコア設計がArduino IDEで可能となるらしいとのこと。これは実に楽しみ。6コアなので色々夢広がりそう(まぁ がゆえの難しさあったり、比例的向上が容易ではないとは思うが)。

そこで、ここでは一旦現状のSPRESENSEバーサライタの仕様と性能をまとめておいて、来たるXデーに備えたいと思います。

 

 

構成

SPRESENSEのハードウェアSPIを2つ使用してそれぞれLEDテープを制御します。回転はフォトリフレクタQTR-1Aで検出します。回転部への給電はワイヤレスチャージモジュールで無線で実施しています。

部品

  • マイコン SPRESENSE
     
     
  • SPRESENSE用ミニ拡張ボード KASPI001

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

     
  • LEDテープ Dotstar
  • ワイヤレスチャージモジュール

     
  • マブチモーター RS-540SH
  • レベルシフタ  TXB0104

装置

木の取っ手にモータを固定して手持ちで動作できるようにしました。

 

回転部は以下のように独立しております。

 

LEDテープを2列にし、29セルの間に28セルが配置されるように設置しました。29セルのLEDテープはSPI4(メインボード)、28セルのLEDテープはSPI5(拡張ボード)で制御しています。

 

LED回転部への給電にはワイヤレスチャージモジュールを使用しました。

 

SPRESENSEのロジック電圧は1.8V系ですのでLEDとの間にレベルシフタTXB0104 を挿入して3.3Vに変換してます。

 

SPRESENSE

SPRESENSEとはSonyの高機能マイコンで Arduino IDEでもプログラミング可能です。

Arduino環境構築方法

以下の通りです。 

ここではArduino board packageバージョン1.2.1を使用しました。 

ピン配置

SPRESENSEはコネクタ介して拡張ボードを接続できます。SPI出力を2つ使用したいので拡張ボードも使用します。

メインボード

拡張ボード

ここではサイズの小さいサードパーティの拡張ボードを使用しました。

ハードウェアSPI

SPRESENSEは2つのSPI出力があります。拡張ボードがSPI、メインボードがSPI5です。SPIで制御できるLEDテープ DotStar を2つのSPI出力で制御します。

Adafruitが提供するライブラリのハードウェアSPI使用では拡張ボードのSPIしか使用できないためAdafruit_DotStar.cpp と Adafruit_DotStar.h をメインボード用に改造して
Adafruit_DotStar_SPI5.h、Adafruit_DotStar_SPI5.cpp
をつくってメインボードと拡張ボードそれぞれででLEDテープを制御できるようにしました。

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

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

参考

 

 
 

バーサライタ評価

いろいろな構成やマイコンでバーサライタを作ると、どの組み合わせが最適であるかしっかり評価したくなってきます。

1周の間にLEDを切り替える分解能や回転スピードをしっかり把握して性能評価するべく回転計も自作しました。

スマート靴占い 『 IしたoTんきになぁ〜れ 』

 

オリジナル性能指数

今後は以下を性能指数としてバーサライタを評価し製作したいと思います。

 オリジナル性能指数  [hPOV(ヘクトポブ)] = LED数 × 回転数 × 一周の分解能 ÷ 100

 
 
評価結果

フォトリフレクタでマーカを検出して割り込みで1周の時間を測定します。1周時間を分割してRGBYを交互に表示して分解能を評価しました。
 

SPI単体での性能

まずはSPI単体でLEDテープ1本を制御して性能を観ました。

結果はSPI(4)、SPI5ともに
 29個 × 720rpm × 240 ÷ 100 = 50112 hPOV
でした。

 

公式文書では”通信速度はメインボードが最大で13Mbps、拡張ボードが最大で48.75Mbpsとなります。”とありましたが差はないように見えました。

そもそもレベルシフタがないメインボードの方が遅いのはなぜだろう?まぁ動いてるので良しとします。
 

SPI2本での性能

LED2本同時表示して評価しました。SPI(4), SPI5同時使用で、それぞれLED数は28、29個ですがコード上は2つとも29点灯で処理しています。

58個 × 730rpm × 120 ÷ 100 = 50808 hPOV でした。

Arduinoコード

SPI出力2個でLED表示してます。フォトリフレクタで割り込んで1周の時間を測って120分割でLED点滅させています。

 

LED表示画像データ graphics.h は画像やGIFからpythonで生成しています。画像の色データを極座標変換してLED用に配列にしています。またLED位置によって輝度を線型的に調整してバーサライタ表示時に明るさが均等になるようにしています。

 

動作

GIF画像から表示データを生成して表示しています。

おわりに

今後登場するであろうマルチコア設計が可能となるバージョンアップのXデーに備えて現状の仕様と性能をまとめました。

マルチコアによってどのくらい性能が上がり表示が鮮明になるのかとても楽しみです♪

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

前回、ESP32で割り込みやマルチタスクを駆使してバーザライタの高分解能化に成功いたしました。

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

今回は画像や動画をWiFiで転送して表示に成功いたしましたのでご報告します。

 

UDPで静止画送信

UDP通信でWiFi介して静止画をバーサライタ装置に転送します。

Node-REDのDashboardノードで画像選択のボタンをこしらえて、Pythonで選択された画像の縮小とバーサライタ用にデータ変換を実施してUDP送信しています。

Node-RED設定

Node-REDでボタンなどのUI表示と選択した画像の名前をPythonに送ります。

①ダッシュボード ボタン表示

node-red-dashboardのbutton nodeでボタンUIを表示します。

3画像用意してバーサライタに表示させます。

Group:ダッシュボードノードを表示させるグループ名を決めて選択します。
Icon:ボタンに表示させる画像を選択します。
Label:ボタンの表記
Payload:ここでは画像名を次段に送ります。

②ファンクションノード

3つのボタンのノードをまとめるためにファンクションノードを配置

③ダッシュボード テキスト表示

node-red-dashboardのtext nodeで選択されたボタンのPayloadをダッシュボードに表示させます。

Group:ダッシュボードノードを表示させるグループ名を決めて選択します。
Label:テキスト欄に表示させる画像を選択します。
Value format:表示させるテキストを選択。ここではボタンノードからのPayloadを指定。

Dashboardタグを選択して表示ボタンでダッシュボード画面が表示されます。

ダッシュボード

④Python実行

exec nodeでPythonコードを起動させます。

Command:Pythonコード実行させるバッチファイルを指定。(Windows PC使用)
Append:引数にPayloadをチェック入れて画像名を送っています。

以下がバッチファイルの内容です。引数1個をもってpythonコードを起動します。

Pythonコード

ダッシュボードボタンで選択された画像ファイル名を受けて、その画像を変換してUDPでバーサライタに映像情報を送信します。

Arduinoコード

pythonから送られた画像データを受けてバーサライタに表示させます。

動作

たまに取りこぼしあるけど画像伝送実現できました!わーい 😛 

ダッシュボードノードのボタンで画像が切り替わります。

 

 

動画転送

動画転送も試してみました。PythonでGIFファイルをフレームごとに変換してバーサライタに転送します。

動作

バーサライタの1周の分解能を200から100に減らして転送しているのですが、遅い。。。

転送量をギリギリまで増やして送信漏れもないようにうまいことできるように引き続き勉強します! 😆 

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

前回、課題となった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でチャタの急峻電圧変動をフィルタしてシュミットトリガのヒステリシス判定でチャタリングを完全除去して正常な割り込み動作を実現しました。

 

構成

部品

装置

前回同様、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 でバーサライタ作製

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

スマート靴占い 『 IしたoTんきになぁ〜れ 』

動作

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

 

 

構成

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

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

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

部品

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”というデバイスが表示