M5Stack ATOM Matrix で ハンディーバーサライタを製作 ~ POV1-ATOM ~
前回はM5Stack ATOM Matrixを用い、モータ速度を手動で制御して残像表示するバーサライタを構築しました。
しかし、手動でのモータ速度調整では残像を安定して定位置に表示できませんでした。
そこでここではセンサで回転を検出して描画する手法を試しました。
構成的にはSPI入力LEDテープを使用しているハンディーバーサライタ PovRanianとほぼ同じです。
目次
構成
回転部にM5Stack ATOM Matrixとフォトリフレクタを搭載し、
ワイヤレスチャージモジュールを使って回転部への給電します。
部品
- M5Stack ATOM Matrix
- フォトリフレクタ QTR-1A
-
シュミットトリガインバータ TC7W14FU
- ワイヤレスチャージモジュール
- マブチモーター RS-540SH
POV1-ATOM
取っ手部はPovRanianを流用しました。
取っ手部の白いマーカをフォトリフレクタで回転のたびに検出して回転時間を計測します。
回転部はFusion360でデザインし3Dプリントで作成しました。
デザインの際に ししかわさん が作製したM5Stack ATOM Matrixの3Dモデルを使用させていただきました。
非常に助かりました。ありがとうございます!
#M5ATOM MatrixとLiteのCADデータを ♯Fusion360 で公開しました。端子やボタンの位置確認にご活用ください。
Matrix: https://t.co/ON2DClq51T
Lite: https://t.co/ZLjfV8ZiJ6#M5Stack pic.twitter.com/dKY6XjMDIF— ししかわ (@meganetaaan) April 19, 2020
本当に3Dプリンタは便利!人生が変わりました。
デザイン通りに出力完了。
回転部にはワイヤレスチャージモジュールの受信側も搭載します。
フォトリフレクタ
フォトリフレクタがマーカで遮られるたびに割り込み動作で回転時間を測定する方法を採用しております。
しかしESP32にてフォトリフレクタの出力で割り込みをかけると、以下のようにチャタリングでまともに動きません。
フォトリフレクタが遮られると割り込みで
R→G→B→Yに光らせたいが
やはりESP32同様チャタリング パないのでそうはいかない。#m5atom #M5Stack pic.twitter.com/C4ykPxJObj— HomeMadeGarbage (@H0meMadeGarbage) April 21, 2020
そのためシュミットトリガインバータを挿入してチャタリングを除去しました。
シュミットトリガ挿入で
テンアゲ#m5atom #M5Stack pic.twitter.com/6new6E6PSt— HomeMadeGarbage (@H0meMadeGarbage) April 21, 2020
シュミットトリガインバータ TC7W14FU のパッケージが0.65mmピッチSSOP8でしたので2.54mmピッチ変換基板に実装して使用しています。
Arduinoコード
フォトリフレクタによる割り込みで回転時間を計測して、1周の回転時間を32分割して絵を表示しています。
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 57 58 59 60 |
#include "FastLED.h" #include "graphics.h" #define NUM_LEDS 5 #define DATA_PIN 27 #define itrPin 21 #define Bright 40 int numDiv = 0; int numRot = 0; int numRot2 = 0; int stateDiv = 0; unsigned long rotTime, timeOld, timeNow; CRGB leds[NUM_LEDS]; int rotDivNum = 0; void setup() { Serial.begin(115200); attachInterrupt(digitalPinToInterrupt(itrPin), RotCount, RISING ); FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); FastLED.setBrightness(Bright); } void loop() { if(stateDiv == 1 && micros() - timeOld > rotTime / Div * (numDiv)){ stateDiv = 0; } if(stateDiv == 0 && micros() - timeOld < rotTime / Div * (numDiv + 1)){ stateDiv = 1; for(int i=1; i<NUMPIXELS; i++) { leds[i-1] = pic[numRot2][numDiv][i]; } FastLED.show(); numDiv++; if(numDiv >= Div ) numDiv = 0; } } void RotCount() { timeNow = micros(); rotTime = timeNow - timeOld; timeOld = timeNow; numRot++; if(numRot >= 10 ){ numRot2++; numRot = 0; } if(numRot2 >= Frame ) numRot2 = 0; Serial.println("int"); } |
表示画像データ
表示画像データgraphics.hは前回同様にExcelで生成しました。
動作
POV Display using M5ATOM#M5ATOM #バーサライタ #バーサライター pic.twitter.com/5Phsovezwc
— HomeMadeGarbage (@H0meMadeGarbage) April 22, 2020
やはりセンサできちんと回転を検出すると絵が安定していいですね♪
ちょっとLEDがNeoPixelのためか回転速度が上げられなかったので
デュアルコアで制御などまだまだ検討の余地はございますね。
ものづくりの道にゴール無し。