勉強しないとな~blog

ちゃんと勉強せねば…な電気設計エンジニアです。

M5Stampやってみる

スイッチサイエンスでOAK-D S2を買ったのと同時にM5Stampを買っていたので、これに手を付けてみる。

買ったもの

買ったのは、M5Stamp C3 (5個入り)。

M5Stamp C3 (5pcs)www.switch-science.com

写真。
M5Stampが5個と、シールが入っている。
1個取り出し済み。

M5Stamp本体にクローズアップ。
裏面にUSB Type Cコネクタと、アンテナらしき金属が見える。

こちらが公式ドキュメント。

m5-docs

M5Stampにも、いくつかシリーズがあるよう。

M5Stampとは?

スイッチサイエンスの紹介文によると、

Wi-FiおよびBluetooth 5(LE)の機能が利用可能な、IoTエッジデバイス向けのEspressif ESP32-C3 RISC-V MCUを搭載した切手サイズのモジュールです。

とのこと。

切手サイズでWi-Fiも使えるとのことで、子供のおもちゃに組み込んでみたいと思い、今回購入した。

ちなみに、切手のサイズは、2.6cm x 2.2cmが標準とのことで、M5Stamp C3では、長手方向に少し大きめ。
USBシリアル変換ICも載せているためと思われる。

M5Stamp S3、PICOでは、切手サイズに収まる。

動かす手順

公式ドキュメントからやってみる。

Get Started - ESP32 - — ESP-IDF Programming Guide v5.1.1 documentation

PCに環境構築

以下の3種類のソフトウェアをインストールしろと書いている。

  • Toolchain
    ESP32用のコンパイラ
  • Build tools
    ESP32のアプリケーションをビルド
  • ESP-IDF
    ESP32用のライブラリと、Toolchainを操作する用のスクリプト

ESP-IDFは、Espressif IoT Development Frameworkの略らしく、IDEとは別物だよと言いたいのか?

いくつかインストールのしかたが書かれている。

好みのIDEからのインストールが推奨されている。
今回は、VSCode拡張機能を使うやり方でやってみる。

だいたいこの手順通り。

github.com

VSCodeから環境構築

拡張機能インストール

VSCode拡張機能を検索すると、出てきて、これをインストールした。

2023/10/30時点で、467Kダウンロード、ただし、星3つ。

手順では、インストール後に"Install ESP-IDF Prerequisites"と書かれているが、リンク先を見てみると、

For Windows the C++ Build Tools might be required.

と書かれてた。
前のGPU使用環境構築時に、Visual StudioからC++ビルド環境を入れたので、不要かもしれない。
とりあえず何もせずに進める。

セットアップ実施

VSCodeで、コマンドパレットを開いて、"ESP-IDF: Configure ESP-IDF extension"を実行。

セットアップ画面が現れる。こんな形の拡張機能は初めてかもしれない。

セットアップのモードを選択するが、そんなに細かい設定をしたいわけではないので、"Express"にしておく。

"Express"をクリックすると、設定項目がいくつか出てくる。

  • download server : ドキュメントに特に何も書かれていなかった、"GitHub"か"Espressif"の2つの選択肢があったが、デフォルトの"GitHub"にしておく。
    ツールのダウンロード元を選択するだけと思うので、どこからダウンロードしても同じでは。
  • ダウンロードするESP-IDFのバージョン選択。
    以下の選択肢が出てくる。

    今回は最新のリリース版(v5.1.1)にする。
  • "ESP-IDF container directory"と"ESP-IDF Tools directory(IDF_TOOLS_PATH)"は、適当に新規作成しておいた。

これで、"Install"を実行。

Python環境を新しく構築したりしているらしく、結構重たいダウンロードが走っていたりする。

ダウンロード経過は色々出ていたが、完了すると、全部消えてしまった。

続きは、以下のチュートリアルページを参照する。

github.com

Example Projectやってみる

ESP-IDF拡張機能のほうで、Example Projectを持っているということなので、見てみる。

"Show Example Projects"を選択すると、使うフレームワークの選択がまず出てきた。

選択すると、VSCodeにタブが現れて、色々なExample Projectが出てきた。

blink(Lチカ)プロジェクトもあり、上記チュートリアルではこれを使っているが、今回のM5Stamp C3のボード情報を確認すると、単純なLEDは付いていなかったので、これは使えない。

その次にわかりやすそうなhello_worldプロジェクトをやってみる。

プロジェクト作成

"Create project using example hello_world"をクリック。
プロジェクト作成先フォルダを指定する。

こんな感じで、指定したフォルダ内に"hello_world"ができた。

VSCode上では、プロジェクトのフォルダをワークスペースとして開いた状態になる。

プロジェクト設定: ターゲットデバイス設定

まずはターゲットデバイス設定。

コマンドパレットから、"ESP-IDF: Set Espressif device target"を選択。

対象プロジェクトのワークスペースフォルダを指定。
今回は、さっき作ったhello_worldプロジェクトしか出てこない、これを指定。

少し時間がかかって、候補のリストが出てくる。

今回のM5Stamp C3では、ESP32-C3が使用されているので、"esp32c3"を指定。

m5-docs

もう少し設定があるよう。
"OpenOCD Configuration File Paths list"と書かれていて、おそらく書き込み、デバッグのインターフェースを指定するものと思われる。

M5Stamp C3では、上の2つ(ESP-PROGボード、builtin USB-JTAG)には該当せず、ESP32の外にUSBシリアル変換ICが載っているので、3つ目の設定を選べばいいかと思われる。

しばらくすると、ワークスペースにファイルが増えていて(sdkconfig、sdkconfig.old)、その中にさっき設定したものが入っているよう。

プロジェクト設定: SDK設定

"ESP-IDF: SDK Configuration editor"コマンドを実行。

少し時間がかかって、設定UIが出てきた。
結構設定項目は多い。スクロールバーの縦幅を見るとわかるか。

HTTPSサーバーやWi-Fi設定があるので、IoTやるときはこのあたりをいじるのか。

必要な設定があるのかよく分からないが、とりあえずこのままにして進める。
一応"Save"ボタンを押しておいて、"SDK Configuration editor"ウィンドウを閉じる。

C/C++ Configuration

を設定しろと書かれているが、リンクを見ると、

Why configure this file?
To enable Code Navigation, auto-complete and other language support features on ESP-IDF source files on Visual Studio Code.

https://github.com/espressif/vscode-esp-idf-extension/blob/master/docs/C_CPP_CONFIGURATION.md#why-configure-this-file

と書かれているので、特に設定しないでもビルドには影響しないか。

ということで、この手順は飛ばす。

ビルド実施

コマンドパレットで、"ESP-IDF: Build your project"を実行。

そうすると、ビルドが実行され、ターミナルに色々表示が出てくる。

最終的にできたっぽい表示になる。ターミナルは2つ出ている。

下のバーに、×2と書かれているが、シンタックスチェックのツールから defineマクロの定義箇所が見つからない、ということと思われる。

どちらもコード上から定義箇所にジャンプすることはできたので、おそらく問題はない。

バイナリサイズ確認

オプションの手順になるが、"ESP-IDF: Size analysis of the binaries"で、サイズ確認できる。
ビルドがきちんとできたかどうかの確認にもなるか。

49KB使っているよう。

シリアルポート設定

プログラミング前に指定が必要。

その前に、PCにドライバインストールしておく。

m5-docs

インストール済みだった?
実は先にPCにM5Stampを接続してしまっていたから?

とりあえず、M5StampをPCに接続。
接続してみると、LEDが水色に光った。

VSCodeで、使うポートの選択。

ポートが自動で出てきた。これで動かしてみる。

設定すると、やっぱりワークスペース選択になった。
これを設定したら準備完了。

書き込み実行

これはコマンド実行するだけか。
"ESP-IDF: Flash your project"をやる。

と思ったら、色々選択肢があった。接続方式など。

"ESP-IDF: Flash (UART) your project"を選択したら、すぐに下のコンソールに表示が現れて、書き込み完了したよう。

プログラム動作

"ESP-IDF: Monitor your device"コマンドを実行。
今更だけど、コマンド候補の上のほうに全コマンドまとめて実行のコマンドがある。。。

新しいターミナルが現れて、色々と表示が出てくる。
一部はブートローダーのログ、一部はアプリケーションが出している"Hello World!"の表示。
このHello Worldプロジェクトは、自分で再起動を繰り返している。 ブートローダーのログのところを見ると、どんな設定になっているのか分かったりする。

クリックで全出力を開く

ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x3 (RTC_SW_SYS_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
Saved PC:0x40048b82
0x40048b82: ets_secure_boot_verify_bootloader_with_keys in ROM

SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd5820,len:0x1704
load:0x403cc710,len:0x968
load:0x403ce710,len:0x2f68
entry 0x403cc710
I (35) boot: ESP-IDF v5.1.1 2nd stage bootloader
I (35) boot: compile time Oct 31 2023 02:06:15
I (35) boot: chip revision: v0.3
I (38) boot.esp32c3: SPI Speed      : 80MHz
I (43) boot.esp32c3: SPI Mode       : DIO
I (48) boot.esp32c3: SPI Flash Size : 2MB
I (52) boot: Enabling RNG early entropy source...
I (58) boot: Partition Table:
I (61) boot: ## Label            Usage          Type ST Offset   Length
I (69) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (76) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (83) boot:  2 factory          factory app      00 00 00010000 00100000
I (91) boot: End of partition table
I (95) esp_image: segment 0: paddr=00010020 vaddr=3c020020 size=08650h ( 34384) map
I (109) esp_image: segment 1: paddr=00018678 vaddr=3fc8a600 size=01120h (  4384) load
I (113) esp_image: segment 2: paddr=000197a0 vaddr=40380000 size=06878h ( 26744) load
I (126) esp_image: segment 3: paddr=00020020 vaddr=42000020 size=15690h ( 87696) map
I (143) esp_image: segment 4: paddr=000356b8 vaddr=40386878 size=03d30h ( 15664) load
I (149) boot: Loaded app from partition at offset 0x10000
I (149) boot: Disabling RNG early entropy source...
I (163) cpu_start: Unicore app
I (163) cpu_start: Pro cpu up.
I (172) cpu_start: Pro cpu start user code
I (172) cpu_start: cpu freq: 160000000 Hz
I (172) cpu_start: Application information:
I (175) cpu_start: Project name:     hello_world
I (180) cpu_start: App version:      1
I (184) cpu_start: Compile time:     Oct 31 2023 02:05:44
I (191) cpu_start: ELF file SHA256:  9e26fa748febbdc2...
I (197) cpu_start: ESP-IDF:          v5.1.1
I (201) cpu_start: Min chip rev:     v0.3
I (206) cpu_start: Max chip rev:     v0.99 
I (211) cpu_start: Chip rev:         v0.3
I (216) heap_init: Initializing. RAM available for dynamic allocation:
I (223) heap_init: At 3FC8C560 len 000501B0 (320 KiB): DRAM
I (229) heap_init: At 3FCDC710 len 00002950 (10 KiB): STACK/DRAM
I (236) heap_init: At 50000010 len 00001FD8 (7 KiB): RTCRAM
I (243) spi_flash: detected chip: generic
I (247) spi_flash: flash io: dio
W (251) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (264) sleep: Configure to isolate all GPIO pins in sleep state
I (271) sleep: Enable automatic switching of GPIO sleep configuration
I (278) app_start: Starting scheduler on CPU0
I (283) main_task: Started on CPU0
I (283) main_task: Calling app_main()
Hello world!
This is esp32c3 chip with 1 CPU core(s), WiFi/BLE, silicon revision v0.3, 2MB external flash
Minimum free heap size: 331264 bytes
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
Restarting in 3 seconds...
Restarting in 2 seconds...
Restarting in 1 seconds...
Restarting in 0 seconds...
Restarting now.
ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x3 (RTC_SW_SYS_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
Saved PC:0x40048b82
0x40048b82: ets_secure_boot_verify_bootloader_with_keys in ROM

SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd5820,len:0x1704
load:0x403cc710,len:0x968
load:0x403ce710,len:0x2f68
entry 0x403cc710
I (35) boot: ESP-IDF v5.1.1 2nd stage bootloader
I (35) boot: compile time Oct 31 2023 02:06:15
I (35) boot: chip revision: v0.3
I (38) boot.esp32c3: SPI Speed      : 80MHz
I (43) boot.esp32c3: SPI Mode       : DIO
I (48) boot.esp32c3: SPI Flash Size : 2MB
I (52) boot: Enabling RNG early entropy source...
I (58) boot: Partition Table:
I (61) boot: ## Label            Usage          Type ST Offset   Length
I (69) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (76) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (83) boot:  2 factory          factory app      00 00 00010000 00100000
I (91) boot: End of partition table
I (95) esp_image: segment 0: paddr=00010020 vaddr=3c020020 size=08650h ( 34384) map
I (109) esp_image: segment 1: paddr=00018678 vaddr=3fc8a600 size=01120h (  4384) load
I (113) esp_image: segment 2: paddr=000197a0 vaddr=40380000 size=06878h ( 26744) load
I (126) esp_image: segment 3: paddr=00020020 vaddr=42000020 size=15690h ( 87696) map
I (143) esp_image: segment 4: paddr=000356b8 vaddr=40386878 size=03d30h ( 15664) load
I (149) boot: Loaded app from partition at offset 0x10000
I (149) boot: Disabling RNG early entropy source...
I (163) cpu_start: Unicore app
I (163) cpu_start: Pro cpu up.
I (172) cpu_start: Pro cpu start user code
I (172) cpu_start: cpu freq: 160000000 Hz
I (172) cpu_start: Application information:
I (175) cpu_start: Project name:     hello_world
I (180) cpu_start: App version:      1
I (184) cpu_start: Compile time:     Oct 31 2023 02:05:44
I (191) cpu_start: ELF file SHA256:  9e26fa748febbdc2...
I (197) cpu_start: ESP-IDF:          v5.1.1
I (201) cpu_start: Min chip rev:     v0.3
I (206) cpu_start: Max chip rev:     v0.99
I (211) cpu_start: Chip rev:         v0.3
I (216) heap_init: Initializing. RAM available for dynamic allocation:
I (223) heap_init: At 3FC8C560 len 000501B0 (320 KiB): DRAM
I (229) heap_init: At 3FCDC710 len 00002950 (10 KiB): STACK/DRAM
I (236) heap_init: At 50000010 len 00001FD8 (7 KiB): RTCRAM
I (243) spi_flash: detected chip: generic
I (247) spi_flash: flash io: dio
W (251) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (264) sleep: Configure to isolate all GPIO pins in sleep state
I (271) sleep: Enable automatic switching of GPIO sleep configuration
I (278) app_start: Starting scheduler on CPU0
I (283) main_task: Started on CPU0
I (283) main_task: Calling app_main()
Hello world!
This is esp32c3 chip with 1 CPU core(s), WiFi/BLE, silicon revision v0.3, 2MB external flash
Minimum free heap size: 331264 bytes
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
Restarting in 3 seconds...
Restarting in 2 seconds...
Restarting in 1 seconds...
Restarting in 0 seconds...
Restarting now.

...

今回ここまで

今回、公式ドキュメントからのやり方でやったが、ほかにM5Stampを動かした例を見ると、だいたいArduino IDEを使ってる。
あえて茨の道を進んでしまったかもしれない。

一回Arduino IDEも使ってみるか…

M5Stamp-C3をとりあえず使ってみる | 松五郎ブログ

ESP32-C3搭載、小型の開発基板M5Stamp C3 MATE を使ってみる | たまねぎブログ

M5Stamp C3 Mateを試してみました【Arduino使用】 | あろしーど