M5Stack ATOM Matrixでバーサライタ ~ POV1-ATOM ~
前回はM5Stack ATOM Matrixを購入してバーサライタを実現するまでの過程を報告させていただきました。
ここではバーサライタの構成や表示データ生成についてもう少し詳しく記載いたします。
目次
構成
LiPoバッテリ(5Vピンに印可)でM5Stack ATOM Matrixを駆動しモータで回します。
モータはPWMコントローラで回転速度を調整します。
部品
- M5Stack ATOM Matrix
-
LiPoバッテリ 3.7V 400mAh
- マブチモーター RS-540SH
- PWMコントローラ
POV1-ATOM
固定具は3Dプリンタで作成しました。
表示画像データ
M5Stack ATOM MatrixのLED5個をRGBYの4色で順番に発光させて、モータ速度調整しつつ回転させたところ
1周48分割で表示が可能であることが確認できました。
Pythonで画像データ生成
PovRanianと同様に表示したい画像を取り込んで、極座標変換するPythonコードを使用してみました。
#M5Stack #M5Atom pic.twitter.com/9H7VfbPy4w
— HomeMadeGarbage (@H0meMadeGarbage) April 20, 2020
半径方向のLEDが5個しかないので抜けが多く、画像からの変換では美しい表示が難しかったです。
まぁそもそも元画像がよくないのですが。。。
Excelで画像データ生成
原点に返ってExcelでドット画のようにお絵描きして、極座標変換してデータを生成する手法を試しました。
半径方向を6分割としております。M5Stack ATOM MatrixのLEDは5個使用しますので冒頭のデータ(真ん中の画)は使用しません。
以下が生成された表示画像データです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#define Frame 1 #define NUMPIXELS 6 #define Div 48 const uint32_t pic [Frame][Div][NUMPIXELS] = { { {0x000000, 0xF7B95C, 0x000DEB, 0x000DEB, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0x000DEB, 0x000DEB, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0x000DEB, 0x000DEB, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0x000DEB, 0x000DEB, 0xff0000, 0xffff00}, {0x000000, 0xF7B95C, 0x000DEB, 0xff0000, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0x000DEB, 0xff0000, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0xF7B95C, 0xff0000, 0x000DEB, 0x000DEB}, {0x000000, 0xF7B95C, 0xF7B95C, 0xff0000, 0x000DEB, 0x000DEB}, {0x000000, 0xF7B95C, 0xF7B95C, 0x000DEB, 0x000DEB, 0x000DEB}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0x000DEB, 0x000000}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0x000000, 0x000000}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0x000000, 0x000000}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0x000DEB, 0x000DEB}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0x000DEB}, {0x000000, 0xF7B95C, 0x000DEB, 0x000DEB, 0xF7B95C, 0x000DEB}, {0x000000, 0xF7B95C, 0x000DEB, 0x000DEB, 0xF7B95C, 0x000DEB}, {0x000000, 0xF7B95C, 0x000DEB, 0x000DEB, 0x000DEB, 0x000DEB}, {0x000000, 0xF7B95C, 0x000DEB, 0xF7B95C, 0x000DEB, 0x000DEB}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0x000DEB, 0x000000}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0x000DEB, 0xff0000}, {0x000000, 0xF7B95C, 0xF7B95C, 0x000DEB, 0x000DEB, 0xff0000}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0x000DEB, 0x000DEB, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0x000DEB, 0x000DEB, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0x000DEB, 0xF7B95C, 0xF7B95C, 0xff0000}, {0x000000, 0xF7B95C, 0x000DEB, 0xF7B95C, 0xF7B95C, 0xff0000}, {0x000000, 0xF7B95C, 0xF7B95C, 0xF7B95C, 0x000000, 0xff0000}, {0x000000, 0xF7B95C, 0x000DEB, 0xF7B95C, 0xF7B95C, 0x000000}, {0x000000, 0xF7B95C, 0x000DEB, 0xF7B95C, 0xF7B95C, 0x000000}, {0x000000, 0x000DEB, 0x000DEB, 0xF7B95C, 0xF7B95C, 0x000000}, {0x000000, 0x000DEB, 0x000DEB, 0xF7B95C, 0xF7B95C, 0xF7B95C}, {0x000000, 0x000DEB, 0x000DEB, 0x000DEB, 0xF7B95C, 0xF7B95C}, {0x000000, 0x000DEB, 0x000DEB, 0x000DEB, 0x000DEB, 0x000000}, {0x000000, 0x000DEB, 0x000DEB, 0x000DEB, 0x000000, 0x000000}, {0x000000, 0x000DEB, 0xF7B95C, 0xF7B95C, 0x000000, 0x000000}, {0x000000, 0x000DEB, 0xF7B95C, 0xF7B95C, 0x000000, 0x000000}, {0x000000, 0x000DEB, 0xF7B95C, 0x000000, 0x000000, 0x000DEB}, {0x000000, 0xF7B95C, 0xF7B95C, 0x000000, 0x000000, 0x000DEB}, {0x000000, 0xF7B95C, 0xF7B95C, 0x000000, 0x000DEB, 0x000DEB}, {0x000000, 0xF7B95C, 0x000DEB, 0x000000, 0x000DEB, 0x000DEB}, {0x000000, 0xF7B95C, 0x000DEB, 0x000DEB, 0x000DEB, 0x000DEB}, {0x000000, 0xF7B95C, 0x000DEB, 0xff0000, 0xff0000, 0xff0000}, {0x000000, 0xF7B95C, 0x000DEB, 0xff0000, 0xff0000, 0xffff00}, {0x000000, 0xF7B95C, 0x000DEB, 0x000DEB, 0xff0000, 0xffff00}, }, }; |
参考
Arduinoコード
生成した表示画像データをもとにLEDを点灯させます。
ループで次々表示を切り替えています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include "FastLED.h" #include "graphics.h" #define NUM_LEDS 5 #define DATA_PIN 27 #define Bright 30 int FrameNum = 0,Num = 0; CRGB leds[NUM_LEDS]; int rotDivNum = 0; void setup(){ FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); FastLED.setBrightness(Bright); } void loop(){ for(int i=1; i<NUMPIXELS; i++) { leds[i-1] = pic[Num][rotDivNum][i]; } FastLED.show(); rotDivNum++; if(rotDivNum >= Div){ rotDivNum = 0; FrameNum++; if(FrameNum >= 4){ FrameNum = 0; Num++; if(Num >= Frame) Num = 0; } } } |
動作
POV mini Display using ATOM Matrix
“POV1-ATOM”#M5Stack #M5Atommario#nintendo pic.twitter.com/MYN2HDjcEd
— HomeMadeGarbage (@H0meMadeGarbage) April 18, 2020
所望の表示を得ることができました。
画像データを複数用意してアニメーションも可能です。
POV mini Display using ATOM Matrix
“POV1-ATOM”#M5Stack #M5Atomドラえもん。。。。 pic.twitter.com/R1DuEWdZlg
— HomeMadeGarbage (@H0meMadeGarbage) April 18, 2020
しかし手動によるモータ速度調整でのバーサライタ表示はカッコ悪いので、
次回はセンサ追加してもう少しスタイリッシュなPOV1を目指したいです。