鳥なき里のマイコン屋(116) M5ATOM Lite到着、ビルド環境セットアップ

Joseph Halfmoon

無線通信機能が無いボード類を無線ネットワークに参加させるべく、適当なデバイスを物色していたのであります。今回購入してみましたのは、M5Stack社のATOM Liteというデバイスです。ちゃんとシャーシに入っていますが24mm角の小ささ。とりあえず第1回は開発環境をセットアップし、単品にて動作確認いたしました。

WiFiあるいはBluetoothの無線通信機能を付加したいという場合、今やEspressif社のESP32系のデバイスが定番じゃないでしょうか。何と言ってもそのお値段が魅力です。その上、人気もあっていろいろソフトウエア環境も揃っているので、お楽です。コスパと大きさだけを考えればモジュールで購入してボードに載せるのが一番でしょう。しかし、表面実装品なので手元で「電子工作」するときには扱い難いです。そこでブレッドボードに刺さる形のブレークアウト基板品なども販売されています。でもね、そうするとちょっと大きさがね。そんなときに M5Stack社からESP32 PICOコアの「ちょうどいい」感じの小型デバイスが出ていることに気付きました。

ATOM Lite

であります。正確にいうとこのATOMシリーズは「3兄弟」で

  • 「バニラ」な感じのLite
  • Matrix LED搭載のMatrix
  • スピーカとマイク搭載のECHO

があります。MatrixのLEDは5×5サイズでmicro:bitとも通ずるものがありますが、赤一色のmicro:bitに対してATOM Matrixは「フルカラー」です。またECHOは、この小ささでAIスピーカ的な利用法を狙っているみたいです。今回購入は「ともかく通信できればよい」ということでLiteですが、それでもいろいろできそうな感じがします。Liteの具合が良かったら次はECHOあたりを試すのも良いかもしれません。

以下に ATOM Liteの入って来たパッケージの空箱の横に本体を並べた写真を掲げます。下の実線が1cm角なのでその小ささが分かると思います。

M5ATOMLite Packageただね、つい気になってしまうのが、つまらない事なんだけれどパッケージに貼り付けてあるシールの「タイポ」。中央付近、Socketのところです。”TpyeC”、こういう所から「品質管理体制」問うような煩いオヤジもいるかも知れない。むむっ、考え過ぎか。

開発環境としては以下の2つが利用可能です。

  • UI flow
  • Arduino

UI flow は、Blockを積むスタイルのビジュアル環境で、裏で走るのはPythonです。「Blockを積む」のも「MicroPython」も別シリーズでやっているのですが、現在、別なデバイスでやっているので Lite での UI flowの適用はまた後といたします。今回は、伝統のArduino環境で行いたいと思います。ただ、Arduinoといっても ESP32 の場合は裏で FreeRTOS という「モダンOS」が走っています。実際FreeRTOSの機能を使うことも可能だと思います。

ATOM Liteに対して Arduino 環境をセットアップする場合は以下のディレクションに従えば簡単です。特に、M5StackやM5StickCを既に使っている場合にはライブラリの追加だけで済んでしまいます。

Arduino IDE Development

今のところ、ATOM Liteということでボードは設定されておらず、ボードとしては、M5StickC(Plusではない方)として設定するのが良いようです。これに Arduino IDEのライブラリマネージャから「 M5Atomライブラリ」を追加すればOK(ではなかった。)見落としていた1箇所、上記の文書から引用させていただきます。

Search M5Atom find it and click Install, to use LED, you may need to install FastLED library

FastLEDライブラリというものもインストールしておかないといけません。忘れると以下のようなエラーが出るでしょう(LED光らせようとするならば。)

~パス~\Arduino\libraries\M5Atom\src/M5Atom.h:52:21: fatal error: FastLED.h: No such file or directory

compilation terminated.

FastLED libraryは Arduino IDEのライブラリマネージャからインストールできます。FastLEDライブラリについてはこちら。ATOM Lite搭載のSK6812という制御IC内蔵のフルカラーLEDはライブラリのSupported LED chipsetsには掲載されていないですが、ちゃんと動作するし、問題ないでしょう。ATOM用のAPIは以下にあります。基本部分はM5StickCのAPIを参照すれば良いのではないかと思われます。

ATOM LibraryのAPI

LiteのHello world的なサンプルプログラムは以下じゃないかと思われます。1個しかないキーを使ってLEDの色を変えるプログラムです。

サンプルプログラム LedSet.ino

上記のプログラムをベースにさせてもらって、以下の機能を追加したプログラムを走らせました(全ソースを末尾に掲げました。)

  1. キーを押したときに色を変えるだけでなく明るさも少しづつかえる
  2. デバッグ用のUSBシリアルにその時の色設定値を出力する

なお、ちょっと引っかかったのが色指定のためのCRGB型です。私はこの手の制御IC内蔵のフルカラーLED使ったことが無かったので、RGBというからには、ビット配置の上位から順にR,G,Bじゃないのと勝手に思っていたのです。実際には各8ビットのフィールドで上位からG、R、Bの順番でした。合計24ビットで指定です。

末尾のプログラムを実行し、一つしかないボタンをプチプチ押していくと、USBシリアルには以下のようなメッセージが垂れ流されます。

M5Atom Lite setup
Brightness: 0x01 Color: Green
Brightness: 0x01 Color: Red
Brightness: 0x01 Color: Blue
Brightness: 0x01 Color: White
Brightness: 0x09 Color: Green
Brightness: 0x09 Color: Red
Brightness: 0x09 Color: Blue
Brightness: 0x09 Color: White

LEDの明るさを最小の1から8づつ増やしているのですが 0x01 のような小さな値だと暗くなるというより、点滅して見えます。これは内部の制御ICがPWMで「明るさ」をコントロールしているからだと思います。マイコンのPWMで直接フルカラーLEDの端子を制御した回を思い出しました。単色で0x11だと点滅は分かり難いですがまだ微妙に点滅。0x19になると点滅感じられないです(老眼の目には。)なお、やはりblueは他色より暗めなので、綺麗な色を出すときは駆動数値を調整した方が良いかもです。

単体での動作確認はできたので、次回からWiFi無線を使って行きたいと思います。また、このLiteの良い所として一回り大きいM5StickCよりも取り出せる端子機能が充実しているということもあります。デバイス裏面の様子を御覧ください。

M5ATOM Lite Back上記のIO端子を使って、いろいろやりたいと思います。

鳥なき里のマイコン屋(115) Arduino環境でUnit test、その1 へ戻る

鳥なき里のマイコン屋(117) M5ATOM Lite、ブレッドボード接続のお供 へ進む

フルカラーLEDの色と明るさを変えるサンプル
#include "M5Atom.h"
const bool LCDEnable = false;
const bool PowerEnable = false;
const bool SerialEnable = true;

uint8_t brightness;

CRGB dispColor(uint8_t g, uint8_t r, uint8_t b) {
  return (CRGB)((g << 16) | (r << 8) | b);
}

void setup() {
  M5.begin(LCDEnable, PowerEnable, SerialEnable); //M5StickC::begin
  Serial.begin(115200);
  while(!Serial) {};
  Serial.println("M5Atom Lite setup");
  brightness = 0x01;
  M5.dis.drawpix(0, dispColor(0,0,0));
}

uint8_t FSM = 0;

void loop() {
  if (M5.Btn.wasPressed())
  {
    Serial.printf("Brightness: 0x%02x  ", brightness);
    switch (FSM)
    {
      case 0:
        Serial.println("Color: Green");
        M5.dis.drawpix(0, dispColor(brightness, 0, 0));
        break;
      case 1:
        Serial.println("Color: Red");
        M5.dis.drawpix(0, dispColor(0, brightness, 0));
        break;
      case 2:
        Serial.println("Color: Blue");
        M5.dis.drawpix(0, dispColor(0, 0, brightness));
        break;
      case 3:
        Serial.println("Color: White");
        M5.dis.drawpix(0, dispColor(brightness, brightness, brightness));
        break;
      default:
        break;
    }
    if (FSM >= 3) {
      FSM = 0;
      brightness = (brightness >= 0xF0) ? 0 : (brightness + 8);
    } else {
      FSM++;
    }
  }
  delay(100);
  M5.update();
}