Arduino IDEで簡単なプログラム(C++)を作成してM5StickCで実行してみた
Contents
はじめに
M5StickC(エムファイブスティック・シー)を手に入れたので簡単なプログラムを作って動作させるまでの備忘録を記事として残しておく。
M5StickCとは
M5StickCはESP32と同じアーキテクチャのESP32-PICOを搭載したスティック型のM5Stack社の製品だ。
主な特徴は、
- 4MBフラッシュ+520K RAMメモリ
- TFT LCD(TFT液晶ディスプレイ)
- Wi-Fi、Bluetooth
- リチウムイオンポリマーバッテリー内蔵(80mAh)
- 電源ボタン+ボタン×2個
- USB Type-Cコネクター
- HY2.0-4P(Grove互換コネクター)
- LED×1個
- 赤外線送信
- 拡張コネクター
- 3軸加速度センサー+3軸ジャイロセンサー(6軸)
- マイクロフォン内蔵
となっている。
M5StickC は下記の M5StickC Plus に置き換わっている。
スイッチサイエンスでは M5StickC(本体のみ)がまだ販売されていた。
M5StickCの特徴をもう少し詳しく説明しておく。
TFT LCD(TFT液晶ディスプレイ)
ディスプレイは0.96インチ(80×160)のTFT LCD(Thin Film Transistor Liquid Crystal Display)。
使用しているモジュールはST7735Sと書いてあった。
Wi-Fi、Bluetooth
ESP32をベースにしているのでWi-FiおよびBluetoothが内蔵されている。
下記の写真は工場出荷時にプリインストールされているBLE(Bluetooth Low Energy)のサンプルアプリ。
リチウムイオンポリマーバッテリー
内蔵バッテリーはリチウムイオンポリマーバッテリーだった。
ドローンにも使われており小型でパワフルな反面、高温での使用や充電時の取り扱い注意との話も聞くので雑な扱いは避けるようにしたい。
ボタン類
ボタンは電源ボタンとボタンAとBの3つがある。
電源ボタンとボタンA
正面にあるのがボタンA、側面にあるのが電源ボタンで、
- 電源オン:電源ボタンを2秒間押す
- 電源オフ:電源ボタンを6秒間押す
と電源オフの方が若干長目に押す仕様になっている。
ボタンB
電源ボタンの反対側にボタンBがある。
コネクター
下記の写真で上にあるコネクターが電源供給とPCで作成したプログラムのダウンロードに使用するUSB Type-Cコネクター。
下の4ピンの端子がGROVE互換のHY2.0-4P。
HY2.0-4Pは電源とGNDの他に2本の信号線があり、下記の写真の向かって左から
- GND
- Vout(5.0V)
- GPIO32(SDA)
- GPIO33(SCL)
となっており裏面のシールの印字で分かるようになっている。
自分はまだ未検証だがSDAとSCLでのI2C通信でBME280で温湿度、気圧を測定している記事もあったのでいずれ試してみたいと思っている。
M5StickCのGrove端子にBME280を接続して温湿度・気圧を測定した記事を書いた。
拡張コネクター
USBコネクターの反対側にあるのが2.54mmピッチの汎用ピンコネクター。
写真向かって左から、
- 5.0V 入力
- 3.3V 出力 ※
- 内蔵バッテリー※
- GPIO0
- GPIO36
- GPIO26
- 5.0V 出力※
- GND
となっている。
※3.3Vや5.0V出力が電源オンの時だけ電圧がかかるのに対して内蔵バッテリーは電源オフ時も3.928V(フル充電時)の電圧だった。
LED
赤色LEDが本体左上に付いている。
前述の写真はLEDが点灯している状態。
赤外線送信
自分はまだ未検証だが赤外線送信ができる模様。
下記の写真は工場出荷時にプリインストールされている赤外線送信のサンプルアプリ。
加速度センサーとジャイロセンサー
3軸(X、Y、Z)の加速度センサーと3軸のジャイロセンサーが搭載されていて(チップはMPU6886)M5StickCを傾けたり振ったり、回転させた時の状態を測定することができる。
加速度センサーは単位時間あたりの速度の変化を測定するので速度が早く(遅く)なっている状態を測定する。
静止または等速運動の場合の加速度はゼロになる。
またジャイロセンサーは角度の変化(角速度)を検知するセンサー。
その場で回転した場合、加速度センサーでは位置が動いている訳ではないので加速度がゼロになるが、ジャイロセンサーでは検知できる。
加速度センサーとジャイロセンサーを組み合わせれば大抵の物体の動きは検知できる。
下記の写真は工場出荷時にプリインストールされている加速度センサーとジャイロセンサーを使ったサンプルアプリ。
マイクロフォン
マイクロフォンはM5ボタンの下に内蔵されていて、使用しているチップはSPM1423。
下記の写真は工場出荷時にプリインストールされているマイクロフォンを使ったサンプルアプリ。
M5Stackシリーズ
M5StickCを購入するに辺り、似たような名前の製品が沢山あり違いがよく分からずネット上をウロウロとしたのでその時に調べた事を記録として記事にしておく。
それぞの製品の違いが既に分かっている人は次の章の”プログラム環境“まで読み飛ばして欲しい。
M5Stack社(エムファイブ・スタック社)は中国深セン市に本社がありESP32をベースにしたM5Stack、M5Stickシリーズの製品を製造している。
日本では株式会社スイッチサイエンス社がM5Stackを積極的に扱っている。
M5Stack系
M5Stack系は主に以下の製品が販売されている。
- M5Stack Basic
- M5Stack Gray(9軸IMU搭載)
- M5Stack Faces(9軸IMU搭載、各種カバー付き)
- M5Stack FIRE
- M5GO IoTスターターキット(各種IoTセンサー付属)
- M5Stack Core2
- M5Stack ATOM Matrix
1. M5Stack Basic
Basicの名の通り基本的なM5Stack。
搭載チップ | ESP32 240MHz dual core |
メモリ | 520KB SRAM |
フラッシュメモリ | 4M FLASH |
ディスプレイ | 320×240 カラーTFT LCD(2.0インチ) |
ネットワーク | Wi-Fi、dual mode Bluetooth |
入力 | 5.0V~5.5V/500mA(USB Type-C経由) |
インターフェイス |
|
内蔵スピーカー | 1W |
内蔵電池 | 3.7V/150mAh |
2. M5Stack Gray
M5Stack Basicに加速度3軸及びジャイロ3軸を検知する6軸センサー(MPU6886)と3軸地磁気を計測可能なセンサー(BMM150)を搭載したモデル。
搭載チップ | ESP32 240MHz dual core |
メモリ | 520KB SRAM |
フラッシュメモリ | 16M FLASH |
ディスプレイ | 320×240 カラーTFT LCD(2.0インチ) |
ネットワーク | Wi-Fi、dual mode Bluetooth |
入力 | 5.0V~5.5V/500mA(USB Type-C経由) |
インターフェイス |
|
慣性計測センサー |
初期モデルはMPU9250だったが2019年頃からMPU6886+BMM150の組み合わせに変わっている |
内蔵スピーカー | 1W |
内蔵電池 | 3.7V/150mAh |
3. M5Stack Faces
9軸センサーを搭載したM5Stack Grayに、キーボード、テンキー、ゲームパネルを搭載したモデル。
搭載チップ | ESP32 240MHz dual core |
メモリ | 520KB SRAM |
フラッシュメモリ | 16M FLASH |
ディスプレイ | 320×240 カラーTFT LCD(2.0インチ) |
ネットワーク | Wi-Fi、dual mode Bluetooth |
入力 | 5.0V~5.5V/500mA(USB Type-C経由) |
インターフェイス |
|
慣性計測センサー |
初期モデルはMPU9250だったが2019年頃からMPU6886+BMM150の組み合わせに変わっている |
入力機器 |
|
内蔵スピーカー | 1W |
内蔵電池 | 3.7V/150mAh |
4. M5Stack FIRE
9軸センサーを搭載したM5Stack Gray相当にメモリが4M PSRAMに強化されているのとLED BAR(RGB LED×10)や充電用のCharge Baseが付いている。
またインターフェース類はM5Stack Grayとは異なるのと本体裏側にレゴとジョイントできる穴が空いている。
搭載チップ | ESP32 240MHz dual core |
メモリ | 520KB SRAM、4M PSRAM |
フラッシュメモリ | 16M FLASH |
ディスプレイ | 320×240 カラーTFT LCD(2.0インチ) |
ネットワーク | Wi-Fi、dual mode Bluetooth |
入力 | 5.0V/500mA(USB Type-C経由) |
インターフェイス |
|
慣性計測センサー |
初期モデルはMPU6050+MAG3110だったがMPU9250に変更され最新モデルはMPU6886+BMM150の組み合わせになっている |
LED | LED BAR(RGB LED×10) |
内蔵スピーカー | 1W |
内蔵電池 | 3.7V/550mAh |
5. M5GO IoTスターターキット
M5stack Gray相当に温湿度の測定や赤外線など各種センサーが付属しているセット。
LEGOとの互換用のパーツも付属しているのでレゴマインドストームEV3とも組み合わせる事ができる。
シリアル変換モジュールが CP2104 から CH9102F へと変更された Ver2.6 がスイッチサイエンスで販売されている。
搭載チップ | ESP32 240MHz dual core |
メモリ | 520KB SRAM |
フラッシュメモリ | 16M FLASH |
ディスプレイ | 320×240 カラーTFT LCD(2.0インチ) |
ネットワーク | Wi-Fi、dual mode Bluetooth |
入力 | 5.0V/500mA(USB Type-C経由) |
インターフェイス |
|
慣性計測センサー | MPU9250:加速度3軸、ジャイロ(角速度)3軸、地磁気3軸の9軸センサー |
LED | LED BAR(RGB LED×10) |
内蔵スピーカー | 1W |
マイクロフォン | マイク |
内蔵電池 | 3.7V/550mAh |
付属センサー |
|
6. M5Stack Core2
2020年9月に発売されたオリジナル世代のCoreを機能拡張したバージョン。
M5Stack Grayと比較すると8M PSRAM、タッチスクリーン、地磁気センサーがついてない(6軸の加速度&ジャイロセンサーのみ)、振動モーターによるバイブレーション、マイクロフォン、リアルタイムクッロック等の違いがある。
搭載チップ | ESP32 D0WD-V3 240MHz dual core |
メモリ | 520KB SRAM、8M PSRAM |
フラッシュメモリ | 16M FLASH |
ディスプレイ | 320×240 カラーTFT LCD(2.0インチ) タッチスクリーン(FT6336U) |
ネットワーク | Wi-Fi、dual mode Bluetooth |
入力 | 5.0V/500mA(USB Type-C経由) |
インターフェイス |
|
慣性計測センサー | MPU6886:加速度3軸及びジャイロ(角速度)3軸の6軸 |
その他 |
|
LED | 電源表示灯(緑) |
内蔵スピーカー | 1W I2Sパワーアンプ(NS4168) |
内蔵電池 | 3.7V/390mAh(リチウムバッテリ) |
7. M5Stack ATOM Matrix
M5Stack シリーズの中でもコンパクトな開発モジュール。
24x24mm の小さなサイズにESP32チップを搭載している。
搭載チップ | ESP32-PICO-D4 チップ |
メモリ | 統合型 520 KB SRAM |
フラッシュメモリ | 4M FLASH |
ディスプレイ | 5 x 5 RGB LEDパネル |
ネットワーク | Wi-Fi、dual mode Bluetooth |
入力 | 5.0V@500mA(USB Type-C経由) |
インターフェイス |
|
慣性計測センサー | MPU6886:加速度3軸及びジャイロ(角速度)3軸の6軸 |
その他 | 赤外線送信 |
M5Stick系
M5Stick系は主に以下の製品が販売されている。
- M5StickC
- M5stickC Plus
- M5StickV AIカメラ搭載
1. M5StickC
M5Stackを小型化して若干スペックがダウンしているがIMU(慣性計測装置)も積んでおり最初に始めるIoT機器としてはおすすめ。
M5StickC は下記の M5StickC Plus に置き換わっている。
スイッチサイエンスでは M5StickC(本体のみ)がまだ販売されていた。
搭載チップ | ESP32-PICO 240MHz dual core |
メモリ | 520KB SRAM |
フラッシュメモリ | 4M FLASH |
ディスプレイ | 80×160 カラーTFT LCD(0.96インチ) |
ネットワーク | Wi-Fi、dual mode Bluetooth |
入力 | 5.0V@500mA(USB Type-C経由) |
インターフェイス |
|
慣性計測センサー | MPU6886:加速度3軸及びジャイロ(角速度)3軸の6軸 当初はSH200Qだったが2019年頃からMPU6886に切り替わっている |
その他 | 赤外線送信 |
LED | 赤色LED×1個 |
マイクロフォン | マイクロフォン内蔵 |
内蔵電池 | 80mAh リチウムイオンポリマーバッテリー |
2. M5StickC Plus
M5stickと比較して画面が大きくなった事とバッテリー容量が増えてブザーが追加されたバージョン。
搭載チップ | ESP32-PICO-D4 240MHz dual core |
メモリ | 520KB SRAM |
フラッシュメモリ | 4M FLASH |
ディスプレイ | 135×240 カラーTFT LCD(1.14インチ) |
ネットワーク | Wi-Fi、dual mode Bluetooth |
入力 | 5.0V@500mA(USB Type-C経由) |
インターフェイス |
|
慣性計測センサー | MPU6886:加速度3軸及びジャイロ(角速度)3軸の6軸 当初はSH200Qだったが2019年頃からMPU6886に切り替わっている |
その他 |
|
LED | 赤色LED×1個 |
マイクロフォン | マイクロフォン内蔵 |
内蔵電池 | 120mAh@3.7V |
3. M5StickV AIカメラ搭載
搭載チップはESP32ではなく64ビットRISC-Vを搭載している。
カメラに写った映像をV-Trainingというサービスを使って学習させて学習後のモデルをM5stickVにダウンロードすればニューラルネットワークプロセッサーで物体検知(Object Detection)が出来たりと面白そうな使い方ができそうな製品。
Micropythonが動くようなのでいずれ試してみたいと思っている。
搭載チップ等 |
|
メモリ | 8MiB SRAM |
フラッシュメモリ | 16M FLASH |
ディスプレイ | 135×240 カラーTFT LCD(1.14インチ) |
ネットワーク | Wi-Fi、dual mode Bluetooth |
入力 | 5.0V DC電源(USB Type-C経由) |
インターフェイス |
|
慣性計測センサー | MPU6886:加速度3軸及びジャイロ(角速度)3軸の6軸 |
カメラ | 640×480カメラ(OV7740イメージセンサー) |
LED | ステータスLED(RGBW) |
マイクロフォン | マイクロフォン(MSM261S4030HOR) ※マイクロフォンの無いバージョンもある様なので購入時には注意 |
内蔵電池 | 200mAh |
プログラム環境
M5StickCでのプログラムの作成に戻る。
簡単なテストプログラムを作成するにあたってプログラミング環境について調べてみた。
環境
尚、自分の環境は以下の通りである。
OS | Windows10 Home バージョン1903 |
本体 | DELL G7 15 7588 |
CPU | CoreTM i7-8750H |
開発環境と言語の選定
一般的な開発環境と言語はArduino IDEでC/C++の選択の模様。
MicroPythonでも動かすことが出来るみたいなのでネットで色々と調べたのだが、M5Stack関係のPythonでのサンプルソースはそれ程多くはなかった。
自分的にはC言語はイマイチ(というかかなり)分かっていないので少しでもマシなPythonを選択したい所だがこの手の選択は言語が苦手でも参考資料やサンプルコードが多いほうが結局楽になる事が多いと感じている。
「まぁC/C++もやっているうちに出来る様になるでしょう」と諦めてArduino IDEをインストールすることにする。
Arduino IDEのダウンロード
こちらのページへアクセスして右側の”DOWNLOAD OPTIONS”の”Windows Win7 and newer”をクリックする。
寄付をしつつダウンロードする場合は金額を選択して「CONTRIBUTE & DOWNLOAD」ボタンを押すとPayPalでの寄付ができる。
もしArduino IDEを使い込むようなら寄付をしようと思いつつまずは無料の”JUST DOWNLOAD”をクリックした。
arduino-1.8.13-windows.exeファイルをローカルディスクに保存する。
インストーラーの起動
ダウンロードしたarduino-1.8.13-windows.exeを起動するとGNUのライセンスが表示されるので「I Agree」をクリックする。
インストールオプションが表示されるので確認をして「Next」ボタンをクリックする。
インストール先フォルダーを確認して「Install」ボタンをクリックする。
追加ソフトウェアのインストール
Adafruit IndustriesのLLCポートデバイスソフトウェアのインストールを確認されるので「インストール」ボタンをクリックする。
Arduino srlのUSBドライバーのインストールを確認されるので「インストール」ボタンをクリックする。
続いてArdiuno LLCのUSBドライバーのインストールを確認されるので「インストール」ボタンをクリックする。
何故、Arduino srl(イタリア)とArdiuno LLC(米国)の2つのUSBドライバーがあるのかは良く分からないが以前に分裂していた事があったので(2016年に和解)その時の名残なのかも知れない。
インストールが終了したら「Close」ボタンをクリックする。
動作環境の準備
インストールが終了したらM5StickCのプログラミングに必要なライブラリー類をインストールする。
ボードマネージャの追加
Arduino IDEを起動したら”ファイル”ー>”環境設定”を選択する。
追加ボードマネージャのURL欄に、
https://dl.espressif.com/dl/package_esp32_index.json
を入力して「OK」ボタンをクリックするとESP32を認識できるようになる。
※複数のボードマネージャを指定する場合は”,”(カンマ)で区切る。
続いて”ツール”ー>”ボード”ー>”ボードマネージャ”を選択する。
検索欄で”esp32″を入力すると絞り込まれるので「インストール」ボタンをクリックする。
インストールが終了したら「閉じる」ボタンで閉じる。
ライブラリーのインストール
続いて必要なライブラリーをインストールする。
メニューから”スケッチ”ー>”ライブラリをインクルード”ー>”ライブラリを管理”を選択する。
検索欄で”M5StickC”で絞り込んで該当ライブラリを表示させたら「インストール」ボタンをクリックしてM5StickCのライブラリーをインストールする。
同じく検索欄で”FastLED”で絞り込んで「インストール」ボタンをクリックしてFastLEDのライブラリーをインストールする。
尚、このライブラリーは工場出荷時のサンプルアプリで使用しているのでインストールしておく。
インストールが終了したら「閉じる」ボタンで閉じる。
COMポートの確認
M5StickCをパソコンとUSB接続をするとCOMポートが認識されるので番号を調べておく。
エクスプローラーから”PC”上で右クリック、”プロパティ”を選択する。
デバイスマネージャーをクリックする。
M5StickCをUSB接続するとCOM5(環境によって変わる可能性があり)が表示されるのでCOM5である事が分かる。
ボードの選択
続いてArduino IDEのメニューから”ツール”ー>”ボード”ー>”ESP32 Arduino”ー>”M5Stick-C”を選択する。
Upload Speedが1500000に変わるので(変わっていなければ手動で変更する)続いて”ツール”ー>”Partition Scheme”ー>”No OTA(Large APP)”を選択する。
OTAとはOver the Airの略称でWi-Fi経由でプログラムのバージョンアップを行う機能なのだが一時的に新旧のプログラムがメモリに読み込まれるのでプログラムサイズの2倍分の空きメモリが必要になる。
今回テストで作成するプログラム程度であれば何も問題が無いサイズなのだが工場出荷時にインストールされていたプログラムに戻そうとコンパイルした所、OTAが有効になっていると、
The program size (1338029 bytes) is greater than maximum allowed (1310720 bytes)
のエラーになってしまった。
メモリ上のプログラム領域を1.3MByte以上に広げる設定もあるようなのだが、とりあえずOTAを無効にして対応する事にしている。
ポートの選択
先程、確認しておいたCOMポート(COM5)を設定する。
メニューから”ツール”ー>”シリアルポート”ー>”COM5″を選択する。
以上で事前の設定は終了。
テストプログラム
メニューから”ファイル”ー>”新規ファイル”で新規プログラムを作成する。
仕様
テスト用のプログラムの仕様は以下の通り。
- ボタンA(M5ボタン)でLEDの点灯/消灯を切り替える(トグル)
- LED点灯時はディスプレイに”LED ON”の文字、消灯時は”LED OFF”の文字を表示する
- ボタンBでディスプレイの文字の表示を”背景が黒の白文字”と”背景が白の赤文字”に切り替える(トグル)
ソースコード
上記のプログラムのソースコードは以下の通り。
#include <M5StickC.h>
#define LED_PIN 10
#define LED_ON LOW // LED点灯
#define LED_OFF HIGH // LED消灯
int led_flg = 0; // false
int color_flg = 0; // false
void setup() {
M5.begin();
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LED_OFF); // LEDを消灯する
led_flg = 0;
M5.Lcd.setRotation(1); // LCDの方向を変える
M5.Lcd.setTextSize(2); // フォントサイズを2倍
M5.Lcd.setTextColor(WHITE, BLACK); // 文字を白、背景を黒
color_flg = 0;
M5.Lcd.setCursor(10,10);
M5.Lcd.print("LED OFF"); // LED OFFを表示
}
void loop() {
M5.update();
if(M5.BtnA.wasPressed()){ // ボタンAが押された時
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(10,10);
if (led_flg){ // 点灯なら
digitalWrite(LED_PIN, LED_OFF); // 消灯する
M5.Lcd.print("LED OFF"); // LED OFFを表示
led_flg = 0;
} else { // 消灯なら
digitalWrite(LED_PIN, LED_ON); // 点灯させる
M5.Lcd.print("LED ON"); // LED ONを表示
led_flg = 1;
}
delay(500);
}
if(M5.BtnA.wasReleased()){ // ボタンAが離された時
; // 何もしない
}
if(M5.BtnB.wasPressed()){ // ボタンBが押された時
if (color_flg){ // 文字赤、背景白なら
M5.Lcd.setTextColor(WHITE, BLACK); // 文字を白、背景を黒
color_flg = 0;
} else { // 文字白、背景黒なら
M5.Lcd.setTextColor(RED, WHITE); // 文字を赤、背景を白
color_flg = 1;
}
delay(500);
}
if(M5.BtnB.wasReleased()){ // ボタンBが離されたとき
; // 何もしない
}
}
フラグで状態を判断するのでは無くもっとスマートな方法があるのだとは思うのと、もうちょっとC/C++らしいコードを書ければ良いのだがC言語初心者という事で容赦して欲しい。
コンパイルと書き込み
続いてメニューから”スケッチ”ー>”マイコンボードに書き込む”を選択するとコンパイルすると同時にM5StickCに実行モジュールを書き込む。
書き込むと同時にプログラムが動作するのでボタンA、Bを押してみて希望の動作をすることを確認した。
最初のプログラムに戻す
新たなプログラムを書き込むとの元のプログラムは消えてしまうので工場出荷時のプログラムに戻したい時は以下の手順で戻す。
メニュから”ファイル”ー>”開く”でファイルを開く。
Arduino IDEのライブラリーをインストールしたフォルダー(Windows10の場合はデフォルトだと”ドキュメント”)配下の下記のファルダーのFactoryTest.inoを開く。
C:¥Users¥ユーザ名¥Documents¥Arduino¥libraries¥M5StickC¥examples¥Basics¥FactoryTest¥FactoryTest.ino
ファイルを開いたら前述の手順でメニューから”スケッチ”ー>”マイコンボードに書き込む”を選択してプログラムをM5StickCに書き込めば工場出荷時の状態に戻る。
以上で今回の記事を終了する。
この記事が何処かで誰かの役に立つことを願っている。
尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
最近のコメント