M5StickC PLUSでArduinoをはじめよう!

M5StickC-PLUS
M5StickC-PLUS

この記事では、はじめてM5StickC PLUSを使ってArduino開発するまでの解説をします。M5StickC PLUSは、Arduino互換機であるESP32をベースにLCD・バッテリー・ボタンなどを内蔵し、パッケージ化した小型のM5Stack製品です。

なお、今回の開発環境はMacBook Proで行いました。

▼ 半導体不足のため入手困難な場合は、ひとつ前のモデルのM5StickCも選択に入れてみてください。

▼ どのArduinoを選んでよいか分からない方はこちら。

M5StickC PLUSの仕様

M5StickC PLUSのスペックや仕様を一覧にまとめました。

項目内容
モデル名M5StickC Plus
SocESP32-PICO-D4
BPS1200-115200/250k/500k/750k/1.5M
項目スペックピン割り当て
ボタンAGPIO37
ボタンBGPIO39
ブザーGPIO2
IRGPIO9
LEDGPIO10
LCDST7789V2(135x240)GPIO15/13/23/18/5
MICSPM1423DATA:GPIO34
CLK:GPIO0
電源管理AXP192
内蔵電池リチウムイオンポリマー120mA
慣性計測装置(IMU)6-Axis(MPU6886)SCL:GPIO22
SDA:GPIO21
リアルタイムクロック(RTC)BM8563
SCLGPIO33
SDAGPIO32

M5StickC PLUSは、M5StickCのアップグレード版です。ESP32ベースなのでWiFi、Bluetoothは、もちろん使えます。また、ジャイロ・加速度センサやリアルタイムクロックも内蔵されてます。

詳しくは M5StickC PLUSドキュメント をご覧ください。

ドライバのインストール

はじめに M5STACKのダウンロードページ からCP2104 Driverをインストールします。これは、macOSでM5StickC PLUSと通信できるようにするため必要です。

インストール完了後、次のコマンドでSiLabsUSBDriverの有無を確認しましょう。

shell
$ ls /Library/Extensions/
HighPointIOP.kext	SiLabsUSBDriver.kext
HighPointRR.kext	SoftRAID.kext

セキュリティ関係でインストールできない場合は「System Preference」の「Security & Privacy」で鍵をいったん外します。

Arduino IDEの設定

M5Stack Core2を接続し、Arduino IDEを起動します。シリアルポートは「/dev/cu.usbserial-xxxxx」で始まるポートを選択します。

▼PreferenceのボードマネージャーURLsに以下のアドレスを追加します。

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json

その後、Toolsのボードマネージャーを開き「m5」で検索し__M5Stackのボードをインストール__します。さらに、ライブラリマネージャで「M5StickC」で検索し__「M5StickCPlus」をインストール__します。

プログラムの書き込みテスト

ここまでで、M5StickC PLUSの開発の準備が整ったと言いたいのですが、スケッチをアップロードするときにいくつかエラーが出て書き込めませんでした。その時のエラーと対処法を記しておくので、同じ症状が起きた場合の参考にしてください。

書き込みエラー1

▼serialモジュールが見つからないエラーが発生しました。 M5StickでPythonのserialを使っているのが関係しているようです。

Traceback (most recent call last):
  File "/Users/mopipico/Library/Arduino15/packages/m5stack/tools/esptool_py/3.0.0/esptool.py", line 39, in <module>
    import serial
ImportError: No module named serial
exit status 1
Error compiling for board M5Stick-C-Plus.

▼pip3からpython2側にパッケージを追加すれば良いようで、次のようにして解決できました。

shell
$ sudo pip3 install --target /Library/Python/2.7/site-packages pyserial

参考:

Mac版ArduinoIDEでM5Stackがビルドできない(importSerialエラー)-Qiita v1.0.6 of Board Manager not working**Solved**|M5StackCommunity

書き込みエラー2

その他の書き込みエラーの時は、USB-Cケーブルを抜き差ししたり、シリアルモニターを一旦閉じたりして根気よく何度か試せばうまくいきます。

千里の道もLチカから

千里の道もLチカから
千里の道もLチカから
それでは、M5StickC PLUSのプログラミングをしていきましょう。まずは定番のLEDを点灯させる「Lチカ」からやってみます。実はM5StickC PLUSにはLEDが内蔵されており、G10に割り当てられてます。なので、次のようなプログラミングでLEDを点滅させることができます。ただし、G10がLOWを出力した時にLEDが点灯することに注意してください。

cpp
#include <M5StickCPlus.h>

#define LED_PIN 10 // G10

void setup() {
    M5.begin();
    pinMode(LED_PIN, OUTPUT);
}

void loop() {
    // M5.update();

    digitalWrite(LED_PIN, LOW); // LED点灯
    delay(500);
    digitalWrite(LED_PIN, HIGH); // LED消灯
    delay(500);

}

LCDに「Hello World!」を表示する

M5StickC-PLUS
M5StickC-PLUS

次に、LCD画面に「Hello World!」の文字を表示 してみましょう。次のようにM5ライブラリを使うことで、簡単に文字表示が可能です。ただし、デフォルトでは縦画面に設定されてます。__画面を回転させるにはM5.Lcd.setRotation(3)などで変更します。__

cpp
#include <M5StickCPlus.h>

void setup() {
  // initialize the M5StickC object
  M5.begin();
  M5.Axp.ScreenBreath(10); // 画面の明るさ7〜12
  M5.Lcd.setRotation(3); // 画面を横向きにする
  M5.Lcd.fillScreen(WHITE);
  M5.Lcd.setCursor(5, 10);
  M5.Lcd.setTextColor(BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.printf("Hello World!");
}

void loop(){
}

LCDサンプルコード

GitHubに LCD表示のサンプルコード があるので試してみましょう。

Display.inoを実行すると、動画のように三角形がランダム表示されます。

M5StickC PLUSのLCDサンプル
M5StickC PLUSのLCDサンプル

関連記事

OLEDやLCDをArduinoで制御する記事も書いてます。

ボタンのイベントを取得する

M5StickC PLUSでは、電源ボタン以外に二つのボタンがあり、プログラムで自由に扱えます。__フロントのボタンがAボタン、右サイドのボタンがBボタン__として割り当てられてます。 たとえば、ボタンが押されたかどうかはwasPressed()で判定が可能です。この関数は、ボタンが押される度に一度だけ1を返すので、loop内で状態を監視してあげれば良いです。また、ボタンを押している間だけ処理をさせたい場合は、isPressed()関数で判定できます。

cpp
#include <M5StickCPlus.h>

void setup() {
  Serial.begin(9600);
  // initialize the M5StickC object
  M5.begin();
}

void loop(){
  M5.update(); // Buttonの状態更新のため必要

  if(M5.BtnA.wasPressed()){
    Serial.println("Pressed A button.");
  }
  
  if(M5.BtnB.wasPressed()){
    Serial.println("Pressed B button.");  
  }
}

参考 m5-docs/button.mdatmaster·m5stack/m5-docs·GitHub

ただしこの方法だと、delay関数をはさんだ時にボタンが反応しなかったりします。それを回避したい場合は、割り込み処理で対応します。次の「内蔵ブザーを鳴らす」項目で実装してみたので参考にしてみてください。

関連記事

もちろん、外部のユーザーインタフェースを追加することも可能です。

内蔵ブザーを鳴らす

M5StickC Plusには、ブザーも内蔵されいます。音色や音量は変えられませんが、音程(周波数)を変えられます。ブザーを鳴らすには非常に簡単で、M5.Beep.tone(周波数)で指定するだけです。 ここではAボタンを押すたびにブザー音を止めたり再生したりできるように、割り込み処理も実装してみました。 割り込み処理は、attachInterrupt(割込み番号, 関数名, モード)関数を使用します。AボタンのGPIO番号は37で、ピン番号から割込み番号の解決にはdigitalPinToInterruptを使います。

cpp
#include <M5StickCPlus.h>

const int BUTTON_A = 37;
bool onBuzzer = true;

void handleInterrupt() {
  onBuzzer = !onBuzzer;
}

void setup() {
  M5.begin();
  pinMode(BUTTON_A, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(BUTTON_A), handleInterrupt, FALLING);
}

void loop() {
  M5.update();
  M5.Beep.update();           // tone関数で鳴らした音が指定時間経過していたら止める

  if(onBuzzer) {
    soundTest();
  }
  delay(5);
}
void soundTest() {
  M5.Beep.tone(3000);
  delay(100);
  M5.Beep.tone(4000);
  delay(100);
  M5.Beep.tone(5000);
  delay(100);
  M5.Beep.tone(6000);
  delay(100);
  M5.Beep.tone(7000);
  delay(100);
  M5.Beep.mute();
  delay(100);  
}

▼ラ=440Hzにおける音階と周波数の対応表を記します。参考にしてみてください。

周波数(Hz)音階名
440.000
466.164ラ#
493.883
523.251
554.365ド#
587.330
622.254レ#
659.255
698.456ファ
739.989ファ#
783.991
830.609ソ#
880.000

▼ スイッチサイエンスさんから、スピーカーHATなども販売されてます。

I2Cでセンサモジュールと接続する

最後に、M5StickC PLUSでI2Cを使ってみましょう。今回は、非接触温度センサGY-906を使ってみました。▼

M5StickC PLUSでI2C通信を行うには、G32・G33を使用します。また、端子にI2Cデバイスを繋ぐにはGROVE規格のコネクタが必要になります。▼

GROVEコネクタケーブル
GROVEコネクタケーブル

GROVEコネクタは、ジャンパーワイヤーと違って容易には外れないためモバイル用途には安心なコネクタです。ただし、__M5とGROVEコネクタのカラーには統一がない__ので注意が必要です!接続先のセンサモジュールをよく確認し、SDA・SCLなど配信が間違わないように注意しましょう。

▼HATなどのG0、G26を使ってI2C通信をやりたい場合は、こちらの記事を参考にしてください。

M5StickC PLUSでI2Cによる温度測定
M5StickC PLUSでI2Cによる温度測定
さて、GY-906とGROVEコネクタ接続してLCDに温度を表示させるプログラムを書いてみました。動画のように、指を近づけるとざっくりとですが体温を測定できました。ちなみに、Objは物体の温度でAmbは周囲の環境の温度(気温)です。

cpp
#include <M5StickCPlus.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

void setup() {
  // initialize the M5StickC object
  M5.begin();
  mlx.begin(); 
  M5.Lcd.setRotation(3); // 画面を横向きにする
}

void loop(){
  float amb = mlx.readAmbientTempC();
  float obj = mlx.readObjectTempC();
  showTempreture(amb, obj);
//  M5.update();
  delay(1000);
  
}

void showTempreture(float amb, float obj) {
  M5.Lcd.fillScreen(WHITE);
  M5.Lcd.setCursor(5, 10);
  M5.Lcd.setTextColor(BLACK);
  M5.Lcd.setTextSize(4);
  M5.Lcd.printf("%.1fC Obj", obj);
  M5.Lcd.setCursor(5, 50);
  M5.Lcd.setTextSize(4);
  M5.Lcd.printf("%.1fC Amb", amb);
}

▼ GY-906の詳しい使い方は、こちらの記事もご覧ください。

M5Stick C Plusでできること

他にも、M5Stick C Plusでできることは色々あります。 加速度センサで振動測定 してみたり、 SPIFFSにデータ保存内蔵ADコンバータで電圧測定Ambientへログ送信 黒く塗装 といろいろやってます。

おわりに

以上で、M5StickC PLUSの使い方の説明をおわります。今回はじめてM5StickC PLUSを使ってみたのですが、使いやすく楽しく非常に可能性を感じました。とくにLCD・ボタン・バッテリーがすべてパッケージされているのは非常に便利で、開発作業に集中できますね!プロトタイピング的な製品はもちろん、モバイル端末としていろいろとおもしろい使い方ができそうです。 GitHubに上がってる M5StickC-Plusのサンプルコード も要チェックです。

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

この記事で紹介した商品

人気のArduino互換機
Arduinoで人気の周辺パーツ
あると便利な道具
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容です。ほかのArduino書籍と比べて図や説明がとてもていねいで読みやすいです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

Seeed Studio関連製品
ATmega32U4搭載ボード
関連記事