PikaPikaLight

主に光モノ工作の忘備録

LEDテープでメビウスの輪を作った

1メートルのRGB LEDテープを点灯させて遊んでいたら、ふと思いついた。
「これでメビウスの輪を作ったら面白そう。」
作ってみました。

材料

LEDテープをメビウスの輪の形にする

まず最初にLEDテープについているごっついコネクタケーブルを外して、M5Atomに簡単に接続できるGroveケーブルに付けなおします。
f:id:PikaPikaLight:20210512201015p:plain まっすぐ半田付けすると切れやすいので、あえて逆方向につけて折り返すという小技を使っています。

メビウスの輪にするなら裏表にLEDが配置されるようにしないと意味ないので、テープを半分の長さで折り曲げます。最初は単純に折り曲げてしまおうと思ったのですが、このLEDテープはちょうど半分のところではんだ付けされていました。
f:id:PikaPikaLight:20210512201029p:plain
72個分のLEDがのっている基板を2枚つないで作られています。冷静に考えると、こんな長い基板どうやって作ってどうやって部品実装しているのだろう??

ハンダをいったん外して裏表にしてはんだ付けしなおします。基板の裏側にもランドがあるので、簡単でした。 両面テープで貼りつけましたが、シリコンチューブだと粘着が弱いので、ところどころセロテープでぐるぐる巻いてみました。 これをひとひねりしてメビウスの輪になるように端と端をつなぎます。セロテープだけでつなぐのは無理だったので、プラバンを補強板にしてセロテープで巻きました。
f:id:PikaPikaLight:20210512201048p:plain f:id:PikaPikaLight:20210512201105p:plain

点灯プログラム

メビウスの輪なのでLED1灯がエンドレスでぐるぐる回るような動きをさせたい。単色では味気ないので、レインボウカラーに変化しながら。
これをM5AtomLiteでプログラムするわけですが、、、
前から気付いていました、M5Stack(ESP32)でAdafruit_NeoPixelライブラリは完璧には動かない事を。 LEDの数が少ない場合はまぁまぁ動きますが、LEDの数が多いと誤動作が目立ちます。
これまでLEDの数が多い場合は別のマイコン(XIAOとか)を使うなどしてしのいでいましたが、この機に向き合うことにしました。

ネット情報からESP32ではFastLEDライブラリを使うといいらしい。 https://github.com/FastLED/FastLED
とりあえずこのライブラリをインストールし、スケッチ例を適当に開いて、ピン番号とLED数だけ変えてM5Atomで動かしてみると、ちゃんとそれらしい動きでLEDが点灯しました
スケッチ例のCylonを動かすとレインボウに変化する点灯動作をしたので、色の変化はこれをマネすれば行けそうです。 あとは1灯を順番に点灯させていくだけですが、メビウスの輪になっているので単純に0~143をつければいいわけではありません。 図に書いて見るとこんな感じになります。 f:id:PikaPikaLight:20210512201649p:plain この変則的な並びをいったん配列に入れておいて、loop()はなるべくシンプルになるようにしてみました。

#include <FastLED.h>

#define NUM_LEDS 144
#define DATA_PIN 26

#define DELAYVAL 20
#define BRIGHTNESS  200
CRGB leds[NUM_LEDS];

uint16_t array_conv[NUM_LEDS] ;

void setup() {

  LEDS.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
  LEDS.setBrightness(BRIGHTNESS);

  uint16_t j = 0;

  for (int i = 0; i < NUM_LEDS / 2; i++) {
    array_conv[j] = i;
    j++;
  }
  for (int i = NUM_LEDS - 1 ; i > NUM_LEDS / 2 - 1; i--) {
    array_conv[j] = i;
    j++;
  }
}

void loop() {
  static uint8_t hue = 0;
  for (int i = 0; i < NUM_LEDS; i++) {
    FastLED.clear();
    leds[array_conv[i]] = CHSV(hue++, 255, 255);
    FastLED.show();
    delay(DELAYVAL);
  }
}

虹色を作っているのは CHSV(hue++, 255, 255)
これでどうやってレインボウカラーの変化になるのか理解してません ^^;
FastLEDに関してはこれからじっくり触っていきたいと思います。 f:id:PikaPikaLight:20210512202836p:plain