M5 ATOM開発日記その1:まずはLチカ

今までは自宅の温度計測をSwitchbotの温度計でやっていたわけですが、ぼちぼち自分で作ったデバイスでやりたいなぁという気持ちになりまして、M5Stackシリーズの一番小さなマイコンバイスであるATOMシリーズでいっちょ作ってみることにしました。
むかーしArduino Unoでそれっぽいことをしようとしたことはあったんですが、改めてのチャレンジですね。

とりあえず購入したのは、一番ミニマムなデバイスであるATOM Lite、5x5のLEDマトリクス付きのATOM Matrix、そしてGrove規格で接続できる温度センサーの3つです。

 

マイコン触るのも数年ぶりなので、まずは定番のLチカをやって勘を取り戻すところからスタートします。使うのはATOM Matrixの方。

Arduino IDEのセットアップなどは、オフィシャルドキュメントの

docs.m5stack.com

を参考にすればいいので省略。

早速サンプルコードを書き込んでみよう、ということで、Arduino IDEのFile→Examples→M5Atom→Basics→Buttonを選んで出てくるコードを書き込んでみたのですがー。

なんかLEDの表示が欠けてるんですが…?

調べたところ、こちらのページ

pointofviewpoint.linclip.com

曰く、事前にsetWidthHeightをコールしてやる必要があるとのこと。

ということで、サンプルコードのstfBuff関数を以下のように修正。

void setBuff(uint8_t Rdata, uint8_t Gdata,
             uint8_t Bdata) {
    M5.dis.setWidthHeight(5, 5);
    DisBuff[0] = 0x05;
    DisBuff[1] = 0x05;
    for (int i = 0; i < 25; i++) {
        DisBuff[2 + i * 3 + 0] = Rdata;
        DisBuff[2 + i * 3 + 1] = Gdata;
        DisBuff[2 + i * 3 + 2] = Bdata;
    }
}

これを改めて書き込んでやるとー、

はい、全面表示されるようになりました。

 

ただチカチカさせるだけつまらん、ということで、今回は1秒ごとに明滅を繰り返すようなコードを書いてみました。

setBrightnessをコールしたあとでdisplaybuffを呼ばないと、LEDの明るさ変更が反映されないんですね…。

#include "M5Atom.h"

uint8_t
    DisBuff[2 + 5 * 5 * 3];

void setBuff(uint8_t Rdata, uint8_t Gdata,
             uint8_t Bdata) {
    M5.dis.setWidthHeight(5, 5);
    DisBuff[0] = 0x05;
    DisBuff[1] = 0x05;
    for (int i = 0; i < 25; i++) {
        DisBuff[2 + i * 3 + 0] = Rdata;
        DisBuff[2 + i * 3 + 1] = Gdata;
        DisBuff[2 + i * 3 + 2] = Bdata;
    }
}

void setup() {
    M5.begin(true, false, true);
    delay(10);
    setBuff(0x42, 0x8a, 0xf5);
    M5.dis.setBrightness(0);
    M5.dis.displaybuff(DisBuff);
}

void loop() {
  for(int i=0;i<100;i++){
    M5.dis.setBrightness(i+1);
    M5.dis.displaybuff(DisBuff);
    delay(5);
  }
  for(int i=100;i>0;i--){
    M5.dis.setBrightness(i+1);
    M5.dis.displaybuff(DisBuff);
    delay(5);
  }
}

こいつを書き込んだ結果がこちら。上手い具合に行きました。