M5StickC PLUSでArduinoをはじめよう!
この記事では、はじめてM5StickC PLUSを使ってArduino開発するまでの解説をします。M5StickC PLUSは、Arduino互換機であるESP32をベースにLCD・バッテリー・ボタンなどを内蔵し、パッケージ化した小型のM5Stack製品です。
なお、今回の開発環境はMacBook Proで行いました。
▼ 半導体不足のため入手困難な場合は、ひとつ前のモデルのM5StickCも選択に入れてみてください。
▼ どのArduinoを選んでよいか分からない方はこちら。
M5StickC PLUSの仕様
M5StickC PLUSのスペックや仕様を一覧にまとめました。
項目 | 内容 |
---|---|
モデル名 | M5StickC Plus |
Soc | ESP32-PICO-D4 |
BPS | 1200-115200/250k/500k/750k/1.5M |
項目 | スペック | ピン割り当て |
---|---|---|
ボタンA | GPIO37 | |
ボタンB | GPIO39 | |
ブザー | GPIO2 | |
IR | GPIO9 | |
LED | GPIO10 | |
LCD | ST7789V2(135x240) | GPIO15/13/23/18/5 |
MIC | SPM1423 | DATA:GPIO34 CLK:GPIO0 |
電源管理 | AXP192 | |
内蔵電池 | リチウムイオンポリマー120mA | |
慣性計測装置(IMU) | 6-Axis(MPU6886) | SCL:GPIO22 SDA:GPIO21 |
リアルタイムクロック(RTC) | BM8563 | |
SCL | GPIO33 | |
SDA | GPIO32 |
M5StickC PLUSは、M5StickCのアップグレード版です。ESP32ベースなのでWiFi、Bluetoothは、もちろん使えます。また、ジャイロ・加速度センサやリアルタイムクロックも内蔵されてます。
詳しくは M5StickC PLUSドキュメント をご覧ください。
ドライバのインストール
はじめに M5STACKのダウンロードページ からCP2104 Driverをインストールします。これは、macOSでM5StickC PLUSと通信できるようにするため必要です。
インストール完了後、次のコマンドでSiLabsUSBDriverの有無を確認しましょう。
$ 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側にパッケージを追加すれば良いようで、次のようにして解決できました。
$ 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チカから
それでは、M5StickC PLUSのプログラミングをしていきましょう。まずは定番のLEDを点灯させる「Lチカ」からやってみます。実はM5StickC PLUSにはLEDが内蔵されており、G10に割り当てられてます。なので、次のようなプログラミングでLEDを点滅させることができます。ただし、G10がLOWを出力した時にLEDが点灯することに注意してください。
#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!」を表示する
次に、LCD画面に「Hello World!」の文字を表示 してみましょう。次のようにM5ライブラリを使うことで、簡単に文字表示が可能です。ただし、デフォルトでは縦画面に設定されてます。__画面を回転させるにはM5.Lcd.setRotation(3)などで変更します。__
#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を実行すると、動画のように三角形がランダム表示されます。
関連記事
OLEDやLCDをArduinoで制御する記事も書いてます。
ボタンのイベントを取得する
M5StickC PLUSでは、電源ボタン以外に二つのボタンがあり、プログラムで自由に扱えます。__フロントのボタンがAボタン、右サイドのボタンがBボタン__として割り当てられてます。 たとえば、ボタンが押されたかどうかはwasPressed()で判定が可能です。この関数は、ボタンが押される度に一度だけ1を返すので、loop内で状態を監視してあげれば良いです。また、ボタンを押している間だけ処理をさせたい場合は、isPressed()関数で判定できます。
#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を使います。
#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コネクタは、ジャンパーワイヤーと違って容易には外れないためモバイル用途には安心なコネクタです。ただし、__M5とGROVEコネクタのカラーには統一がない__ので注意が必要です!接続先のセンサモジュールをよく確認し、SDA・SCLなど配信が間違わないように注意しましょう。
▼HATなどのG0、G26を使ってI2C通信をやりたい場合は、こちらの記事を参考にしてください。
さて、GY-906とGROVEコネクタ接続してLCDに温度を表示させるプログラムを書いてみました。動画のように、指を近づけるとざっくりとですが体温を測定できました。ちなみに、Objは物体の温度でAmbは周囲の環境の温度(気温)です。
#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のサンプルコード も要チェックです。