M5StickC:バーサライタプログラム

バーサライタ制御用プログラムです。表示データのヘッダと、プログラム本体になっています。

POVforM5StickC/SimplePOV/
https://github.com/shikarunochi/POVforM5StickC/tree/master/SimplePOV

プログラム動作は、画像データを回転分割数用意して順番に表示していくだけ、です!

Adafruit NeoPixelライブラリを使っています。

1つの画像を表示してから、次の画像に切り替えるまでの時間は、(1回転に要する時間 / (分割数) になります。

ここは、何度も何度も試行錯誤しつつ、最適な値を詰めていくしかなかったです。

本体横のボタン押下で少しずつ待ち時間を増やしていく仕掛けを作って、いい感じの数字を探りました。とはいえ、回転自体もキッチリ安定してるわけではないので、うまく出たりでなかったりします。まあ、そこは仕方ない。

Arduino標準の loop() だと、繰り返しの間が大きすぎて全然まにあわなくて、while(true)で独自ループして最速で表示しています。

僕の作ったものだと、1周するのに、だいたい45ミリ秒でした。1秒間に22回転ちょっと。

マブチモータのサイトによれば

電池で動く工作に最適なモーター
https://www.mabuchi-motor.co.jp/motorize/branch/motor/

FA-130RAは、無負荷で8,600r/min、適正電圧・負荷で6,500r/min とのこと。
6500r/min = 108.3r/sec なので、1秒間22回転ってことは、結構、負荷かかってますね。

1周45ミリセカンドで考えると、120分割するとして、1つの処理を行う時間は0.375ミリ秒になります。
Arduinoのdelay()はミリ秒指定なので、間に合わないです。

マイクロ秒で指定のできる delayMicroseconds() を使用しました。

Reference > Language > Functions > Time > Delaymicroseconds
https://www.arduino.cc/reference/en/language/functions/time/delaymicroseconds/

内部的な処理でも時間がかかっているので、試行錯誤の結果、(うちの環境では)1周での待ち時間は15ミリ秒がちょうどよい感じでした。


画像データを手動では作るの大変なので、pngから変換するPythonスクリプトを作成しました。
画像読み込みのために、画像処理ライブラリPillowを使っています。pip使ってインストールしてください。

pip install Pillow

スクリプトは、横長の文字をそのまま表示するパターンと、正方形画像をうまいこと表示するパターンの2種類作りました。

POVforM5StickC/tools/makePictureData/
https://github.com/shikarunochi/POVforM5StickC/tree/master/tools/makePictureData

 

正方形画像を表示するパターン:makePictureData.py

こういうデータが

こうなります。正方形から円を切り抜いてデータ作成されるので、四隅の方は表示対象外となります。

表示は半径8ドット(+表示できない中心部分2ドット)なので、複雑な画像だとうまく見えないと思います。

画像をそのまま表示するパターンは、分割数から角度を計算、各角度でのドットデータを計算していくことになります。
以前、M5Stackでハンドスピナーバーサライタ作ったときにもやったことありますのでそちらも参考にしつつ…。

M5Stack:M5Stackスピナーで画像表示
http://shikarunochi.matrix.jp/?p=2649

画像は内部で20×20に変換して処理してます。元画像はでっかい画像でもOKです。


横長の文字をそのまま表示するパターン:makePictureLineData.pymakePictureData.py

こういうデータが

こうなります。元画像は120 x 10 で用意してください。(画像表示パターンと整合性を合わせるために、下2ドットは表示されないです)


引数に画像ファイル名を与えてください。結果は標準出力に出してるだけなのでリダイレクトしてください。

python makePictureLineData.py helloM5_120.png > helloM5_120.h

できあがったファイルをヘッダファイルにして、プログラム側でincludeすればOKです。