M5StackAuto : M5StickC, M5StickC Plus, M5Stack, M5ATOMを単独ソースで開発する

概要

もともとM5StickCの互換ライブラリを準備していたのですが、らびやんさん作成の高速LCDライブラリのLovyanGFXが複数ボードの自動認識機能が実装されたのでM5StickC風のライブラリで、M5シリーズを単独ソースの単独バイナリで同時開発できるものを作ってみました。

対応表

ボードLCD/LED電源管理IMURTCボタンAボタンBボタンCTone
M5StickCM5.Lcd
LovyanGFX
M5.Axp
AXP192
M5.Imu
SH200Q
MPU6886
M5.Rtc
BM8563
M5.BtnA
GPIO37
M5.BtnB
GPIO39
M5.BtnC
電源ボタン
M5StickC PlusM5.Lcd
LovyanGFX
M5.Axp
AXP192
M5.Imu
MPU6886
M5.Rtc
BM8563
M5.BtnA
GPIO37
M5.BtnB
GPIO39
電源ボタンM5.Beep
M5Stack BASICM5.Lcd
LovyanGFX
M5.Power
IP5306
M5.BtnA
GPIO39
M5.BtnB
GPIO38
M5.BtnC
GPIO37
M5.Beep
M5Stack GrayM5.Lcd
LovyanGFX
M5.Power
IP5306
M5.Imu
MPU6886
M5.BtnA
GPIO39
M5.BtnB
GPIO38
M5.BtnC
GPIO37
M5.Beep
M5Stack FireM5.Lcd
LovyanGFX
M5.Power
IP5306
M5.Imu
SH200Q
MPU6886
M5.BtnA
GPIO39
M5.BtnB
GPIO38
M5.BtnC
GPIO37
M5.Beep
ATOM LiteM5.dis
FastLED
M5.BtnA
GPIO39
ATOM MatrixM5.dis
FastLED
M5.Imu
MPU6886
M5.BtnA
GPIO39
ATOM EchoM5.dis
FastLED
M5.BtnA
GPIO39
TTGO T-watchM5.Lcd
LovyanGFX
M5.Imu
BMA423
M5.Rtc
BM8563
M5.BtnA
GPIO36

ちょっと大きな表になってしまいましたが、対応表になります。

利用ライブラリ

外部ライブラリ

LovyanGFX

ボード自動判定機能付きのLCDライブラリです。既存のTFT_eSPIライブラリとの互換性はありますので、ほぼ同じイメージで利用可能です。

FastLED

ATOMでのLED制御で利用しています。既存ライブラリと同じなので特に変わりはありません。

I2C_AXP192

M5StickCの電源管理などで使われているAXP192の単独ライブラリはなかったので、自作しました。既存との互換性は考えずに、単独で使いやすいように作っています。

I2C_MPU6886

こちらもM5StickCの6軸IMU用ライブラリを自作しました。

I2C_BM8563

こちらもM5StickCのRTC用ライブラリの自作ですが、そもそも他のRTCコンパチだったので既存ライブラリが使えた気がします、、、

内蔵ライブラリ

I2C_SH200Q

古いM5StickCなどで使われている6軸IMUですが、あまり利用例がないので独立ライブラリではなく内蔵させています。

I2C_IP5306

M5Stackで使われている電源管理ライブラリです。もともとはモバイルバッテリーなどの管理用ICなのでAXP192と比べるとかなり機能が少ないです。

I2C_BMA423

TTGO T-watchの3軸IMUです。M5シリーズではないのですが、対応できそうなので作ってみました。

使い方

ライブラリマネージャーに登録済みなので、「ESP32LitePack」で検索してください。

インストールするときに、必要なライブラリも一緒にインストールするかと聞かれるので「Install all」を選んでください。

ちなみにM5StickCやM5Stackの既存ライブラリは必要ありません。公式ライブラリには依存せずに互換ライブラリを構築しています。

スケッチ例

#include "M5StackAuto.h"

void setup() {
  M5.begin();
  M5.Axp.ScreenBreath(10);

  Serial.printf("Lcd Width=%d, Height=%d\n", M5.Lcd.width(), M5.Lcd.height());

  M5.Imu.Init();
  Serial.printf("IMU : %d\n", M5.Imu.imuType);

  M5.dis.drawpix(0, CRGB(255, 0, 0));
  M5.dis.drawpix(2, CRGB(0, 255, 0));
  M5.dis.drawpix(4, CRGB(0, 0, 255));
  M5.dis.drawpix(6, CRGB::White);

  // Not Support(ESP_LOGE)
  M5.Axp.GetWarningLevel();
}

void loop() {
  static int vol = 11;

  M5.update();

  M5.Lcd.setCursor(0, 4, 1);

  M5.Lcd.printf("M5StackAuto\n");

  M5.Lcd.printf("Battery\n");
  M5.Lcd.printf(" Temp :%6.1f\n", M5.Axp.GetTempInAXP192());  // AXP192 Internal temperature
  M5.Lcd.printf(" V(V) :%6.3f\n", M5.Axp.GetBatVoltage());    // Battery Voltage(3.0V-4.2V)
  M5.Lcd.printf(" I(mA):%6.1f\n", M5.Axp.GetBatCurrent());    // Battery Current(+:charge, -:decharge)

  M5.Lcd.printf("ASP\n");
  M5.Lcd.printf(" V(V) :%6.3f\n", M5.Axp.GetAPSVoltage());    // ESP32 Voltage

  M5.Lcd.printf("VBus(USB)\n");
  M5.Lcd.printf(" V(V) :%6.3f\n", M5.Axp.GetVBusVoltage());   // USB Voltage
  M5.Lcd.printf(" I(mA):%6.1f\n", M5.Axp.GetVBusCurrent());   // USB Current

  M5.Lcd.printf("VIN(5V-In)\n");
  M5.Lcd.printf(" V(V) :%6.3f\n", M5.Axp.GetVinVoltage());    // 5V IN Voltage
  M5.Lcd.printf(" I(mA):%6.1f\n", M5.Axp.GetVinCurrent());    // 5V IN Current

  if (M5.Imu.imuType != 0) {
    float ax;
    float ay;
    float az;
    float gx;
    float gy;
    float gz;
    float t;

    M5.Imu.getAccelData(&ax, &ay, &az);
    M5.Imu.getGyroData(&gx, &gy, &gz);
    M5.Imu.getTempData(&t);

    Serial.printf(" %f,%f,%f,%f,%f,%f,%f\n", ax, ay, az, gx, gy, gz, t);

    M5.Lcd.printf(" Accel   Gyro\n");
    M5.Lcd.printf("X%5.2f%7.1f\n", ax, gx);
    M5.Lcd.printf("Y%5.2f%7.1f\n", ay, gy);
    M5.Lcd.printf("Z%5.2f%7.1f\n", az, gz);
  }

  RTC_TimeTypeDef RTC_TimeStruct;
  RTC_DateTypeDef RTC_DateStruct;
  M5.Rtc.GetTime(&RTC_TimeStruct);
  M5.Rtc.GetData(&RTC_DateStruct);
  M5.Lcd.printf("%04d-%02d-%02d\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date);
  M5.Lcd.printf("%02d:%02d:%02d\n", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);

  if (M5.BtnA.wasPressed()) {
    Serial.println("M5.BtnA.wasPressed()");
    M5.Beep.tone(1000, 100);
  }
  if (M5.BtnB.wasPressed()) {
    Serial.println("M5.BtnB.wasPressed()");
    vol--;
    M5.Beep.setVolume(vol);
    Serial.printf("vol = %d\n", vol);
  }
  if (M5.BtnC.wasPressed()) {
    Serial.println("M5.BtnC.wasPressed()");
    vol++;
    M5.Beep.setVolume(vol);
    Serial.printf("vol = %d\n", vol);
  }
  if (M5.BtnA.wasReleased()) {
    Serial.println("M5.BtnA.wasReleased()");
  }
  if (M5.BtnB.wasReleased()) {
    Serial.println("M5.BtnB.wasReleased()");
  }
  if (M5.BtnC.wasReleased()) {
    Serial.println("M5.BtnC.wasReleased()");
  }

  delay(100);
}

M5StackAuto.hを読み込むことで、M5StickC的なライブラリ構成でプログラムを行うことができます。基本的に利用できないデバイスのクラスを呼んでもエラーにならないようになっています。画面の大きさやボタンの数などで条件わけをする必要はありますが、既存に比べると同一ソースでプログラムをしやすいとは思います。

クラスの紹介

M5クラス

begin()とupdate()関数以外はクラスを持っているだけです。begin()の引数はM5StickCのものを採用していますが、通常は引数無しで実行するだけで良いと思います。

update()関数はBeep.updte()も内部で呼んでいます。

M5.Lcdクラス

LovyanGFXライブラリを利用していますので、互換性はありますがかなりの数の機能が追加されています。既存の機能もかなり高速化されています。

M5.disクラス

ATOMのLED制御クラスです。ほぼ同じラッパークラスを作っているので同じように利用できると思います。ただし、色の並びがおかしいのは修正していますのでCRGB::RedやCRGB(255, 0, 0)は正しく赤く光ります。

M5.Imuクラス

M5StickCのImu自動判定と同じようなことをしています。自動判定自体私がPRして本家に取り込んでもらったので、、、

SH200Q、MPU6886、BMA423を自動判定しています。M5Stack系は自動判定がなかったのでかなり便利に使えるのではないでしょうか?

今後軸が違う可能性があるので、座標系をM5StickCに合わせる改修が入る可能性があります。TTGOのT-watchで使われているBMA423は3軸なんで加速度しか取れませんのでご注意ください。

MahonyAHRSはまだ取り込んでいませんので使えませんので注意してください。MahonyAHRSは単体ライブラリとして存在しているので、そちらを使うのを推奨します。そのうち依存ライブラリに追加して内部に取り込むかもしれません。

M5.Axpクラス

AXP192の既存ライブラリで使いそうな関数のみ実装しています。Sleep系は実装していませんのでご注意ください。

M5.Powerクラス

M5Stackの電源管理クラスです。バッテリー残量取得などは実装していますがスリープ系は未実装です。使える機能が少ないのでAxpクラスに統合するかもしれません。

M5.Rtcクラス

M5StickCとM5StickC Plus、TTGO T-watchで使われているRTCをサポートしています。

M5.BtnA, BtnB, BtnCクラス

ここはM5StickCではなく、M5Stackにそろえています。M5StickCの電源ボタンはM5.Axp.GetBtnPress()ではなく、M5.BtnC.wasReleased()を利用してください。

ATOMとTTGO T-watchは物理的にボタンが1つしかないので、BtnAのみになります。

M5.Beepクラス

M5StackC PlusのBeepクラスをベースにしています。M5StackはSpeakerクラスだったので注意してください。M5Stackは爆音か変な音だったのであまり使っている人がいないのでしょうか?

M5Stackは、M5StackC Plusと同じぐらいの大きさのクリアな音がするように調整しました。ただPWMで出力を絞っているだけなので、周波数が変わって音がちょっと違います。。。

Wire1クラス

内蔵しているI2Cにアクセスするクラスになります。こちらはATOMだけピン配置が違うのですがボードの自動判定に応じたピンで初期化してあります。

Groveなどの端子で別系統のI2Cを使う場合にはWireクラスの方を利用してください。M5StackのPortAなどは内部と同じ端子が出ているのでWire1になります。

開発の注意点

開発で利用するボードは常にM5Stick-Cで大丈夫です。シリアルポートだけ利用するボードに変更してください。アップロード速度は1500000のままで、すべてのボードに転送できます。

また、一部サポートしていない関数があるので、Core Debug Levelはエラー以上にしてもらえると、シリアルモニタにで「Not Support」と関数名と一緒に表示されると思います。

まとめ

まだ資料が圧倒的に足りていませんが、M5StickCの開発経験がある人であればそれほど違和感なくM5Stackの開発もできると思います。とにかくシリアルポートを変更することだけで複数のボードで開発できるのは便利です!

当初はM5StickCとM5StickC Plusを同時開発するライブラリの予定だったのですが、LovyanGFXが他のボードも自動判定してくれたのでこんな感じのライブラリになりました。

もともとは個人的に便利なスケッチ例などを入れる予定だったので、ESP32LitePackという名前になっているので、中身と名前がミスマッチなのです、、、

M5Stack デュアルボタンユニット

概要

M5Stack社のユニット紹介、デュアルボタンユニットです。前回のボタンユニットが2つボタンになったものです。

商品

ちょっと大きめの箱にはいっていますね。なんとボタンユニットより、2ボタンのデュアルボタンユニットの方が安いです。元々はボタンユニットの方が安かったんですが、値上げによって高くなっています。もう少ししたらデュアルボタンユニットも値上げしそうですね。

こんな感じで外側のAが上の青いボタン、Bが下の赤いボタンみたいですね。押すとLOWになります。回路図を確認したところ、回路でプルアップされていましたので入力側は単純に使えそうです。

ボタン側です。スイッチサイエンスさんの画像は古いのかカバーがなかったですが、私が公式サイトから購入したのはありました。いまスイッチサイエンスさんで買うとどっちが届くのかな?

ボタンはちょっとペコペコするタイプなので、個人的には好きなタイプではなかったです。

スケッチ例

const uint8_t pin1 = 33;  // M5StickC
const uint8_t pin2 = 32;  // M5StickC

void setup() {
  Serial.begin(115200);
  delay(100);

  pinMode(pin1, INPUT);
  pinMode(pin2, INPUT);
}

void loop() {
  Serial.printf("Blue=%d, Red=%d\n", digitalRead(pin1), digitalRead(pin2));
  delay(100);
}

非常に単純に利用することができますね。Groveは外側の端子から利用するってのを覚えておくと設定しやすいと思います。

まとめ

個人的にはボタンの押したときの感覚が好きじゃないですが、2ボタン必要なときには便利ですね。結構大きな音がなるので青で始動、赤で停止みたいな用途に向きそうですね。

低予算でのオシロスコープ・ロジックアナライザーの選び方(2020年8月)

概要

低予算でのオシロスコープとロジックアナライザーの選び方をもう一度調べ直してみました。

対象信号例

プロトコル周波数チャンネル
PS/215KHz2
UART(MIDI)31.25Kbps2
UART(RS-232C)1.2Kbps~115.2Kbps2
PWM1.2Kbps~312.5Kbps1
I2C100KHz~400KHz2
CAN10Kbps~1Mbps2
PCM64kbps~2.048Mbps4
LPT10MHz17
USB 1.112Mbps2
AC9712.288MHz5
SPI1MHz~24MHz4
Compact Flash 4.133MHz26
SD2.0/SDIO52MHz6
USB 2.01.5Mbps~480Mbps2

一般的なプロトコルと周波数の範囲になります。SPIなどはもっと高速で通信することも可能ですが、よく使う範囲になります。おそらくはI2Cの2チャンネルで400KHzと、SPIの4チャンネルで24MHzぐらいが一般的に使う上限だと思います。

ロジックアナライザー

通信などの信号を確認する場合に利用します。通常16チャンネルぐらいのものが多いですが、最低4チャンネルとまわりの回路で8チャンネルぐらいまであれば低予算構成では問題ないと思います。

ロジックアナライザーの場合には、読み取りたい信号の4倍ぐらいあると安心みたいです。SPIをちゃんと分析したいときには100MHz以上が必要になります。80MHz動作のSPIをちゃんと分析する場合には200MHzぐらいあったほうがいいと思います。

I2Cだと400KHzなので1MHz以上のスペックであれば分析できそうですね。

この手のものが最初に検討するロジックアナライザーになると思います。24MHzまでなのでI2Cを分析するのには十分です。ただし、これの中身はEZ-USB FX2LPと呼ばれるチップになります。

これはケース無しであれば結構安く手にはいります。しかしながらケーブルとかがついていないのでちょっと使いにくいですね。

あと、この手のロジックアナライザーはアプリがついていないか、違法なものになります。基本的には無料で使えるオープンソースアプリのsigrokを使うのがおすすめです。

同じく24MHzですが、3MHzのアナログ1チャンネルのオシロスコープがついているのが上記の商品になります。こちらもsigrokを使うのがいいと思います。I2Cの波形がオシロスコープで確認して、ロジックアナライザーで動作を確認するのであればこれでなんとかなりそうです。

あまりおすすめはしませんが、とりあえず安いものを一台持っておきたいって用途にはおすすめです。

こちらは20MHzのオシロスコープに、24Mhzのロジックアナライザーが搭載されている商品です。24MHzってことで、中身はEZ-USB FX2LPになります。

オシロスコープとしてはそれなりに実用範囲のスペックですが、ロジックアナライザーとしてはちょっと物足りません。そして両方の機能を同時に使うことできません(涙)

こちら私も所有していますが、非常にコスパのいい商品です。そして使っている人も非常に多いです。

ちなみに秋月さんで非常に安くなっています。特徴としてアプリがちゃんとしていますので、プロトコルとかがかんたんに分析可能です。とりあえず秋月さんで9千円で購入できるのであれば、これが一番安心です。

安くて使いにくいアプリで苦しむよりは、ちゃんとしたアプリを使ったほうが楽だと思います。プロトコルを指定すると送信している文字なども画面上に出るので、分析が楽だと思います。

ちなみに一個上位機種はメモリ量が増えるだけなのですが、価格が二倍以上になるのでちょっと手が出ないです。。。そしてハードウエア的には同じらしいです。。。

オシロスコープ

通信の信号が正しいのかを確認する場合などに利用します。きれいに波形をみるためには測定周波数の10倍あると安心みたいです。最低でも4倍から5倍は必要です。

I2Cの信号をみてみて、信号がなまっている場合にプルアップ抵抗の値を変えて確認をするみたいな場合に活躍すると思います。この用途だと100KHzから400KHzの信号を測定するので4MHzぐらいほしいですね。一般的な入門機は20MHzぐらいです。

もともとは自分で組み立てるDIYキットになります。どちらかというと組み立てるのが主ですので、実際の性能は200kHz程度と低いです。テスター的に信号が出ているのかを確認するのには便利だと思います。

20MHzまでのUSB接続のオシロスコープです。おすすめはHantekでAliExpressのオフィシャルサイトから購入すると6千円弱で購入可能です。上のロジックアナライザーでも紹介していますが、千円ちょっとでロジックアナライザー付きもありますが、同時に使えないので別々に購入したほうが楽だと思います。6022BEはsigrokからも利用が可能です。

秋月さんだとこの価格帯はInstrustarの商品で、安いHantekは取り扱いがないみたいですね。性能はたぶんそんなに変わらないと思いますが、他のアプリを使える逃げ道があったほうが楽かなって思っています。

ZEROPLUSに接続して使う、オシロスコープモジュールです。20MHzまでで12,800円なのでちょっと高いのですがZEROPLUSのロジックアナライザーと同じ画面で利用することができます。I2Cの信号波形を見ながら、実際に流れている信号も確認できます。ZEROPLUSのアプリは結構使いやすいのでそこそこおすすめです。

同じコンセプトのAnalog Discovery 2もあります。こちらは2チャンネルの30MHzオシロスコープに16チャンネルのロジックアナライザー、そして信号発生器など必要そうなものを詰め込んでいるセットになります。学生やホビー用途で全部入りをした製品です。完全に統合されているので、これ1台で済むメリットがあります。

個人的にはこの価格帯は手が出ないです、、、

この上のランクでいうとUSB接続だとHantekの6254BDあたりだと思います。今までのは2チャンネルでしたが、これは4チャンネルあります。

Amazonだとちょっと高いですが、秋月さんだと30,800円です。250MHzまでなのでホビーユースだとこれぐらいが手がでる上限になると思います。

ちなみに私はこのペン型の絶縁タイプを持っています。

OWONの製品は結構好きなのですが、中古のを安く手にいれたので良かったです。定価だとちょっと手が出にくいかな?

絶縁型はあまりないのですが、パソコンの電源と絶縁されているのでより安全に使えます。普通のオシロスコープだとGNDを接続しなくてもパソコンや電源経由で、GNDがつながっているので測定できます。つまり間違った場所にオシロスコープのGND端子をつなげるとショートしてしまいます。

通常オシロスコープではGND端子は繋げないか、ターゲットのGNDに接続する必要があります。絶縁型の場合には、抵抗の前後みたいな測定が可能になります。ただ2チャンネルオシロスコープであれば差分表示させればいいので、通常は絶縁型である必要はないと思います。1チャンネルだと絶縁のほうが便利だとは思います、、、

圧倒的に据え置き型がオシロスコープは人気です。USBタイプはいまいちアプリのできが良くないのが多いです。やっぱり実際に操作できるほうがいいみたいですね。ただし、画面は小さいのでパソコンに接続して、操作は本体で画像はパソコンみたいな使い方もできます。

ちなみにAmazonの商品は並行輸入品扱いなので、修理対応が中国になりますので注意してください。秋月電子のもOWONJAPANではなく中国対応みたいですが、秋月さんならまあ安心ですね。

Hantekの場合には、そもそも日本法人ないのかな? 秋月電子で購入するか、直販がいいと思います。

似たような名前で2店舗ある。。。たぶんOfficialの方が古くからあるので正規代理店とかで、Directが工場直販とかかな?

Officialの方が若干安いのでOfficialで購入するのがいいと思います。。。

ちょっと前まで中華オシロスコープといえばRIGOLが有名でしたが、最近はちょっと値段的に優位性がなくなったかな?

気になっているのが、このタブレットタイプのオシロスコープです。タッチパネルで100MHzとそれなりのスペックです。

FNIRSIはUSBテスターとして有名なメーカーですよね。ただ、生データをパソコンから取得できないかもしれません。。。ちょっとした確認用だったらいいのかもですが、メイン用途にはきついかもしれません。中国サイトから直接購入すると1.5万円ぐらいなんですけれどね。

マルチメーター

番外編として、パソコンに接続できるテスターの紹介です。

いろいろ選び方はあると思うのですが、sigrokでUSB接続で使えるものからピックアップしてみました。OWONとかのもあるのですが、Bluetooth接続でいろいろ技適とかが問題になりやすいです。気軽に使うのはUSBかシリアル経由が便利です。

UNI-TのUT61EはUSBとRS-232の両対応です。一応絶縁型みたいなので、ショートさせてしまってもテスターは壊れるかもしれませんが、パソコンに影響は与えないはずです。

OWONとかのテスターは秒間1フレームのデータ更新が多いのですが、こちらは2フレームです。0.5秒間隔で測定が可能です。据え置き型だともっと細かい粒度の測定が可能ですが、通常予算だと秒間1フレームぐらいが多いです。そしてスペック表には載っていないことが多いので注意してください。

どちらかというと長時間測定する用途で、短時間の時間精度を求めてはいけないみたいです。

ちなみにこっちも2つお店があります。。。

まとめ

オシロスコープやロジックアナライザーは、問題が発生いたときに必要になる機材です。うまく動いていると使わないんですよね。。。私もほぼ使いません。

EZ-USB FX2LPはどこかにあった気がするので、他のものも購入してみて使い勝手を今度比べてみたいと思います。

M5Stack ボタンユニット

概要

M5Stack社のユニット紹介シリーズです。今回はボタンユニット。一番地味な?ユニットですね、、、

商品

単純なユニットなので、かなり安いですね。

インは普通に外側みたいです。

こんな感じのボタンになっています。M5StickCのBtnAと同じような感じになっていて、押すとカチカチ音がします。

スケッチ例

const int button = 33;  // M5StickC

void setup() {
  Serial.begin(115200);
  pinMode(button, INPUT);
}

void loop() {
  Serial.println(digitalRead(button));
  delay(100);
}

GPIOの値を単純に読み取って、押すとLOW(0)になるのを確認します。

M5StickCのボタンクラスを使う

#include <M5StickC.h>

const int button = 33;  // M5StickC

Button BtnGrove = Button(button, true, DEBOUNCE_MS);

void setup() {
  M5.begin();
}

void loop() {
  BtnGrove.read();
  if (BtnGrove.wasPressed()) {
    Serial.println("wasPressed");
  } else if (BtnGrove.wasReleased()) {
    Serial.println("wasReleased");
  }

  delay(100);
}

こんな感じになります。ただこのクラスは内部処理でプルアップしているのが気になるので非推奨です。

元になったライブラリを見てみたら、AVR用なので使うと警告でるんですよね。過去のPRみたらAVR用を消してくれと出ていましたが、リジェクトされていました。

まとめ

ちょっと離れた場所にボタンを設置したい場合には非常に便利なボタンです。値段も安いので持っていてもいいのかな?

M5Stack PM2.5 エアクォリティーセット

概要

M5Stack BASICとPM2.5用センサーが搭載されているボトムがセットになっている商品があったので購入してみました。

商品

こちらの商品になります。日本未発売かな?

たまーにある、本体セットじゃないと売っていない商品になります。M5Stack BASICを買おうと思ったのですが、どうせならということでこちらのセットにしてみました。

スタンド、M5Stack BASICにPM2.5ボトムのセットで、M5Stack BASICとPM2.5ボトムはくっついた状態で箱に入っています。ちなみにBASICの標準ボトムはついていません(涙)

おそらくこちらがM5Stack BASICに標準でついているバッテリー内蔵のボトムだと思います。まあ、バッテリーで動かすことないので必要ないのですが、他に購入するものがあるときに一緒に入手しておきたいと思います。

PM2.5ボトムはこんな感じの作りになっています。左上の場所にUSBを接続するコネクタがあります。

スタンドに立てた場合には、こちらにケーブルを接続するのを推奨しているはずです。

ボトムを分解したところ、こんな感じです。はじめての分解ですがしっかりささっていて、たしかに抜き差ししているとコネクタがもげるのもわかります。。。

固定用のネジがついていますが、このままだと長いので注意しましょう。このままネジを締めていくと画面を壊してしまいます!

このようにスタンドをつけて固定するための長さになっています。

スタンドはこんな感じです。

USBコネクタがあるのですが、PM2.5ボトムはセンサーの出っ張りがあるので使えなくなってしまいます。

裏側はこんな感じです。

このスタンドは別売りしていたの知っていたのですが、よく見ると回路が違うので別商品です!

どうやらPM2.5ボトムに温湿度センサーのSHT20が内蔵している関係で、スタンドにあったSHT30を削ったみたいです、、、後継であるSHT30の方が良かったな、、、

まとめ

PM2.5ボトムは単品では買えないので買ってみました。しかしながら欲しかったのはM5Stack BASICなのでPM2.5ボトムはあまり使っていません、、、

ただバッテリー内蔵していないのでUSBケーブル抜けば電源切れるってのは便利です!

M5Stack カラーセンサユニット

概要

M5Stack社のユニット紹介シリーズのカラーセンサユニットです。色を判定して取得することができます。

商品

赤のコネクタなのでI2C接続ですね。

使っているセンサーはTCS34725です。

まんなかの赤い部分がセンサーで、左右にLEDが並んでいます。LEDで光らせながらセンサーで読み取っていますので真っ暗な場所でも読み取ることができます。

UIFlowでの使い方

四角を画面において、その色を変更させています。背景色はRGB指定だと指定できないんですよね。

私の環境だと若干赤が弱かったですが、そこそこ色が判定できました。ただし紙みたいなもので画面上の色はちょっと難しかったです。

Arduinoでの使い方

ArduinoのサンプルスケッチではAdafruit_TCS34725を使っていますが、素のセンサーからの数値は取得できますが、一般的な色に変換するところがうまく動いていません。

このセンサーは明るさと赤、緑、青の4種類のセンサーが搭載されていますが、色ごとに感度が違うのでそのままの数値だと人間がみた色にはなりません。このへんはRGB LEDとかも色ごとに調整が必要なのと変わらないと思います。

AdafruitのセンサーとはLEDの色温度とか特性が違っていて、取得できる色も違うのではと思いますがよくわからないです。UIFlowではそれなりに色が取得できたので、なにか独自の補正をしていると思いますが、Arduinoのコード例はありません。

Arduinoで使いたい場合には素のセンサーの値をいろいろな色でどうなるか調べてみて、自分で補正をしてあげる必要がありそうです。ちょっといじってみたところ、明るさのCの値が重要そうですが時間かかる感じなのでまた今度にしたいと思います。。。

まとめ

んー、ちょっと使いにくい感じでした。最近だとマリオのLEGOが色センサー使っていましたね。クリボーとかの色を足の下のセンサーで読み取っているみたいです。

あの使い方だと、使っている色をすべて調べてテーブルにしておけば問題なさそうですね。

無印良品 タグツール・ルーペ ホワイト/3倍・7倍(M5StickC用ケース)

概要

さいきん話題になっている無印良品のM5StickC用ケースこと、タグツールをやっと購入してみました。ケースだけだと寂しいのでルーペも買ってみました。

商品

タグツールとは無印良品の展開するトラベル用品のシリーズで、5色のシリコンケースとその中に入れるツールになります。

中身はルーペーの他にLEDライトや静電気除去ツールなど、いろいろあります。ケースは290円で中身は490円ぐらいからあります。

M5StickCにつけてみた

厚みはピッタリですが、縦に伸ばして付ける感じになります。ちょっと伸びているので真ん中がゆがんでしまいますね。

ちなみに底には穴が空いているのでケーブルもささります。

ルーペ

とりあえず一つぐらいはと思って買ってみました。案外便利につかえています。

レンズは2種類で3倍と7倍です。7倍は1.8cmの距離なのでかなり近づけないと見えないので使いにくいです。3倍は使いやすいですね。

写真にとるのは非常に難しいですが、こんな感じです。ちなみにiPhoneのカメラでそのまま拡大したほうが見やすいかもしれませんが、やっぱり直接目で見るのもいいものです。

まとめ

Bluetoothビーコン的な使い方とかでM5StickCを大量にばらまくときなどに、このケースに入れておくとかするとかわいいと思います。

M5Stack VH3.96 – 4ピンユニット

概要

M5Stack社のユニット紹介シリーズです。今回はちょっと変わり種の3.96ユニット!

商品

価格は日本で発売しているユニットでは最安値だったのですが、最近ちょっと値上がりしました。ちなみに一番安いのが70穴のプロトユニットです。本家には40穴があって、少し前は最安値だったのですが値段が上がって70穴と同じ値段になってしまいました。

中に入っているのはユニット本体と、スクリューターミナルにGroveケーブルです。このターミナルが3.96ミリピッチでVH3.96とか、HT396Kって規格みたいです。ATOMとかでも使われていますね。

たぶんこのコネクタかな?

日本だとあまり使われていない規格で、ほぼ国内だと手に入りません。ebayにもあまり取り扱いがなかったので、中国ローカルの規格かもしれませんね。

このユニットはGroveケーブルからVH3.96コネクタに変換するだけの機能になります。ケーブルと端子の対応がクロスになっているので注意して使ってください。Grove端子ではないセンサーなどをVH3.96コネクタを使って接続するのに便利なユニットになります。

VH3.96コネクタがちょっと手に入りにくいのが難点ですが、複数用意しておけば差し替えて使えるので便利かもしれません。ちょっとした接続にはスクリューターミナルの方が手軽ですしね。

端子はこんな感じでしっかり接続を固定することができます。

差し込んだ状態です。2本爪のようなものがありますが、がっちりとは固定せずにバネみたいな感じで抜けを防いでいる感じです。

まとめ

Groveケーブルを自分で作ればいいのですが、圧着ではなくスクリューターミナルで取り外しができる用途であればかなり便利に使えると思います。値段も安いので何個か持っていてもいいのかもしれません。

M5StickCとM5StickC Plusの違い

概要

M5StickCとM5StickC Plusを主にArduino IDEで開発する場合の違いを調べてみました。

上記の記事も参考にしてください。

スペックの違い

M5StickCM5StickC Plus
TFTコントローラーST7735SST7789
液晶サイズ0.96インチ1.14 インチ
画面サイズ80×160135×240
6軸IMUSH200Q or MPU6886MPU6886
ブザーなしGPIO2
バッテリー95 mAh @ 3.7V120 mAh @ 3.7V
PINポートG0, G36, G26, G32, G33G0, G25/G36, G26, G32, G33

まず本体サイズは同じなのですが、液晶サイズが異なっています。また、解像度が上がっている関係で同じ画面を表示してもM5StickC Plusの方が小さく表示されます。また、コントローラーが違うので同じライブラリでは動作しません。

またM5StickCの初期はIMUにSH200Qが使われていましたが、現在はMPU6886のみになっています。初期のM5StickCに対応する場合には注意が必要です。

M5StickC Plusにはブザー(GPIO2)とGPIO25が増えています。ブザーは圧電ブザー的なのが内蔵されており、ちょっとした音を出すことができます。GPIO2はDAC出力できる端子ではないので、音声などを喋らせることはできません。またGPIO25が追加されていますが、GPIO36と同じピンにでていますので同時に利用することができませんので注意しましょう。GPIO36を利用する場合にはGPIO25をpinMode(25, INPUT)にしてハイインピーダンスにしておく必要があります。

ライブラリの違い

M5StickCとM5StickC Plusは利用するライブラリが異なります。しかしながら同じように使うことができるようにはなっています。

M5StickC PlusでM5StickCのFactoryTestを動かしてみる

includeを書き換える

//#include <M5StickC.h>
#include <M5StickCPlus.h>

利用するライブラリを切り替えるために、上記の行を書き換えます。基本的にはこれで大体のスケッチが動くのですが、IMU周りの差異でこのままだと動かない場合があります。

IMU周りの対応

M5StickCはIMUが違う端末がある関係でSH200QクラスとMPU6886クラスがあり、自動判定をして呼び分けるIMUクラスもあります。基本的にIMUクラスを読み出せば内部で自動判定をする形なのですが、直接MPU6886クラスを呼び出すことも可能です。また、IMUクラスにはどっちのIMUかを判定する関数などが追加されています。

M5StickC PlusはIMUがMPU6886の端末しかありませんので、MPU6886クラスしかありません。しかし、呼び出しはM5.IMUになります。そのためM5.MPU6886で呼び出しているスケッチは書き直す必要があります。

M5StickCのFactoryTestはM5.MPU6886を呼び出しているのでこのままだとエラーになります。。。GitHubにある最新バージョンはM5.IMUを呼び出すように変更されているのですが、逆にIMUの判定をしている関数を呼び出しているのでそのままだと動きません、、、

#include <M5StickCPlus.h>
#define MPU6886 IMU

M5.MPU6886でエラーがでた場合には上記のようにIMUに書き換えるか、M5.MPU6886をM5.IMUに置換してください。

        //if(M5.IMU.imuType == M5.IMU.IMU_SH200Q)
        //{
        //    imuName = "SH200Q";
        //}
        //else if(M5.IMU.imuType == M5.IMU.IMU_MPU6886)
        //{
        //    imuName = "MPU6886";
        //}

M5.IMU.imuTypeでエラーが出た場合には、エラーがでた場所をコメントアウトしてみてください。

FastLED関係

M5StickCのFactoryTestで誤ってFastLEDが読み込まれています。FastLEDをインストールするか該当部分をコメントアウトしてください。

//#include <FastLED.h>

//#define NUM_LEDS 3
//CRGB leds[NUM_LEDS];

上記の3行になります。ここ結構ハマっている人が多いのでご注意を、、、

GitHubの最新版だとここが削られています。

パーティションテーブル変更

/*
    note: need add library FastLED from library manage
    Github: https://github.com/FastLED/FastLED

    note: Change Partition Scheme(Default -> NoOTA or MinimalSPIFFS)
*/

M5StickCのFactoryTestには一番上にこのコメントがあります。このコメント見落としている人が多いのですが、そのままビルドするとフラッシュが足りなくてエラーになります!

パーティションテーブルを変更してください。ちなみにGitHubの最新版だとがんばって圧縮してデフォルト設定でビルドできるようになっています。

MahonyAHRSに注意

M5StickCにはありますが、M5StickC Plusには存在しませんので注意してください。

全般的にバージョンが、、、

In_eSPIクラスの中身がちょっと違うので、サポートしている関数が違ったりしています。完全互換性はありませんので注意してください。。。

1バイナリで対応したい場合

M5StickCとM5StickC Plusを同じバイナリファイルで対応いたい場合には、公式ライブラリを使うのを諦める必要があります。

グラフィックライブラリにはLovyanGFXを利用すると、内部で自動判定してくれますので画面サイズが違うだけで、同じようにプログラムを組めますし高速描画が可能です。

#include <LGFX_TFT_eSPI.hpp>
#include "AXP192.h"
#include "utility/Config.h"
#include "utility/SH200Q.h"
#include "utility/MPU6886.h"
#include "utility/Button.h"
#include "utility/CommUtil.h"
#include "RTC.h"
#include "IMU.h"

#define BLACK               0x0000
#define NAVY                0x000F
#define DARKGREEN           0x03E0
#define DARKCYAN            0x03EF
#define MAROON              0x7800
#define PURPLE              0x780F
#define OLIVE               0x7BE0
#define LIGHTGREY           0xC618
#define DARKGREY            0x7BEF
#define BLUE                0x001F
#define GREEN               0x07E0
#define CYAN                0x07FF
#define RED                 0xF800
#define MAGENTA             0xF81F
#define YELLOW              0xFFE0
#define WHITE               0xFFFF
#define ORANGE              0xFD20
#define GREENYELLOW         0xAFE5
#define PINK                0xF81F

class M5StickCBoth {
  public:
    void begin(bool LCDEnable = true, bool PowerEnable = true, bool SerialEnable = true) {
      if (SerialEnable) {
        Serial.begin(115200);
        Serial.flush();
        delay(50);
        Serial.print("M5StickC initializing...");
      }
      if (PowerEnable) {
        Axp.begin();
      }
      if (LCDEnable) {
        Lcd.begin();
      }
      if (SerialEnable) {
        Serial.println("OK");
      }
      Rtc.begin();
    }
    void update() {
      BtnA.read();
      BtnB.read();
    }
    TFT_eSPI Lcd;
    AXP192 Axp = AXP192();
    const int DEBOUNCE_MS = 10;
    Button BtnA = Button(BUTTON_A_PIN, true, DEBOUNCE_MS);
    Button BtnB = Button(BUTTON_B_PIN, true, DEBOUNCE_MS);
    RTC  Rtc;
    IMU Imu;
    CommUtil I2C = CommUtil();
    MPU6886 Mpu6886;
    SH200Q Sh200Q;
};

static M5StickCBoth M5;

void setup() {
  M5.begin();
}

void loop() {
  M5.Lcd.fillScreen(WHITE);
  delay(1000);
  M5.Lcd.fillScreen(BLACK);
  delay(1000);
}

ざっくりM5StickCのライブラリ互換で、LovyanGFXを利用するサンプルです。とはいえ、実際にはM5StickCのライブラリも内部にあって、無駄に容量を食ってしまいます。

本当はAXP192、RTC、IMU周りのクラスが独立してあればM5StickCライブラリに依存しないのですが、今の所個別ライブラリがないんですよね、、、

何故かRTCとAXP192の初期化部分は独立して使えるライブラリを開発中なので、IMUまわりの互換ライブラリも作って公開するかもしれません。そうすればM5Stackの公式ライブラリではなく、互換ライブラリを自分で組み合わせて使えるようになってハッピーな人が増えるかもしれません、、、

まとめ

M5StickCとM5StickC Plusのライブラリが別なのはちょっとがっかりでした。最近Arduinoライブラリの整備が遅れている気がするので、そろそろ公式ライブラリを捨ててもいいかなって思うようになってきました。

M5StickCは結構プルリクエストを書いて、取り込んでもらいましたが公開がなかなかされないんですよね。ATOMも色がおかしいのが修正されませんし、M5Stackのライブラリも混沌としている気がします、、、

M5Stack 振動モーターユニット

概要

M5Stack社のユニット紹介シリーズです。今回はバイブレーションユニットです。振動でお知らせしたいときには便利だと思います。

商品

FANユニットは日本語に訳していなかったのですが、バイブレーションユニットはスイッチサイエンスさんの商品名が日本語になっている!

コネクタが黒なのでI2Cではありません。

こちらもFANユニットと同じくN20モーターを利用しています。上に見えるのが偏芯オモリで、回転することで振動させます。

裏側です。

偏芯オモリのアップです。ここまで見てわかったと思いますが、FANユニットと同じものに偏芯オモリをつけたものになります。値段も同じです!

スケッチ例

const int motor_pin = 32; // M5StickC
const int ledChannel = 0;

void setup() {
  Serial.begin(115200);

  // PWMで速度を制御
  ledcSetup(ledChannel, 12000, 8);
  ledcAttachPin(motor_pin, ledChannel);
}

void loop() {
  // 始動は20%以上で15ミリ秒以上必要
  ledcWrite(ledChannel, 256 * 0.2);
  delay(15);

  // 回り始めれば10%でも動く
  ledcWrite(ledChannel, 256 * 0.1);
  delay(2000);

  // 停止
  ledcWrite(ledChannel, 0);
  delay(1000);
}

FANユニットと全く同じ使い方です。

まとめ

FANユニットと同時に紹介したほうがいい気も下のですが、ユニット別の紹介ページを作ろうとおもったので、別に紹介しています。