M5 / プログラミング

M5Atomを買ってみた

こんにちはLineaです。 
また日が空いてしまいました。書くネタは溜まってるんですが書く一歩が中々重い、これが筆不精ってやつでしょうか。

今回のネタはM5シリーズの一つM5Atomを買って使ってみた話になります。

M5Atomは以前紹介したM5StickCよりも更に小型で安価なマイコンボードです。メインのチップはM5StickCと同じなので基礎性能は同じなのですが液晶ディスプレイなど内蔵デバイスが省かれていてよりIoTデバイスに特化しています。

今回は水分監視システムの制御をM5StickCからM5Atomで置き換えました。定期的にデータを計測して送信することがメインなのでディスプレイは必要ないですのでM5Atom向きですからね

それでは解説していきます。

M5Atomについて

M5Atomは先程述べたとおりM5シリーズの一つでIoTデバイス向けのマイコンボードです。
特徴としては、表示やボタンといった人が操作する部分は必要最小限になっている分、小型で安価なところです。
内蔵するチップはESP32と他のM5シリーズと同じチップを搭載しているため、処理性能やWifi,Bluetoothといったネットワーク接続が可能な点は同じです。GROVE互換の端子や接続ピンを持っているのも共通です。
M5Atomには搭載するフルカラーLEDが一つのLite版と、5*5のマトリックスLEDになっているMatrixの2種類があります。自分が購入したのはLite版ですが、1300円ほどで販売されています。

他のM5シリーズと同様に開発はUIFlowやArduinoIDEといった開発環境が使えます。チップも同じなのでライブラリやピン配置は変える必要がありますがコードもある程度使い回すことができます。

M5StickCと並べてみました。半分ぐらいのサイズですね。
裏にはピン配置が書かれています。M5StickCのものと見比べるとGROVEのピンが結構異なるのでちゃんと確認してプログラムを書く必要がありますね。
M5Atomは汎用端子が裏面に出ているのでジャンパピンなどを刺してやればそのままブレッドボードに挿すこともできます。

水分監視システムのプログラム:M5Atom版

それでは以前M5StickC向けにC++で作ったプログラムをM5Atomで動くように書き換えます。

前提として、M5Atomには専用のライブラリがあるのでそちらを使用します。ここらへんは内蔵しているデバイスが違うので他機種で使い回せないのは仕方ないですね。ライブラリのリンクは以下ですが、ArduinoIDEなど各エディタで「M5Atom」ライブラリで検索したほうが早いと思います。

M5Atomライブラリー
 https://github.com/m5stack/M5Atom

また、上記のM5Atomのライブラリでは内蔵LEDの制御にFastLEDというライブラリを使用しています。そのため、動作にはFastLEDライブラリもインストールする必要があります。

FastLEDライブラリー
 https://github.com/FastLED/FastLED

作成したプログラムが以下になります。

#include <M5Atom.h>
#include <WiFi.h>
#include <Ambient.h>

//define
//スリープ時間計算マクロ関数
#define SLEEP_MIN(min) min*60000000ULL
//色定義 GRBの順番に注意
#define LED_PINK 0x55FFAA
#define LED_GREEN 0xFF0022
#define LED_BLUE 0x0022FF
#define LED_OFF 0x000000
//pin定義
const uint8_t kEarthPin = 32;
//スリープ時間
const uint sleepMin = 30; //30分
//wifi情報
const char wifi_ssid[32]="SSID";
const char wifi_key[64]="アクセスポイントのキー";
//ambient情報
const unsigned int channelId = 0; // AmbientのチャネルID
const char* writeKey = "ライトキー";
//static変数
WiFiClient client;
Ambient ambient;

//functions
//測定
void measureEarth(){

  //5回計測した平均を送る
  uint16_t earthVal = 0;
  int measureNum = 5;
  for(int i=0; i<measureNum; i++)
  {
    M5.dis.fillpix(LED_GREEN);    //LED点灯
    delay(200);
    //水分センサは濡れているほうが値が低くなるので反転させる
    earthVal += 1024 - analogRead(kEarthPin);
    M5.dis.fillpix(LED_OFF);    //LEDオフ
    delay(300);
  }
  earthVal/= measureNum;
  ambient.set(1,earthVal);

  //Ambient送信
  ambient.send();
  
}

//カウントダウン
void countDown(const char *dispTxt,const int sec)
{
  int count = sec;
  while (count >= 0)
  {
    count--;
    M5.dis.fillpix(LED_PINK);    //LEDオン
    //1秒待つ
    delay(500);
    M5.dis.fillpix(LED_OFF);    //LEDオフ
    delay(500);
  }
}

//setup関数 ディープスリープ復帰時もここから再開する
void setup() {
  //M5スタート
  M5.begin();

  //水分センサのピンをセットアップ
  pinMode(kEarthPin,ANALOG);

  //アナログ値の解像度を1024段階に設定
  analogSetWidth(10); //10bit(1024)

  // WiFi接続
  Serial.printf("Connecting to %s ", wifi_ssid);
  WiFi.begin(wifi_ssid, wifi_key);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("CONNECTED");

  //Ambient setup
  ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
}

void loop() {
  //計測カウントダウン
  countDown("measure",5);

  //計測
  measureEarth();
  
  //wait
  delay(5000);

  //スリープカウントダウン
  countDown("sleep",5);

  //スリープ
  Serial.println("Enter sleep");
  esp_sleep_enable_timer_wakeup(SLEEP_MIN(sleepMin));
  esp_deep_sleep_start();
}

主な変更点は液晶ディスプレイの表示をLEDの点灯に切り替えた点です。LEDはフルカラーLEDですのでfillpix()関数で色を指定して変更することができます。このとき色の指定は16進数で指定しますが、色の並びがGRBになっているので注意が必要です。

水分センサはM5AtomのGROVE端子に接続する想定ですが、M5StickCとピンが異なるので書き換えるひつようがありました。

その他のWifi接続や計測、Ambientへの送信についてはM5StickC用のコードから変えていません。スリープの開始関数もESP32の関数を呼んでいるので共通して使えます。

終わり

動作自体は大して変わらないので割愛します。
M5Atom自体が小型なおかげでケース内での取り回しが良くなりました。ステータス表示ぐらいはLEDの色で表現できるのでIoTデバイスを作るにはこちらのほうが確かに向いていますね。
お役目が余ったM5StickCの方でまた別でお役立ちデバイス?を作ったのでそのうち紹介したいと思います。

それではまた!

投稿者

Linea
本業はゲームプログラマー プログラミングやIT系の記事を書いていきます アイコンは愛車のシトロエン DS3です

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA