
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を目指したいです。








