PikaPikaLight

主に光モノ工作の忘備録

立方体万華鏡を3D CADでデザインしてみた

f:id:PikaPikaLight:20210530194351p:plain

はじめに

立方体万華鏡の説明と作り方はこちらの過去記事を参照ください。 pikapikalight.hatenadiary.com

違う模様のものを作りたいと思ったのですが、模様は鏡の裏面を削ることで作るので簡単に試すことができません。 そこで3D CADを使って簡単にシミュレーションすることを考えました。

3D CAD

今回使用したのはRSのDesignSpark Mechanicalです。 www.rs-online.com 3D CADに詳しいわけではないですが、このCADは自分が使ってるごく普通のノートPCでも軽々動いて、オペレーションも直感的なので愛用しています。

ポイント

DesignSpark Mechanicalの基本的な操作方法はクイックガイドに従って練習すれば簡単に習得できると思います。
立方体万華鏡をデザインするにあたってのポイントのみ解説します。

正方形の面に図柄を書く

f:id:PikaPikaLight:20210530200935p:plain

面をコピーして3面合わせる

3Dモードにすると書いた図柄は一つの面(Surface)になります。これをコピーして実際の配置に合わせます。 f:id:PikaPikaLight:20210530202741p:plain

3つの面を1つのコンポーネントにする

3つの面を選択して右クリック→新規コンポーネントに移動 とすると1つのコンポーネントとして扱うことができます。 f:id:PikaPikaLight:20210530203043p:plain こうすることで簡単にコピーできるようになります。

コンポーネントをコピーして1ブロックを作成する

コピーして移動して回転してを繰り返してこのような図形を作成します。 f:id:PikaPikaLight:20210530203720p:plain

コンポーネント8個をコンポーネントにしてさらにコピー

複数のコンポーネントをさらに1つのコンポーネントにすることができます。 f:id:PikaPikaLight:20210530204202p:plain
これをコピーして移動してを繰り返してこのようにします。 f:id:PikaPikaLight:20210530204404p:plain
これをCAD上でグリングリンすることで実際の万華鏡をシミュレーションすることができます。

新しいデザインを考える

CADを使うことでデザインをシミュレーションできるようになりました。
誰もやっていなそうなデザインを考えて実際に作ってみました。

【プチ100均分解】ダイソーの光る忍者刀を分解してみた

初めに

分解のススメをつい最近知って、バックナンバー動画を見ているのですが、これがとても面白い。 特にThousanDIYさんの「100円ショップのガジェットを分解してみる」が好きです。
note.com 今回、100均のおもちゃを改造するために分解してみたのですが、単純なものなのに色々面白かったので記事にしてみました。

ダイソーの光る忍者刀

f:id:PikaPikaLight:20210525202118p:plain

  • 200円(税別)

  • スイッチ入れると赤と緑に刀身が光る(LED4個)

  • 刀を振ると音が鳴る。「ポキーン」、「プイーン」の2種類。
    (自分の感覚で文字化するとこんな音)

これを改造して得意のLEDテープを仕込んで色変わりの刀に改造しようと購入しました。

それはそれでこのようにできたのですが、この時はLEDテープを仕込むことだけ考えて、音が出る機能を完全に無視して、早々にスピーカーを外してしまいました。

これの2本目の改造品を作るにあたり、音が出る機能を活かしたいと思ったのですが、改めていじってみるとこれがなかなかに不思議な仕組みで、軽く振っただけでは音はならず、ある程度の衝撃を与えないと音がでないという、えっ?これどうやってんだろ?な代物だったのです。

本体の分解

f:id:PikaPikaLight:20210525204728p:plain ネジはこの6点です。刀のつばを上にずらすと隠された2つのネジがあります
あけるとこうなってます。 f:id:PikaPikaLight:20210525205231p:plain

振動センサ

まず一番の謎だった振動センサを調べました。 f:id:PikaPikaLight:20210525205700p:plain これが正体でした。筒の中にもう一つの筒があってこれが接触することで導通するというメカニカルなセンサでした。
これが、軽く振っても反応せず、強い衝撃時のみ反応する仕組みだったのです。
自分的に初めてこのようなセンサを見て、軽く感動しました。これだけで200円の価値はあると思いました。

LED

LEDはこのような針金に直接はんだ付けされているという大胆な構造でした。 f:id:PikaPikaLight:20210525210454p:plain ただよくよく見ると、針金がわざと段差をつけて切断されています。アノード側は長く、カソード側は短くなるように切断されていました。こうすることでワイヤーをはんだ付けするときにどちらに付けるか判別できるようになっているのだと思います。ちょっとした生産技術なのでしょうが、こうした技術に触れることは新鮮で、分解の楽しさを感じました。

回路図

せっかくなので回路図にしてみました。 f:id:PikaPikaLight:20210525211553j:plain 電源ラインにはちゃんとポリスイッチ(多分)入ってます。LEDの針金配線の危険性を加味した設計でしょうか。
振動センサにパラで入っている0.1uFはチャタリング対策でしょうか。
単純な回路ですが、面白いです。「分解とは設計者との対話である」という言葉を実感します。

次回予告

分解して回路が分かったので、音が出る仕組みを活かしてこんなの作ってみました。 次回はこれの作り方を解説したいと思います。

Adafruit_NeoPixelとFastLEDライブラリのサンプルを撮ってみた<LEDテープ編>

WS2812B LEDテープを愛用している私。
ArduinoだとAdafruit_NeoPixelとFastLEDライブラリが基本と思います。
LEDテープの点灯パターンの参考になりそうなサンプルスケッチを片っ端から動作させてみて動画記録してみました。

環境

WS2812B 32個
Seeeduino XIAO
Adafruit_NeoPixel Ver.1.8.0
FastLED Ver.3.4.0

LEDを撮影するのは難しく、なるべく色変化がわかりやすいように透明プラ板を横に置いて反射させてみました。
BRIGHTNESSの設定は20くらいに下げています。 f:id:PikaPikaLight:20210516103521p:plain

目次

Adafruit_NeoPixel

FastLED

Adafruit_NeoPixel

RGBW用なのでWS2812ではちゃんと動かない?

FastLED

【作品まとめ】M5Stackでかめはめ波

ホログラム で面白いことできないかなと思っていた時にこれを見ました。 www.youtube.com

こんな凄いことは簡単にはできないけど、M5Stackを使ってそれっぽいことはできるんじゃないかと思って作った作品。


f:id:PikaPikaLight:20210513210929p:plain

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

TWELITE CUEとM5Atomで玄関のカギの開閉状態監視システムを作った

初めに

外出先で「玄関のカギかけたっけ?」となる心配性な私。鍵の状態をスマホでチェックすることができたら超便利だと思う。
Qrio みたいなスマートロックを付けるという方法もあるが、開け閉めまでできなくてもいい(なんか不安だし。そんな私は心配性)
単純にカギかかっているかだけを確認できる仕組みが欲しい。
今年のゴールデンウィークもどこにも行けそうになくてヒマそうなので、自作してみた。

設計図

うちの玄関ドアのカギは2か所についているので2つモニターする必要あり。 f:id:PikaPikaLight:20210506074431p:plain

開発環境、アプリバージョン

windows10
ArduinoIDE v1.8
TWE Programmer v3.7.5
App_Wings_MONOSTICK_BLUE_L1304_V1-1-4.bin

TWELITEについて

モノをつなぐ無線マイコンモジュール TWELITE-トワイライト - MONO-WIRELESS.COM
TWELITEはIEEE802.15.4(2.4GHz)規格の無線マイコンで、手軽に複数の子機の無線網を構築できるのが特徴です。
自分的には5年ほど前、まだモノワイヤレス株式会社に分社化される前の東京コスモス電機の時代にTWELITEをいくつか使用したことがありました。その時はTWELITE 2525(ニコニコ)という、コイン電池で動いて加速度が取れるモジュールを3Dプリンタのフィラメントロールにつけて、3Dプリンタが途中で止まっていないかをロールの回転による加速度変化でモニターして、止まったらアラームを出すといったことをしたりしてました。

今回、鍵のモニターも2525に磁気センサつければできるなと漠然と考えていて、久しぶりにTWELITEのホームページを見たところ、すごく進化していて、新製品がいっぱいでした。
そして2525はすでに新規採用非推奨品となっていたのですが、なんと後継機TWELITE CUEは磁気センサを搭載しているではないですか。モノワイヤレスさん素晴らしいです。
加速度、磁石センサータグ TWELITE CUE-トワイライトキュー | MONO-WIRELESS.COM

材料

製品名 価格 用途
M5Atom Lite 1287円 Wi-Fiでインターネット接続
TWELITE CUE(Blue) 2481円 x2台 無線子機(磁気センサ)
TWELITE DIP(Blue) 1980円 無線親機
TWELITE R2 1500円 TWELITEの設定、アプリ変更に必要
  • 価格は2021/5/5現在のものです。

  • TWELITEには標準出力のBLUEと高出力タイプのREDがあります。値段的にREDのほうが1.5倍くらい高いです。

  • 自分はTWELITE DIP(旧製品の基板アンテナ型)とTWELITE R(2でなく旧型)とM5Atomを持っていたので、今回購入したのはTWELITE CUE2台だけです。

その他必要なもの

  • コイン型電池(CR2032) 2個:TWELITE CUE用
  • ブレッドボード:TWELITE DIPとM5Atom の接続用
  • マジックテープ:TWELITE CUEをドアに貼り付ける用

作り方

TWELITE CUEの設定

設定変更はインタラクティブモードで行います。 TWELITE CUEにTWELITE R2を接続し、TWELITE STAGE APPを使えばできるようです。その辺はホームページに詳しく記載されているので省略します。
自分の場合は旧製品であるTWELITE Rを使ったために、すんなりはいきませんでしたが、ちゃんと旧製品も使えるように詳細情報が記載されていました。モノワイヤレスさんのこういうところは信頼できてよいです。
USBアダプター TWELITE R-トワイライター - MONO-WIRELESS.COM
TWELITEプログラマというソフトを使うことで、TWELITE RでもCUEとの接続ができました。

肝心の設定内容ですが、変更するのは少なくとも4か所です。 f:id:PikaPikaLight:20210505193613p:plain
これが初期設定値ですが、変更するのは

a アプリケーションID
このIDが同じ端末同士で通信を行います。
初期値のままでもいいですが、もしもご近所でTWELITEを使っている人がいた場合、お互いに迷惑かけることになるので違う番号に変更したほうがいいでしょう。(もし近所で使っている人がいればお友達になりたいですが)
使える番号には制約があります。詳細はこちら
TWELITE APPS - インタラクティブモード - MONO-WIRELESS.COM

i 論理デバイスID
子機につけるナンバーです。同じセンサーの子機が複数あってもこの番号で個体識別できます。
今回は2台の子機を使うので、に設定しておきます。

t 送信間隔の設定
定期送信の送信間隔を秒単位で設定します。1〜4095の値で指定可能。
初期値は5なので5秒おきに通信されます。これはあくまで定期送信の話で、開閉センサーパルモードの場合、磁気センサの値に変化があった場合にも送信してくれます。なので定期送信は別になくてもよく、最大の4095秒(68分)でもいいのですが、 送信受信で取りこぼしが出る可能性を考えると60秒くらいが適当かと思います。(心配性アゲイン)

p センサ固有パラメータの設定
これは今回、開閉センサーパルモードを使うので、04000000を設定します。

設定変更後はコマンド Sで忘れずに保存しましょう。

TWELITE CUEの設置

f:id:PikaPikaLight:20210506075646p:plain

TWELITE DIPの設定

TWELITE DIPはまず親機用のアプリを書き込む必要があります。
書き込むのは親機・中継機アプリ(App_Wings)です。ホームページではMONOSTICK 用とありますが、TWELITE DIPに書き込んでも特に問題なく動きました。
TWELITE R2とTWELITE STAGE APPを使えば多分簡単にできることでしょう。

アプリを書き込んだらインタラクティブモードで設定変更をします
f:id:PikaPikaLight:20210505180033p:plain
これが初期設定値です。
変更するのは a アプリケーションIDだけです。CUEに設定した番号と同じものに変更します。

TWELITE DIPとM5AtomLiteの配線

Groveコネクタ使って配線できればよいのですが、TWELITEの電源は3.3VなのでGroveの5V電源は使えません。
M5Atomの背面のソケットピンを使うことになりますが、ブレッドボードを使うのが簡単です。(ワイヤーで結線してももちろんかまいません)
接続はわずか3ピンでOK。電源(3.3V)とGNDとTWELITEのUART TX→M5AtomのUART RXです。
f:id:PikaPikaLight:20210505204234p:plain f:id:PikaPikaLight:20210505204417p:plain

M5AtomLiteのプログラム

電文のデコード

まず受信電文を確認するために、単純に受信した値をそのままprintさせてみます。

#include "M5Atom.h"
void setup()
{
  M5.begin(true, false, true);
  Serial.begin(115200);
  Serial2.begin(115200, SERIAL_8N1, 21, 25);// RX=21 TX=25(TXは使わないので適当)
}
void loop()
{
  char c;
  if (Serial2.available() > 0 ) {
    c = Serial2.read();
    Serial.print(c);
  }
}

CUEに磁石をつけたり離したりして通信が来るのを確認します。
こんな電文が確認できました。

:800000004E0006810BFF090180810311300802099C1130010204A900000001026D42
:80000000480007810BFF090180810311300802099C1130010204A900000001005D59
:800000006C000B810BFF090180810311300802099C1130010204F70000000101B08F
:800000006F000C810BFF090180810311300802099C1130010204BA00000001818078

バイナリをアスキーにした電文が来ます。
電文の詳細はホームページに記載されています。パルアプリ - WINGS
必要な情報は3つ

  • 番号5 送信元の論理デバイスID

  • 番号d データ(子機の電池電圧(mV))

  • 番号n データ(磁気センサの状態 )
    0x00=近くに磁石がない
    0x01=N極が近い
    0x02=S極が近い
    0x80= 定期送信

    今回は磁気センサしか使っていないので、単純に:から始まる電文の文字数で必要なデータを取り出すことができます。
    余裕があれば拡張性がある作りにしたいところでしたが、今回はとりあえず決め打ちでプログラムしました。(とりあえずで作ったプログラムが直されることはほぼないが)

    IoTサービスへの考慮

    センサーからデータ受信するたびにIoTサービスへインターネット通信するのが最も簡単ですが、フリーで使えるIoTサービスはデータの更新間隔や一日のデータ数などに制約があることがほとんどです。
    とあるフリーのIoTサービスは1日3,000件(約30秒間隔)、データの送信は最低5秒あける必要があるとの条件でした。それを考えると単純に受信したら投げるという作りにはできません。その条件を満たす実装を考えます。
    基本的には1分程度に1回、定期的にその時の状態を送るでいいと思いますが、問題はカギが開き閉めされた時です。
    1分に1回だとその間の開き閉めを見逃す可能性があります。それは避けたい。 特にドアの上側のカギはメインで使われるので、ここが閉→開の動きをした場合は確実にデータアップしたい。
    そういった考えを盛り込んで最終的なプログラムをしました。

    コード

    Wi-Fi接続およびIoTサービスへのデータ送信に関してはあえて省いています。(あまりにプライベートなものなので) ここまで出来る人であればこの先のIoT化はできるでしょう。

#include "M5Atom.h"

#define SENSOR_NUM   2
#define OPEN    1
#define CLOSE   0
uint8_t door_lock[ SENSOR_NUM ] = {0};
uint16_t batt_vol[ SENSOR_NUM ] = {0};

unsigned long send_time = 0;
uint8_t door1_before = CLOSE;

void setup() {
  M5.begin(true, false, true);
  Serial.begin(115200);
  Serial2.begin(115200, SERIAL_8N1, 21, 25);// RX=21   TX=25
  send_time = millis();
}

void loop() {
  char str[70]; //受信用配列
  int str_len;
  unsigned long now_time;

  if (Serial2.available() > 0 ) {
    str_len = Serial2RecvStr(str);
    if (str_len != 69) {
      return;
    }

    //Serial.println(str);
    char id[] = {str[23], str[24], '\0'};
    char bat[] = {str[39], str[40], str[41], str[42], '\0'};
    char door[] = {str[64], '\0'};
    int id_num = atoi(id);
    int bat_mv = strtol(bat, 0, 16);
    int d_num = atoi(door);

    switch (id_num) {
      case 1:
        if (d_num == 0 ) {
          door_lock[0] = 0; //door close
          door1_before = CLOSE;
          M5.dis.drawpix(0, 0x000000);
        } else {
          door_lock[0] = 1; //door open
          M5.dis.drawpix(0, 0x00f000);//開いている場合赤LED点灯
          if (door1_before == CLOSE) {
            while (1) {
              now_time = millis();
              if (send_time > now_time) { //飽和対策
                send_time = 5000;
              }
              if (now_time - send_time > 5000) {
                send_mes();
                break;
              }
            }
          }
          door1_before = OPEN;
        }
        batt_vol[0] = bat_mv;
        break;
      case 2:
        if (d_num == 0 ) {
          door_lock[1] = 0; //door close
        } else {
          door_lock[1] = 1; //door open
        }
        batt_vol[1] = bat_mv;
        break;
    }
  }
  now_time = millis();
  if (send_time > now_time) { //飽和対策
    send_time = 60000;
  }
  if (now_time - send_time > 60000) {
    send_mes();
  }
}

void send_mes(void) {
  Serial.print("door1 = ");
  Serial.println(door_lock[0]);
  Serial.print("bat1 = ");
  Serial.println(batt_vol[0]);
  Serial.print("door2 = ");
  Serial.println(door_lock[1]);
  Serial.print("bat2 = ");
  Serial.println(batt_vol[1]);

/*
 ここにIoTサービスへのデータ送信を記述すればよい
*/

  send_time = millis();
}
int Serial2RecvStr(char *buf)
{
  int i = 0;
  char c;
  if (Serial2.available() > 0 ) {
    c = Serial2.read();

    if (i == 0 ) {
      if (c == ':') {
        buf[i] = c;
        i++;
      } else
        return 0;
    }

    while (1) {
      if (Serial2.available() > 0 ) {
        c = Serial2.read();
        if ( (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') ) {
          buf[i] = c;
          i++;
        } else {
          return 0; // ERROR
        }
        if (i == 69) {
          buf[i] = '\0';
          return i;
        }
      }
    }
  }
}

動作の様子

TWELITE DIPとM5AtomLiteの設置

電源はM5AtomのUSB端子で給電しますのでUSB電源ポートが必要です。
自分は最初、ドアから距離5mほど高さ2mほどにあるWi-Fiルータ(通称:カニルータ)のそばに置いてみたのですが、下側のカギにつけたセンサからの無線が不安定でした。上側のカギは問題なし。無線機の特性として地面に近いところに設置したものは通信距離が悪くなるので、多分そのせいだと思います。設置場所を変えてドアの近くに設置したら両方とも問題なく受信できました。Wi-Fiカニルータのおかげもあって余裕でつながりました。
ブレッドボードに挿してあるだけなので、テープで固定してタッパ的なケースに入れて完成としました。

最後に

今回はカギの状態だけを見ていますが、M5AtomのGroveコネクタも空いていることなので、何か他のセンサを追加して本格的なIoTをしてみるのも面白いと思っています。
今回のプログラミングはいわゆるゲートウェイを作るもので普段なじみがなく、我ながら不細工なコードだと思いますが、目標の期間で動くものができたのでよしとします。
TWELITE CUEの電池寿命はホームページページによると「1日に200回の開閉を行なった場合、約4年です。」とありますが、実際にどのくらい持つのか楽しみです。
稼働日:2021/5/4

立方体万華鏡をLEDテープを使ってピカピカさせてみた

f:id:PikaPikaLight:20210502151227j:plain

立方体万華鏡 CUMOS

ヤマザキミノリ氏 が発明された立方体万華鏡 CUMOS という、鏡を6面組み合わせて作る、とても幻想的な万華鏡があります。


私がCUMOSを最初に知ったのはこのツイートです。作り方の動画もありました。

こちらでは色を付けるのにマジックを使っていますが、これをカラーLEDでやったらキレイなんじゃないかと思って実際に作ってみました。

材料

作り方

まずはCUMOSを作成します。

CUMOSの作り方を紹介しているページがありますので、そちらを参考にして作成しました。
おうちで自由研究道場【立方体万華鏡】
国立大学56工学系学部ホームページ
こちらではマジックやセロハンで色を付けていますが、その代わりにLEDテープを使用します。


鏡に線傷をつけたところにWS2812B LEDテープ を貼ります。

WS2812B LEDテープ はハサミで好きなところをカットして分割できるようになっていますので、鏡の大きさに合わせてカットし、ワイヤーをはんだ付けして配線します。 こんな感じです。(雑な工作ですいません) f:id:PikaPikaLight:20210502154804p:plain M5Atom Lite への接続はGroveケーブルの片方を直接LEDテープ にはんだ付けしました。
f:id:PikaPikaLight:20210502160008j:plain
これでハードは完成です。 f:id:PikaPikaLight:20210502170204p:plain

コード

ArduinoでプログラムしてLEDテープを点灯させるわけですが、 Adafruit_NeoPixelライブラリのサンプルプログラムをそのまま使うのが簡単です。 ただし、M5Atomに使われているESP32マイコンだとAdafruit_NeoPixelライブラリは完璧には動作しません。LEDの数が多いと誤点灯します。今回は誤点灯してもそれほど影響ないので、このライブラリを使いました。 github.com githubからライブラリのZIPをダウンロードし、ArduinoIDEにてライブラリインクルードをします。
サンプルプログラムのstrandtestがいい感じの点灯パターンです。 f:id:PikaPikaLight:20210502161712p:plain

修正するのは2か所だけ。LED制御信号のピン番号とLEDの数の設定だけ直せばOKです。 LED_PIN はM5AtomのGroveポートの26番ピンを使っているので26に、
LED_COUNT は今回72個使っているので、そのように修正します。

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1:
//#define LED_PIN    6
#define LED_PIN    26

// How many NeoPixels are attached to the Arduino?
//#define LED_COUNT 60
#define LED_COUNT 72

プログラムを書きこめば完成です。
strandtestによる点灯パターンの様子はこちら

消費電流確認

WS2812B LEDテープを使用するときは消費電流に気を付ける必要があります。
strandtestプログラムで72個使った場合の消費電流を簡易的にUSB電流計で測ってみました。
M5Atomの分も含めて最大320mA@5V でした。結構大きいですが普通のモバイルバッテリーで給電可能な値でした。 これ以上だとちょっと気にしないといけないと思うので、プログラム改造するときはこれ以上明るくしないよう注意必要と思います。

ツイッターにあげた動画