「M5Stick」シリーズの最新版「M5StickS3」について、旧モデルとの違いを確認しながら、初期設定や端子配列、機能、使い方をサンプルプログラムで詳しく紹介します。
次回はシリアル通信や無線(Wi-Fi、Bluetooth)通信、赤外線通信、音声録音や録音データの再生等を順次紹介できればと思っています。
旧モデルの「M5StickC Plus/Plus2」については以下のリンクで詳しく紹介しています。


1.M5StickS3とは
2.外観
3.基本仕様(旧モデルとの比較)
4.端子配列
5.端子機能詳細
6.開発環境別初期設定、ライブラリ
・Arduino IDE
・PlatformIO
・UiFlow(ビジュアルプログラミング)
7.サンプルプログラム(コピペ)
・デモ動作1(液晶表示、ブザー、バッテリー)
・デモ動作2(入出力、ADC、PWM)
8.まとめ
1.M5StickS3とは
「M5StickS3」とは「M5Stackテクノロジー社」のマイコンボードで「M5Stick」シリーズの最新バージョンです。
旧モデルと同様に、1.14インチTFT液晶画面や入出力端子、ボタン、スピーカー、3軸ジャイロ+3軸加速度センサ、マイク、バッテリーが内蔵されています。
他にもシリアル通信はもちろんWiFiやBluetooth通信にも対応しており、これらの機能をプログラムで自由に使用することができるため、電子工作やデータ表示器、IoT機器の製作等いろいろなアイデアを形にすることができます。
プログラムは「C言語」ベースの「ArduinoIDE」「PlatformIO」や「ビジュアルプログラミング(UiFlow)」「Python(MicroPython)」さらに、「AiFlow」 という自然言語で指示を書くとMicroPythonコードを自動生成してくれる最新の「AIプログラミング環境」も使用することができます。
2.外観
外観については以下のようになります。
梱包状態
梱包状態は以下になります。今までのプラスチックのケースではなくボール紙での梱包になります。
本体のみで、付属品のType-Cケーブルはありません。


本体外観
本体の外観は以下になります。



正面には「ボタンA」がありますが、旧モデルに比べてかなり押しやすくていい感じです。

背面にはいつものように各機能の接続図がありますが、機能が増えすぎて、ここまで来ると流石に読み取れないですね^^;

本体上面には赤外線送受信ダイオードとマイク、8ピンから16ピンに倍増した出力端子が配置されています。

本体底部は旧モデルと同様にUSBーCとGROVEコネクタが配置されています。

左側面には「電源(ブート切替兼用)ボタン」があります。

右側面には「ボタンB」がありますが、サイズが大きくなり、今までで一番押しやすいと思います。
HATユニットの接続
HATユニットは基本的にM5StickC用のものが使用できますが、下写真のように本体と密着するタイプは、本体形状が異なるため、取り付け時に隙間ができるものがあります。動作については問題ありません。

公式サイトでは非対応となっている「エンコーダユニット」ですが動作はします。

横から見ると形状の違いから隙間ができます。干渉部をカットすれば問題なく使用できそうです。
3.基本仕様(旧モデルとの比較)
基本仕様について、旧モデルと比較した以下表で紹介します。
以下表の太文字が「M5StickS3」の仕様です。
| StickS3 | StickC-Plus2 | StickC-Plus2 | |
|---|---|---|---|
| コントローラ SoC | ESP32-S3-PICO-1-N8R8 | ESP32-PICO-V3-02 | ESP32-PICO-D4 |
| Flash | 8MB | 8MB | 4MB |
| PSRAM | 8MB Octal | 2MB Quad | – |
| SRAM | 512KB | 520KB | 520KB |
| Battery | 250mAh | 200mAh | 120mAh |
| Display | 1.14インチ LCD 135×240 ST7789P3 | 1.14インチ LCD 135×240 ST7789V2 | 1.14インチ LCD 135×240 ST7789V2 |
| 内蔵LED | – | RED LED x1 | RED LED x1 |
| Audio Codec | ES8311 | – | – |
| MIC | MEMS | SPM1423 | SPM1423 |
| Speaker | AW8737 + 8Ω@1W | Buzzer | Buzzer |
| Button | Button x 2 | Button x 3 | Button x 2 |
| IMU | BMI270 | MPU6886 | MPU6886 |
| RTC | – | BM8563 | BM8563 |
| 電源管理IC | M5PM1 | – | AXP192 |
| 赤外線 | 送信+受信(VSOP38338) | 送信のみ | 送信のみ |
| USBドライバ | USB-OTG | CH9102 | CH552 |
| Hat 出力端子 | 2.54-16P | 2.54-8P | 2.54-8P |
4.端子配列
端子配列は下画像のようになります。
端子配列について旧モデルとの最大の違いは、出力端子が8ピンから16ピンに倍増したことです。
正面側横一列の端子は汎用性の高い「I/O(入出力)端子」で「G1~G8端子」はアナログ入力が使用でき、「G43, G44端子」はシリアル通信(UART0)に使用できます。

5.端子機能詳細
端子機能詳細は以下のようになります。

6.開発環境別初期設定、ライブラリ
開発環境としては「ArduinoIDE」や「PlatformIO」、ビジュアルプラグラミングができる「UiFlow」が使用できます。
手軽に動作確認したい場合は「ArduinoIDE」、本格的にプログラミングするなら「PlatformIO」、ノーコードの「ビジュアルプログラミング」でプログラミング体験してみたい方は「UiFlow」がおすすめです。
・Arduino IDE
「Arduino IDE」のインストール方法や初期設定については以下のリンクで詳しく紹介しています。

ボードマネージャ、ライブラリの設定
「ArduinoIDE」で「M5stickS3」を使用するには以下のような設定を行います。
[ボードマネージャ]から「M5Stack」を最新版にアップデート。
※「バージョン 3.3.9」で動作確認済。
・必要なライブラリの準備:
[ライブラリを管理(ライブラリマネージャ)]から以下のライブラリをインストール。
① M5Unified ※「バージョン 0.2.23」で動作確認済。
② M5GFX ※「バージョン 0.2.30」で動作確認済。
ポートの設定
「M5StickS3」本体とパソコンをUSBケーブルで接続してポートの設定を行います。
下画像のように電源ボタンを長押しすると、電源ボタンのLED緑が点滅し「ブートモード」に切替ります。

この状態で下画像のように[ツール]→[ポート:(COM番号は環境によります)]をクリックすると[COM番号(番号は環境によります)(ESP32 Family Device,Ozobot DRVKit)]のように表示されるためこれをクリックします。

これで初期設定は完了です。スケッチを作成して書き込んでみましょう。
・PlatformIO
「PlatformIO」で「M5stickS3」を使用するには以下のような設定を行います。
[ホーム]→[Platforms]→[Updates]から「Espressif 32」を最新版にアップデート。
※「バージョン 7.1.3」で動作確認済。
・ボード設定:
Espressif ESP32-S3-DevKitC-1-N8
・必要なライブラリの準備:
[ホーム]→[Libraries]から以下のライブラリをインストール。
① M5Unified ※「バージョン 0.2.22」で動作確認済。
② M5GFX ※「バージョン 0.2.29」で動作確認済。
「platformio.iniファイル」の内容は以下のようになります。
「公式サイト」より抜粋。
[env:m5stack-sticks3]
platform = espressif32@6.12.0
board = esp32-s3-devkitc-1
framework = arduino
board_build.arduino.partitions = default_8MB.csv
board_build.arduino.memory_type = qio_opi
build_flags =
-DESP32S3
-DBOARD_HAS_PSRAM
-mfix-esp32-psram-cache-issue
-DCORE_DEBUG_LEVEL=5
-DARDUINO_USB_CDC_ON_BOOT=1
-DARDUINO_USB_MODE=1
lib_deps =
M5Unified=https://github.com/m5stack/M5Unified
M5PM1=https://github.com/m5stack/M5PM1
「PlatformIO」のインストール方法は以下のリンクで詳しく紹介しています。
別途「VS Code」と「Python」のインストールも必要です。
インストール順は「① VS Code」「② Python」「③ PlatformIO」です。



詳しい手順は旧モデルと同じで、以下のリンクで詳しく紹介しています。

・UiFlow(ビジュアルプログラミング)
「UiFlow」とは「M5Stackシリーズ」のための「ビジュアルプログラミング」環境で、ブラウザ上で動作します。
「ビジュアルプログラミング」とは、ブロックを組み合わせるようにプログラムを作成することができるプログラミング方法で「日本語の説明が表示されたブロック」があらかじめ用意されており、それらを組み合わせてプログラムを作成できるため、初心者でも感覚的にプログラミングを体験することができます。
実際に「ボタンを押すと液晶画面の色を変える」プログラムは下画像のようになります。

以下のリンクから「UiFlow2.0」の開発画面をブラウザで開くことができます。
ページが開くと以下のような画面が表示されます。

「UiFlow」を使用するには、本体にファームウェアを書き込む必要があります。(工場出荷状態では書き込み済み)
ファームウェアの書き込みには以下リンク先でダウンロードできる「M5Burner」を使用します。
UiFlow2.0の使い方は基本的にはUiFlow1.0と同じです。
UiFlow1.0の使い方やM5Burnerの使い方は以下のリンクで詳しく紹介しています。

7.サンプルプログラム(コピペ)
サンプルプログラムは基本的な動作を確認できるように以下の2種類準備しましたので、コピペで貼り付けて書き込んでみましょう。
・デモ動作1(液晶表示、ブザー、バッテリー)
デモ動作1では本体だけで確認できる動作を確認していきます。
また、本体ボタンA(正面)を押すとブザーが鳴り画面が一瞬青くなります。本体ボタンB(側面)を押すと違う音色でブザーが鳴り、画面が一瞬赤くなる動作が確認できます。

液晶表示には「M5GFX」ライブラリを使用しています。
「M5GFX」の使い方は以下のリンクで詳しく紹介しています。

サンプルプログラムは以下になります。コピペで貼り付けて書き込んでください。
※下コード(黒枠)内の右上角にある小さなアイコンのクリックでもコピーできます。
#include <M5Unified.h> // M5Stackシリーズ用共通ライブラリ
#include <M5GFX.h> // グラフィックライブラリ(Canvas使用時はインクルード必要)
M5Canvas canvas(&M5.Display); // メモリ描画領域の設定
// 初期設定 *****************************************************
void setup() {
auto cfg = M5.config(); // M5Unifiedの設定を取得
M5.begin(cfg); // M5Unifiedの初期化
M5.Speaker.setVolume(150); // ブザー音量設定(0~255)
M5.Display.begin();
M5.Display.setRotation(1); // 必要なら画面回転
M5.Display.fillScreen(TFT_BLACK); // 初期画面
canvas.createSprite(M5.Display.width(), M5.Display.height()); // メモリ描画サイズを設定
canvas.setFont(&fonts::lgfxJapanGothicP_28); // フォント設定
canvas.setTextSize(1); // 文字サイズ
canvas.setTextColor(TFT_WHITE); // 文字色
M5.Power.setExtOutput(true); // 外部電源を有効化(安定化)
}
// メインループ *************************************************
void loop() {
M5.update(); // ボタン状態更新
canvas.fillScreen(TFT_BLACK); // 背景色 黒
bool isCharging = M5.Power.isCharging(); // 充電状態取得
int vol_per = M5.Power.getBatteryLevel(); // バッテリー残量パーセント取得
int vol = M5.Power.getBatteryVoltage(); // バッテリー電圧取得
// 本体ボタン処理
if (M5.BtnA.wasPressed()) {
canvas.fillScreen(TFT_BLUE); // 背景色 青
M5.Speaker.tone(3000, 100); // ブザー(周波数, 音の長さ)
}
if (M5.BtnB.wasPressed()) {
canvas.fillScreen(TFT_RED); // 背景色 赤
M5.Speaker.tone(1000, 200); // ブザー(周波数, 音の長さ)
}
// ディスプレイ表示処理
canvas.drawString("M5StickS3 TEST", 0, 0); // タイトル
canvas.drawFastHLine(0, 32, 230, WHITE); // 境界線
canvas.setCursor(0, 34); // 座標指定
canvas.setTextColor(TFT_WHITE); // 文字色
canvas.printf("Charging: %s \n", isCharging ? "Yes" : "No"); // 充電状態表示
canvas.printf("Bat_level: %d%%\n", vol_per); // バッテリー残量パーセント表示
canvas.printf("Bat_volt: %d%mV\n", vol); // バッテリー電圧表示
canvas.pushSprite(5, 0); // 画面に反映
delay(200); // 遅延時間
}
・デモ動作2(入出力、ADC、PWM)
デモ動作2では基本的な「入出力端子の使い方」の確認と、「アナログ入力とPWM出力の使い方」が確認できます。
動作確認の様子は以下写真のようになります。
GROVEコネクタに「Angle Unit(M5Stack製)」を接続し、G0端子にスイッチを、G1端子に青色LED(抵抗内蔵)、G8端子に赤色LED(抵抗内蔵)を接続しています。


「正面ボタンA」を押すと画面が青色になりLED青が点灯します。「側面ボタンB」を押すと画面が黒になりLED青が消灯します。

「G0」の外付けスイッチを押すとLED青が点灯し、もう一度押すと消灯します。

ボリュームを可変させることで「アナログ入力値」が変化し「PWM出力」でLED赤の明るさを調整できます。

AD変換値は12bitで最大3.3V、PWM出力のDuty比は10bitとしています。
「アナログ入力」と「PWM出力」の使い方は、以下のリンク先で詳しく紹介しています。


サンプルプログラムは以下になります。コピペで貼り付けて書き込んでください。
※下コード(黒枠)内の右上角にある小さなアイコンのクリックでもコピーできます。
#include <M5Unified.h> // M5Stackシリーズ用共通ライブラリ
#include <M5GFX.h> // グラフィックライブラリ(Canvas使用時はインクルード必要)
#define IN 0 // 入力端子
#define OUT 1 // 出力端子
#define ADC 10 // アナログ入力端子
#define LED_PIN 8 // PWM の端子番号
#define PWM_CH0 0 // PWM チャンネル
#define PWM_FREQ 1000 // PWM 周波数
#define BIT_NUM 10 // bit10数 10bit (0〜1023)
M5Canvas canvas(&M5.Display); // メモリ描画領域の設定
// 変数宣言
float ad_val; // アナログ入力値格納用 12bit (0〜4095)
float ad_volt; // アナログ入力格納電圧換算用 (0〜3.3V)
float duty = 0; // アナログ入力電圧換算値をPWNのDuty比へ
bool btn_state = false; // 本体ボタンA,Bの状態
bool led_state = false; // LEDの状態
bool state = false; // ボタン状態の保持
// 初期設定 *****************************************************
void setup() {
auto cfg = M5.config(); // M5Unifiedの設定を取得
M5.begin(cfg); // M5Unifiedの初期化
// 入出力端子設定
pinMode(IN, INPUT_PULLUP); // 入力設定(プルアップ)
pinMode(OUT, OUTPUT); // 出力設定
digitalWrite(OUT, LOW); // 出力初期値
// アナログ入力設定
pinMode(ADC, ANALOG); // アナログ入力
// PWM 初期化
ledcSetup(PWM_CH0, PWM_FREQ, BIT_NUM); // PWM1出力波形の初期設定(チャンネル、周波数、分解能bit)
ledcAttachPin(LED_PIN, PWM_CH0); // チャンネルに対する出力端子を設定
M5.Display.begin();
M5.Display.setRotation(1); // 必要なら画面回転
M5.Display.fillScreen(TFT_BLACK); // 初期画面
canvas.createSprite(M5.Display.width(), M5.Display.height());
canvas.setFont(&fonts::lgfxJapanGothicP_28); // フォント設定
canvas.setTextSize(1);
canvas.setTextColor(TFT_WHITE);
}
// メインループ *************************************************
void loop() {
M5.update(); // ボタン状態更新
// 本体ボタン処理
if (M5.BtnA.wasPressed()) {
btn_state = true; // ボタン状態をtrueに
led_state = true; // 外部LED状態をtrueに
}
if (M5.BtnB.wasPressed()) {
btn_state = false; // ボタン状態をfalseに
led_state = false; // 外部LED状態をfalseに
}
// 外部スイッチ入力処理
if (digitalRead(IN) == LOW && state == false) {
state = true; // ボタン状態stateをtrue
led_state = !led_state; // 外部LED状態を反転
}
if (digitalRead(IN) == HIGH) { // ボタンCと外部入力がOFFなら
state = false; // ボタン状態stateをfalse
}
// 外部LED点灯処理
if (led_state) {
digitalWrite(OUT, HIGH); // LED点灯
}
else {
digitalWrite(OUT, LOW); // LED消灯
}
// アナログ入力処理
ad_val = analogRead(ADC); // アナログ入力値を取得(0〜4095、12bit)
ad_volt = 3.3 * (ad_val / 4095); // アナログ入力電圧(0~3.3V)へ換算
duty = ad_val * (1023.0 / 4095.0); // 1023Vへ換算
ledcWrite(PWM_CH0, (int)duty); // アナログ入力値をDuty比に指定してPWM出力(チャンネル, Duty比)
// ディスプレイ表示処理
if (btn_state) { // 本体ボタンA,Bの状態true(AがONされた)
canvas.fillScreen(TFT_BLUE); // 背景色 青
}
else {
canvas.fillScreen(TFT_BLACK); // 背景色 黒
}
canvas.drawString("M5StickS3 TEST", 0, 0); // タイトル
canvas.drawFastHLine(0, 32, 230, WHITE); // 境界線
canvas.setCursor(0, 34); // 座標指定
canvas.setTextColor(TFT_WHITE); // 文字色
canvas.printf("ADC_val: %.0f\n", ad_val); // アナログ入力値表示
canvas.printf("ADC_volt: %.2fV\n", ad_volt); // アナログ電圧換算値表示
canvas.printf("PWM_duty: %.0f\n", duty); // PWM Duty比表示
canvas.pushSprite(5, 0); // 画面に反映
delay(100); // 遅延時間
}8.まとめ
「M5Stick」シリーズの最新版「M5StickS3」について、旧モデルとの違いを確認しながら、初期設定や端子配列、機能、使い方をサンプルプログラムで詳しく紹介しました。
「M5StickS3」は、従来のM5Stickシリーズを大きく進化させた最新モデルであり、 赤外線受信の追加、スピーカーアンプの搭載、端子数の倍増(8→16ピン) によって、 小型ながらM5Stackシリーズ並みの拡張性を手に入れた点が最大の特徴です。
サンプルプログラムでは、基本的な入出力・液晶表示・ADC・PWMの使い方を紹介しました。
特に「M5Unified+M5GFX」による開発は扱いやすく、Arduino IDE・PlatformIO・UiFlow など複数の環境で柔軟に利用できます。
「M5StickS3」は旧モデル以上に、以下のような幅広い用途に活用できる非常に優秀なマイコンボードと思います。
・小型デバイスの試作
・IoT機器のプロトタイプ
・データ表示器
・センサー連携の電子工作 など
次回は、シリアル通信・Wi-Fi/Bluetooth・赤外線通信・音声録音/再生といった、 より実践的な機能を深掘りしていきますので、ぜひ楽しみにしていてください。

























コメント