M5Stack ATOM Matrix で バーサライタを実現するまでの過程
M5Stack ATOM MatrixとM5Stack ATOM Lite を購入いたしましてバーサライタ(POV Display)を実現するまでの過程を紹介させていただきます。
目次
M5Stack ATOM
M5Stack ATOM は以前から発売されており非常にコンパクトで可愛いので気になっておりました。
この度、技適版が2020/4/10に 国内販売されるとのことで早速購入させていただきました。
特にM5Stack ATOM Matrixは25セルのLEDマトリクスが搭載されておりますので、バーサライタできる!と速攻でポチりました。
俺がやらなきゃ誰がやるってんだ (オイラは POV大好き少年だよーーー!)
技適
早速国内販売版のM5Stack ATOMの到着の報告がTwitterのタイムラインに流れてきました。
すると技適シールが貼られていない個体も少数あるとの報告もございました。
スイッチサイエンスさんからM5Atomきたー!
あれ?Atom Matrixには、技適シール貼ってないよ…?箱に番号が書いてあるからOK…って判断で良いのかな? pic.twitter.com/H4kpwrSBqO— Nochi (@shikarunochi) April 14, 2020
ほどなくして購入先のスイッチサイエンスからも”ATOM Matrix 技適表示不備のご案内”という商品交換案内メールも来ました。
“表示のない製品が届いたお客様におかれましては、違法
と非常に恐ろしい内容のメールです。この時点で私の家にはまだ商品は届いておらずドキドキして到着を待ちました。
到着
— HomeMadeGarbage (@H0meMadeGarbage) April 15, 2020
Come on… Come on… YES!
家のATOMは技適シール問題ございませんでしたε-(´∀`*)ホッ
基本動作の確認
M5Stack ATOM Matrixでのバーサライタ実現に向けて基本動作の確認を実施しました。
Arduino IDEを使用してプログラミングいたしました。
ATOM用のArduinoライブラリは以下
https://github.com/m5stack/M5Atom
LED点灯
M5Stack ATOM Matrixには WS2812B-2020 が使用されております。
データピンはGPIO27です。
ATOM用のArduinoライブラリM5Atom.hでも点灯用関数はございますが、まずは実績あるNeopixel用のライブラリで点灯を確認いたしました。
尚、M5Atom.hライブラリ以外での点灯時は輝度に十分お気を付けください。
LEDが25個も載ってますのでsetBrightness[0-255]などで制限しないとマックスで1A以上流れます。
以下はいずれもsetBrightness(20)で実験しています。
FastLEDライブラリ
M5Atom.hでも採用されているFastLEDライブラリで点灯を確認してみました。
https://github.com/FastLED/FastLED
LEDの配列はこんな順序でした。
LED[0]から[24]を順に点灯#M5Stack #M5AtomFastLEDライブラリ使用https://t.co/FNSp4gJ1I6 pic.twitter.com/sDlr8lTqYB
— HomeMadeGarbage (@H0meMadeGarbage) April 15, 2020
問題なく点灯とLEDの配置順の確認ができました。
Adafruit NeoPixelライブラリ
Adafruit_NeoPixelライブラリも確認してみました。
サンプルコード strandtest.ino を書き込んでみました。
Adafruit_NeoPixelライブラリも問題なく動きましたね#M5Stack #M5Atom
ESP32のタイミングエラーによる点灯不具合あると思ったのですが。https://t.co/NrrcakSks9 pic.twitter.com/Pl8WvV2uHY
— HomeMadeGarbage (@H0meMadeGarbage) April 15, 2020
コチラも問題ありませんでした。
ESP32でNeopixelを点灯させるとESP32のタイミングエラーによる点灯不具合があったりするのですが。なんで問題なく点灯するんだろ?
まぁOK!
追記(20/4/21)
やはりAdafruit_NeoPixelライブラリだとESP32同様に点灯不具合ありました。
電源
M5Stack ATOMはバッテリが内蔵されておりません。
USB-Cケーブルの接続で当然 給電され起動するのですが、バーサライタでぶん回すに際してケーブルつけっぱなしにもできないので給電方法検証しました。
M5StickCからもLiPoバッテリからも給電できた!#M5Stack #M5Atom #M5StickC pic.twitter.com/uAEtbXNSTM
— HomeMadeGarbage (@H0meMadeGarbage) April 15, 2020
上記2種の方法共に問題なく給電できました。
正確で安全な給電方法を実施するには内部回路の把握が必要ですので回路が知りたいところです。
公式によるとまもなく公開されるとのことです。楽しみ♪
Soon
— M5Stack (@M5Stack) April 14, 2020
参考
バーサライタ検討
さて基本的な動作を確認できましたので本題のバーサライタの実現に向け動きたいと思います。
LED点灯
まず3Dプリンタで固定具を作ってぶん回してみました。
FastLEDライブラリでLED5個を赤→緑→青→黄とループで切り替えるだけです。
POV using ATOM Matrix#M5Stack #M5Atom
色切り替えは定時で適当
ちょっとモータ早すぎかな。でもイケそう
出来れば加速度センサで回転検出したいな pic.twitter.com/mPXlfIydng— HomeMadeGarbage (@H0meMadeGarbage) April 15, 2020
すんなりうまいこと表示できましたw
Neopixelでのバーサライタは初めてでしたが WS2812B-2020 のリフレッシュレートは2kHzとのことでバーサライタへの使用も問題ないようです。
LiPoバッテリで電源供給(5Vに印可)しています。
ちなみにM5Atom.hを使用してM5.dis.drawpixでの点灯も試してみました。
FastLEDライブラリを使用するとM5Atom.hとの共存がうまくいかない。
M5.dis.drawpixだと都度点灯してしまうので動画のように遅く美しい放射線を描けない#M5Stack #M5Atom pic.twitter.com/Kcouqi10lm
— HomeMadeGarbage (@H0meMadeGarbage) April 16, 2020
どうもM5.dis.drawpixでは点灯までに時間を要するらしくきれいな表示ができませんでした。。。
あと赤と緑の点灯が逆になってます(多分バグ)。
バーサライタとしてはFastLEDライブラリを直に使用するほうが良さそうです。
回転検出
回転を正確に検出することで安定した画像を表示することができます。
出来ればATOMに外部センサを追加したくないので(かわいらしさがそこなわれるため)内蔵の慣性センサ MPU6886 で回転検出できないかテストしてみました。
まずはM5Atom.hのMPU6886ライブラリのgetAhrsDataで姿勢角を使おうと思ったのですがオフセットが大きいためか値が安定していませんでした。
どうもジャイロのオフセットが大きいようでずーっと値がドリフトします。
校正すればよいのでしょうがやり方がわからないので、ここでは加速度センサの値を使って検証してみました。
回転しながらの加速度センサの値を検証しました。
MPU6886ライブラリのgetAccelDataでx, y, z軸の加速度を取得してUDPで送信して観測しました。
UDP送信は以下のサンプルコードを参考にしました。
WiFiUDPClient.ino
x, y軸(平面方向)の加速度値は回転による遠心力の影響で使い物になりませんでしたが、回転時のZ軸の加速度値をプロットしてみました。
何となく上下に波打ってるので回転を検出できそうですね。
早速 Z軸の加速度の値の上下を検出して1周する時刻を導出してRGBYを4分割表示してみました。
何とか加速度センサで回転検出するべく粘ったが厳しい
下の動画は1周を4分割してRGBY表示しようとしている。
プランBに移行します。
プランCの外部センサ追加は絶対避けたい。。。#M5Stack #m5atom pic.twitter.com/BtiEuEuzHU— HomeMadeGarbage (@H0meMadeGarbage) April 18, 2020
ダメですね。。。やかり加速度のみで回転検出はムリがありそうです。
ちなみにM5Atom.hで慣性センサを使用しているのですが、M5Atom.hとFastLEDライブラリが競合してしまうようで、ここでは泣く泣くM5.dis.drawpixでLED点灯しています。
ということで慣性センサによる回転検出はあきらめました。
以下の項目を今後の課題とさせてください。
今後の課題
- MPU6886の校正方法の学習
- MPU6886による姿勢角取得高速化
- M5Atom.hとFastLEDライブラリの共存
バーサライタ動作
慣性センサによる回転検出は一旦あきらめまして、モータ速度をマニュアル調整して表示させる方法で動かしてみました。
ドラえもん
POV mini Display using ATOM Matrix
“POV1-ATOM”#M5Stack #M5Atomドラえもん。。。。 pic.twitter.com/R1DuEWdZlg
— HomeMadeGarbage (@H0meMadeGarbage) April 18, 2020
マリオ
POV mini Display using ATOM Matrix
“POV1-ATOM”#M5Stack #M5Atommario#nintendo pic.twitter.com/MYN2HDjcEd
— HomeMadeGarbage (@H0meMadeGarbage) April 18, 2020
1周48分割で表示させています。まぁまぁできてるのではないでしょうか。
長くなりましたので、表示するためのプログラムコードや表示データの生成方法などは別段で報告させていただきます。
追記
バーサライタ完成 (2020/4/23)
贅沢なる2個使い (2020/5/3)
ミニバーサライタ POV2-ATOM
M5ATOM Matrixを贅沢に2個使用#MFKyoto2020 #作品発表 #M5Stack #M5ATOM#バーサライタ #バーサライター pic.twitter.com/Iek73Ch1gD— HomeMadeGarbage (@H0meMadeGarbage) May 2, 2020
Maker Faire Kyoto Online にて発表しました。
LED直列25個使い (2020/6/10)
ATOM MatrixのLEDマトリクスの1列(5個)しか使っておらず、もったいないので
ぶったぎって1列25個のLEDバーにしてバーサライタを楽しみました。