M5StackでLED万華鏡を作ってみた
なんとなく思いついて、部品を取り寄せた勢いだけで作ってみました。
M5Stack用NeoPixel互換LED搭載 六角形ユニットで、簡素なLED万華鏡を作ってみた。(1箇所信号不良あり)
— パリピ般若(hack-tenorion) (@hack_tnr) August 2, 2020
小学校の夏休みの宿題でも作れそう。 pic.twitter.com/s3euogI5Qd
材料
- どこのご家庭にもあるM5Stack(AtomやStickCでもOK)
- ミラーシート
- マスキングテープ
- M5Stack用NeoPixel互換LED搭載 六角形ユニット
- M5Stack用Groveケーブル
- (あると尚良し)拡散版
作り方
ミラーシートを1.8mm×10.5mmカットする。6本用意する。
ミラーシートの間隔を約1mm開けて、マスキングテープで止める。
1箇所だけ写真のように深さ3mm程度の切れ目を入れる。
上から見るとこんな状態になります。
M5StackにLED37こをランダム点灯するコードを書き込みます(後述)
拡散板がないので、折りたたんだティッシュペーパーをかぶせてみました。
だいぶ柔らかくなります。
Arduinoコード
37個すべてランダム色にしていますが、色を白ベースにして赤系・青系などに絞ったほうが綺麗だと思います。
せっかくM5Stackを使っているのだから画面にも何か出したかったのですが、空いてるのが画面破損しているものしかなかった。。
#include <M5Stack.h> #include "FastLED.h" #define DATA_PIN 21 #define LED_TYPE WS2812B #define COLOR_ORDER GRB #define NUM_LEDS 37 #define BRIGHTNESS 5 CRGB leds[NUM_LEDS]; uint8_t direction;//0: clockwise 1: anti-clockwise void setup() { M5.begin(true, false, true); Wire.begin(); Serial.begin(115200); FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip FastLED.setBrightness(BRIGHTNESS); showLedCleanUp(1); M5.Lcd.clear(); M5.Lcd.setCursor(0, 0); showLedRandom(500); } void showLedCleanUp(long delayTime) { for (int i = 0; i < NUM_LEDS; ++i) { leds[i] = CRGB::Black; } FastLED.show(); delay(delayTime); } void showLedRandom(long delayTime) { while(1) { for (int i = 0; i < NUM_LEDS; ++i) { leds[i] = CHSV(random8(), 255, 255); } FastLED.show(); delay(delayTime); } } void loop() { }
未解決事件簿
LEDのうち1つだけ(10番)信号の制御がうまくいかず、点灯しないor意図した色にならないという問題がありました。
詳しい方々から教えていただいたのですが、ESP32のあるある問題らしい。。
もしかしたら検索「Fast LED 一部 光らない」などでこのブログに辿り着くことがあれば、以下参考になさってください。
- Adafruits_NeopixelはESP32だと誤点灯が起きる(Arduinoだと問題なし)
- RTOS等入ってないので信号生成系ライブラリはESP32だと大体死ぬ
- AVRだと割り込み禁止にしておけば、正確にCPUとGPIOで信号生成処理出来るが、ESP32だとRTOSとかキャッシュとかいろんな要因で難しい
- パルス幅とかが正確じゃ無いと困る系は、ESP32対応と謳っているものを使うのが無難
10番のLEDだけなんだか動きが怪しい pic.twitter.com/NbXjcKhAva
— パリピ般若(hack-tenorion) (@hack_tnr) August 2, 2020