はじめに
前回、水槽管理用にM5 Stamp S3というマイコンボードを使ってみる!というお話をさせていただきました。
今回は実際にどうやって使えるのか、まずはサンプルプログラム(Lチカ)1が動くようにしていきたいと思います。
今回は基本的には公式の手順に従いますが、ちょいちょい余計かな?とかうまくいかない部分があったのでちょっと改変しています。
インストール
まずは開発に使うArduino IDEをこちらからダウンロードしてください

私の環境はWindows11なので、下の赤矢印のものを選択します。

インストールで特に気を付けることはないのですが、一応スクショを載せておきます。

インストール完了後、こんな画面が出ればOKです。

※ 初回起動時にdpinstがどうこういう画面が出るかもしれません。全部「はい」にしておきましょう。
※ 私は前回のインストールの設定が残ったままなのか、テーマが「ダーク」になっていますが、画面の色が違っても問題ありません。
※ 言語設定もデフォルトは英語かもしれません。もし英語になっていたら「File」→「Preferences」で日本に設定する項目がありますのでそこから変更してください。
設定編
ここからちょっとめんどくさくなります。
ボードマネージャーの設定
これは、今回で言うとM5 Stamp S3を使うための設定データをインストールする作業になります。
Arduino IDEの公式にはM5 Stamp S3の設定がないので、メーカのサイトからダウンロードする形になります。
そのため、その設定ファイルを探しにいくためのURLをArduino IDEの設定に追加します
まずは「ファイル」→「基本設定」と進みます。

続いて、「追加のボードマネージャーのURL」に以下のURLを入れます
https://static-cdn.m5stack.com/resource/arduino/package_m5stack_index.json

これでM5Stack公式のボードマネージャーがインストールできるようになったので、実際にインストールしてみます。
- 「ボードマネージャー」の画面に行きます
- 検索窓に「M5Stack」と入れます。「M5Stack by M5Stack」がお目当てのモノです
- 「インストール」を押すとインストールが始まります (インストールが終わるまで結構時間がかかります)

「Platforms Platform m5stack:esp32@x.x.x installed」と表示されたらインストール成功です。

最後に使うボードを選択して完了です。
「ツール」→「ボード」→「M5Stack」→「M5StampS3」を選択します。

ライブラリのインストール
続いてライブラリのインストールです。
ライブラリとは各種機能をかんたんに使えるようにしてくれる道具箱のようなものです。
公式ではM5 Stamp S3用のライブラリをダウンロードしてインストールしろ、とあるのですが、今回はサンプルプログラムを動かすために必要最小限のインストールにしようと思います。
サンプルプログラムのLチカに必要なライブラリは「FastLED」というものです。
「ライブラリ」から「FastLED」で検索してインストールします。
ここで、バージョンを選択できるのですが、「3.9.9」を選択してください (2025/01/12時点)
※下の図で「インストール」の上にある「3.9.10」となっている部分です

なぜ古いバージョンにするのか (詳細はここをクリック)
3.9.10は参照するライブラリが増えているようで、今の環境ではライブラリが足りずコンパイルでエラーになりました。
In file included from c:\Users\XXX\Documents\Arduino\libraries\FastLED\src/third_party/yves/I2SClockLessLedDriveresp32s3/driver.h:9,
from c:\Users\XXX\Documents\Arduino\libraries\FastLED\src\platforms\esp\32\clockless_i2s_esp32s3.cpp:6:
c:\Users\XXX\Documents\Arduino\libraries\FastLED\src/third_party/yves/I2SClockLessLedDriveresp32s3/src/I2SClockLessLedDriveresp32s3.h:8:10: fatal error: esp_memory_utils.h: No such file or directory
#include "esp_memory_utils.h"
^~~~~~~~~~~~~~~~~~~~
compilation terminated.
exit status 1
Compilation error: exit status 1
FastLED自体は動作確認のためだけに使うので、新しくライブラリを導入してまで新しいものを使う必要はないかな、ということで3.9.9を使います。
この記事、実は先週一連の流れを一回やっており、今回流れを把握したうえで最初からやり直しているのですが先週には無かったエラーが出てビビりました。
これでライブラリの準備は完了です
動かす編
ここからは実際にサンプルプログラムを動かしてみます。
プログラムの用意
ここでプログラムの登場です。
基本はこちらのプログラムを使うのですが、ちょっとだけ変えてます。
何か工夫したとかではなく、単純に動かなかったからです。
何が悪かったのか、詳細はこちらをクリック。
マニュアル通りにやってみるとコンパイル2時に「”USBSerial” was not declared in this scope」と、”USBSerial”が宣言されてないよ、というエラーが出ます。
解決するには、以下の2種類のどちらかの方法があります。
※ 両方変えるとダメです
- 「USBSerial」を「Serial」に変更する
- 「ツール」→「USB CDC on Boot “Enable”」をDisableに変更する
昔はそんなことせずともコンパイルできていたようです。
おかげで私は「なんでマニュアル通りにやってるのにできないんだ!」とすごく苦労しました。
どうやらある時から、この「USB CDC on Boot」がEnableかDisableかでコンパイルの際のシリアル通信用の機能の名前がUSBSrialかSerialのどちらかに自動で変更して定義されるようになったらしいです。
- USB CDC on BootがEnableの場合 : 通信機能の名前 = 「Serial」
- USB CDC on BootがDisableの場合 : 通信機能の名前 = 「USBSerial」
という感じみたいです。
なので私の環境ではUSB CDC on BootがEnableになっていたので、名前が「Serial」と定義され、「USBSerialを出せ!」と言ってもコンパイラは「何それ?」となる、ということです。
M5 Stamp S3はUSB周りにちょっと癖があるため、こういうことになっているらしいです。
というのも、普通この手のプログラムの書き込みは書き込み専用のハードウェアを通して書き込むのですが、この機種は自前でそれを搭載しているのでUSBに刺せばそのまま書き込めるという素晴らしい仕様になっております。
そのためUSBポートの使い分けが必要らしく、非常に便利な分、ちょっと複雑になっている、というお話です。
それでは以下のサンプルプログラムをコピペしてください。
Lチカプログラム (最小限の改変しかしていないのでコメントに中国語が残っていますが気にしないでください)
/*
*******************************************************************************
* Copyright (c) 2022 by M5Stack
* Equipped with StampS3 sample source code
* 配套 StampS3 示例源代码
* Visit for more information: https://docs.m5stack.com/en/core/stamps3
* 获取更多资料请访问: https://docs.m5stack.com/zh_CN/core/stamps3
*
* Describe: LED Show example. LED展示示例
* Date: 2023/1/11
*******************************************************************************
Press button to change LED status
按下按键切换LED状态.
*/
#include <FastLED.h>
#define PIN_BUTTON 0
#define PIN_LED 21
#define NUM_LEDS 1
CRGB leds[NUM_LEDS];
uint8_t led_ih = 0;
uint8_t led_status = 0;
String led_status_string[] = {"Rainbow", "Red", "Green", "Blue"};
/* After StampS3 is started or reset
the program in the setUp () function will be run, and this part will only be
run once.
在StampS3启动或者复位后,即会开始执行setup()函数中的程序,该部分只会执行一次。
*/
void setup() {
Serial.begin(115200);
Serial.println("StampS3 demo!");
pinMode(PIN_BUTTON, INPUT);
FastLED.addLeds<WS2812, PIN_LED, GRB>(leds, NUM_LEDS);
}
/* After the program in setup() runs, it runs the program in loop()
The loop() function is an infinite loop in which the program runs repeatedly
在setup()函数中的程序执行完后,会接着执行loop()函数中的程序
loop()函数是一个死循环,其中的程序会不断的重复运行
*/
void loop() {
switch (led_status) {
case 0:
leds[0] = CHSV(led_ih, 255, 255);
break;
case 1:
leds[0] = CRGB::Red;
break;
case 2:
leds[0] = CRGB::Green;
break;
case 3:
leds[0] = CRGB::Blue;
break;
default:
break;
}
FastLED.show();
led_ih++;
delay(15);
if (!digitalRead(PIN_BUTTON)) {
delay(5);
if (!digitalRead(PIN_BUTTON)) {
led_status++;
if (led_status > 3) led_status = 0;
while (!digitalRead(PIN_BUTTON))
;
Serial.print("LED status updated: ");
Serial.println(led_status_string[led_status]);
}
}
}
次に下の矢印で示した「検証」というボタンを押すとコンパイルが始まります。
この作業はコンパイルができそうかチェックしているだけなので、してもしなくてもいいです。
※ 本体に書き込みをする際、もう一度コンパイル作業は発生します。

うまくいくと上記のような画面になり、失敗すると出力ウィンドウに何かしら赤文字でエラーが表示されます。
本体の接続
さて、いよいよ本体を接続します。
ここで気を付けてほしいのが、M5 Stamp S3の中心にあるボタン、これを押しながら接続してください。
※ そこまで気を付けなくてもよかったです。
押さずにUSBを指しても既存のプログラムが動いたまま新しいプログラムを書き込めました。


これを押しながら接続することで「ダウンロードモード」というのに入り、プログラムを転送できるようになります。
そうすると「ツール」→「ポート」のところになにやらそれっぽいのが現れますので、これを選択します。

うまくいくとボードの名前にUSBマークがつきます。

続いて「書き込み」ボタンを押して、実際にボードにプログラムを書き込みます。

うまくいくと上の画面のように出力ウィンドウの表示になります
動かしてみる
現在は書き込みモードになっているため、いったんUSBケーブルを外して接続しなおすことで通常の動作モードに入れます。
※ 今度はボタンは押しません
いかがでしょう?LEDは七色に光りましたでしょうか?
もしかしたら今回の私のように仕様変更のせいで示された手順ではできなくなっている可能性もあります。
そういう時は、基本エラーコードで検索してひたすら調べていました。
ここのコメントに何か書いていただければ私も調べようかなと思います。
私も駆け出しなので力になれるかはわからないのですが。。。
今回は以上です。ここまでお付き合いいただきありがとうございました
コメント
私もFastLEDのバージョン違いでハマっていたので、助かりました。ありがとうございます。
1/15現在FastLEDの最新バージョンは3.9.11になってますが、
fatal error: driver/rmt_types.h: No such file or directory
という別のエラーが出てしまいます。
また、プログラムの書き込み時にボタンを押しながら接続していますが、私の環境ではボタンを押さなくても書き込み出来ています。書き込みが終わると、そのまま動作モードになっているのですが、なにか設定が違うのでしょうか。
コメントありがとうございます。
お役に立てたようでうれしい限りです。
3.9.11でまた別のエラーとは、、、けっこう頻繁に仕様が変わるんですね。
試してみましたが、私の環境でも押さずに接続しても書き込み・そのまま動作はおっしゃるように可能でした。
公式のままにやっていたので気づきませんでした。混乱させて申し訳ありません。
ボタンを押しながらだと書き込みしたプログラムは動作せず、書き込まれるのを待っているような感じがしますので、
動作させながらも書き込みできるけど、できたら止めておいたほうが安全かも、くらいの扱いなのかなと感じました。
まぁ全部憶測です。お役に立てずすみません。