理系的な戯れ

理工学系とくにロボットやドローンに関する計算・プログラミング等の話題を扱って、そのようなことに興味がある人たちのお役に立てればと思っております。

ESP-IDF入門 StampFlyでLチカ

1. はじめに

IoT や組み込み機器のプロトタイピングでは、「いかに早く手を動かして成果を得られるか」が開発の鍵を握ります。本記事では、M5StampS3 をコアとしたプログラマブルドローン「StampFly」を例に、Espressif 社公式 SDK「ESP-IDF」の導入から基本的な使い方までをハンズオン形式で解説します。

StampFly の仕様

  • 製品名: M5Stamp Fly
  • プログラマブルドローン構成: M5StampS3 モジュール搭載のオープンソースクワッドコプターキット
  • メインコントローラ: M5StampS3(ESP32-S3FN8 デュアルコア Xtensa® LX7 @240 MHz、8 MB Flash、2 MB PSRAM)
  • 搭載モータ: 高速コアレスモータ × 4
  • バッテリ: 300 mAh 1S 高電圧リチウムバッテリ
  • オンボードセンサ:
    • BMI270 6軸 IMU(加速度+ジャイロ)
    • BMM150 3軸磁気センサ
    • BMP280 気圧センサ
    • VL53L3CXV0DH ToF 距離センサ × 2
    • PMW3901MB-TXQT オプティカルフローセンサ
  • 拡張インターフェース:
    • Grove I2C+UART × 2
    • WS2812 RGB LED × 2
    • ブザー、ボタン
  • 電流・電圧検出: INA3221AIRGVR
  • 通信プロトコル: ESP-NOW(Atom Joystick 操作対応)(通信プロトコルは工場出荷状態で変更可能)
  • サイズ/重量: 81.5 × 81.5 × 31 mm、36.8 g

StampS3 モジュールの仕様

  • SoC: Espressif ESP32-S3FN8(デュアルコア Xtensa® 32-bit LX7 @240 MHz)
  • フラッシュメモリ: 8 MB SPI Flash
  • 入力電圧: 5 V(内蔵DC-DCコンバータで 3.3 V に変換)
  • インターフェース: SPI, I2C, UART, I2S, SD/SDIO/MMC, EMAC, モータPWM, LED PWM, タッチセンサ, パルスカウンタ など
  • GPIO: 23 ピン(G0–G15, G39–G46)
  • HMI: プログラム可能ボタン ×1、プログラム可能 RGB LED (WS2812B-2020) ×1
  • アンテナ: 2.4 GHz 3D アンテナ
  • ピンヘッダピッチ: 2.54 mm(LCDインターフェース時は 0.5 mm @12 ピンまたは 8 ピン)
  • 動作温度: 0 ℃~40 ℃
  • 製品寸法/重量: 26 × 18 × 4.6 mm / 約 3.5 g
  • ワイヤレス: 2.4 GHz Wi-Fi (IEEE 802.11 b/g/n)

2. 開発環境のインストール

ESP-IDF を使った開発を始めるには、クロスコンパイラやビルドツール、ドライバなど必要なツールをあらかじめインストールし、環境変数を設定しておく必要があります。私の環境はMacなので、まず macOS 環境での手順を示し、Linux、WIndowsとつづけます。LinuxとWindowsについては実際にはまだ試せていないので、参考程度にしてください。

2.1 macOS

1. 必要ツールの確認
ターミナルで以下を実行し、バージョンが表示されるか確認します。表示されない場合は次の手順でインストールしてください。

brew --version       # Homebrew
python3 --version    # Python 3
cmake --version      # CMake
ninja --version      # Ninja
dfu-util --version   # dfu-util
git --version        # Git

2.ツールのインストール
未導入のツールがある場合はまとめてインストールします。

brew install python3 git cmake ninja dfu-util

3. ESP-IDF リポジトリの取得
作業用ディレクトリで公式リポジトリを clone し、安定版タグ(例: v5.4.1)をインストールしています。

mkdir -p ~/esp
cd ~/esp
git clone -b v5.4.1 --recursive https://github.com/espressif/esp-idf.git

4. ツールチェーンと依存パッケージのインストール
付属スクリプトを実行して必要なクロスコンパイラや Python パッケージを導入します。

cd ~/esp/esp-idf
./install.sh esp32s3

この作業は、作業中にビルド作業用のPythonの仮想環境を作ります。 したがって、Pythonの仮想環境の中で実行するとエラーになります。 仮想環境から抜けてから、実行してください。

5. 環境変数の設定
シェル設定ファイルにエクスポートスクリプトを追記し、反映します。

. $HOME/esp/esp-idf/export.sh

.sourceのことなので間違えずに入力ください

別のターミナルで作業をする際や新しく作業を始める時は、かならずこれを実行してください。

6. シリアルポートの確認
StampS3 は内蔵の USB-CDC を通じてシリアル通信を行うため、追加ドライバは不要です。ターミナルで次のコマンドを実行し、シリアルポート名(例: /dev/tty.usbmodem*)が表示されることを確認してください。

ls /dev/tty*

2.2 Linux

1. 必要ツールの確認
ターミナルで以下を実行し、バージョンが表示されるか確認します。表示されない場合はインストールしてください。

python3 --version    # Python 3
cmake --version      # CMake
ninja --version      # Ninja
dfu-util --version   # dfu-util
git --version        # Git

2. ツールのインストール
Debian/Ubuntu 系の場合:

sudo apt update
sudo apt install -y python3 python3-pip git cmake ninja-build dfu-util

CentOS/RHEL 系の場合:

sudo yum install -y python3 python3-pip git cmake ninja-build dfu-util

3. ESP-IDF リポジトリの取得
作業用ディレクトリ(例: ~/esp)で:

mkdir -p ~/esp
cd ~/esp
git clone -b v5.4.1 --recursive https://github.com/espressif/esp-idf.git

4. ツールチェーンと依存パッケージのインストール

cd ~/esp/esp-idf
./install.sh esp32s3

この作業は、作業中にビルド作業用のPythonの仮想環境を作ります。 したがって、Pythonの仮想環境の中で実行するとエラーになります。 仮想環境から抜けてから、実行してください。

5. 環境変数の設定

. $HOME/esp/esp-idf/export.sh

別のターミナルで作業をする際や新しく作業を始める時は、かならずこれを実行してください。

6. シリアルポートの確認

ls /dev/tty*

Linux 環境では、ディストリビューションやシェルによってコマンドや設定ファイル名が異なる場合があります。上記をベースに適宜読み替えてご利用ください。

2.3 Windows

1. ESP-IDF Tools Installer の実行

  • Espressif の公式サイトから「ESP-IDF Tools for Windows」をダウンロードし、インストーラーを起動
  • Python、Git、CMake、Ninja、OpenOCD、必要な依存ツールがまとめて導入されます

2. ESP-IDF コマンドプロンプトの起動

  • インストール完了後、スタートメニューから「ESP-IDF Command Prompt」を起動
  • このシェルには環境変数やパス設定が自動で行われています

3. ツールのバージョン確認 コマンドプロンプトで以下を実行し、各ツールが正しくインストールされているか確認します。

python --version    # Python
git --version       # Git
cmake --version     # CMake
inja --version      # Ninja
dfu-util --version  # dfu-util

4. ESP-IDF リポジトリの取得 作業用ディレクトリ(例: %USERPROFILE%\esp)を作成し、公式リポジトリを clone します。 安定版タグ(例: v5.4.1)を指定してください。

mkdir %USERPROFILE%\esp
cd %USERPROFILE%\esp
git clone -b v5.4.1 --recursive https://github.com/espressif/esp-idf.git

5. 環境変数の設定(手動)

通常は ESP-IDF Command Prompt で自動設定済みですが、別のターミナルで利用する場合は手動で読み込みます。

%USERPROFILE%\esp\esp-idf\export.ps1

6. idf.py の動作確認

idf.py --version

7. シリアルポートの確認 StampS3 は内蔵 USB-CDC でシリアル通信を行うため追加ドライバは不要です。

  • デバイスマネージャーの「ポート (COM & LPT)」で「USB CDC」または「COMx」が表示されていることを確認
  • CLI で確認する場合:
wmic path Win32_SerialPort get DeviceID,Caption

3. HelloWorld サンプルのビルド

ESP-IDF の基本動作を確認するため、「Hello world!」サンプルをビルド・実行します。

1. サンプルプロジェクトの配置とターゲットの指定

作業ディレクトリに hello_world サンプルをコピーします。

cd ~/esp
cp -r $IDF_PATH/examples/get-started/hello_world ./projects/

ターゲットの設定をします。

cd ~/esp/projects/hello_world
idf.py set-target esp32s3

2. ビルド前の設定確認

設定ツール(menuconfig)を起動すると、シリアルポートやログレベルなど各種オプションを設定できます。

idf.py menuconfig
  • 設定内容を確認したら、Esc キーを押して終了してください。

3. ビルド

idf.py build

4. フラッシュ(書き込み)

idf.py -p /dev/tty.usbmodem* flash

5. シリアルモニタで動作確認

idf.py -p /dev/tty.usbmodem* monitor
  • “Hello world!” が表示されれば成功です。

6. トラブルシューティング

  • ビルドエラー時は idf.py fullclean を実行してから再ビルド
  • フラッシュ失敗時はポート名やアクセス権を再確認
  • 文字化けが出る場合はログ出力のボーレート(デフォルト 115200)を確認

4. オリジナルプロジェクト作成と L チカ(WS2812 RGB LED 対応)

StampS3 のオンボード WS2812 RGB LED を点滅させるための手順です。

1. 新規プロジェクト作成

作業ディレクトリに移動し、プロジェクト雛形を生成します。

cd ~/esp/projects
idf.py create-project blink
cd blink
idf.py set-target esp32s3

2. WS2812 ドライバ依存の追加

idf.py add-dependency コマンドで espressif/led_strip コンポーネントを追加します。

idf.py add-dependency "espressif/led_strip>=3.0.0"

3. コード作成: main/blink.c

以下のコードを main/blink.c に記述します。

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "led_strip.h"

#define WS_PIN      38          // DIN をつないだ GPIO
#define LED_NUM     1           // テストなら 1 個で OK
#define DELAY_MS    500

void app_main(void)
{
    /* 共通設定 */
    led_strip_config_t strip_config = {
        .strip_gpio_num = WS_PIN,
        .max_leds       = LED_NUM,
        .led_model      = LED_MODEL_WS2812,
        .color_component_format = LED_STRIP_COLOR_COMPONENT_FMT_GRB,
    };

    /* RMT バックエンド設定 */
    led_strip_rmt_config_t rmt_config = {
        .clk_src        = RMT_CLK_SRC_DEFAULT,
        .resolution_hz  = 10 * 1000 * 1000,   // 10 MHz
        .mem_block_symbols = 64,
        .flags = {
            .with_dma = false,                // S3 は true も選べるがトラブルが出る場合あり
        },
    };

    led_strip_handle_t strip;
    ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &strip));

    /* Lチカループ */
    while (true) {
        /* 赤点灯 */
        led_strip_clear(strip);
        led_strip_set_pixel(strip, 0, 255, 0, 0);
        led_strip_refresh(strip);
        vTaskDelay(pdMS_TO_TICKS(DELAY_MS));

        /* 消灯 */
        led_strip_clear(strip);
        led_strip_refresh(strip);
        vTaskDelay(pdMS_TO_TICKS(DELAY_MS));
    }
}

4. ビルド

idf.py build

5. フラッシュ

idf.py -p /dev/tty.usbmodem* flash

6. 動作確認

idf.py -p /dev/tty.usbmodem* monitor
  • WS2812 LED が赤色で 500 ms 間隔で点滅すれば成功です。


www.youtube.com

5. おわりに

本記事では、M5StampS3(StampFly)の WS2812 RGB LED を対象に、ESP-IDF の導入から最初の L チカまでをハンズオン形式で解説しました。特に、以下のポイントを押さえました。

  • 開発環境構築: macOS/Linux/Windows 各環境でのクロスコンパイラやビルドツールのインストール、esp-idf リポジトリの取得と環境変数設定
  • Hello world! サンプル: メニュー設定によるオプション確認からビルド・フラッシュ・シリアルモニタでの動作確認
  • オリジナルプロジェクト:

    • idf.py add-dependency による公式コンポーネント(led_strip)の追加方法
    • GitHub からのコンポーネント直接取得手順
    • main/blink.c による WS2812 制御コードの実装
    • ビルド・フラッシュ・動作確認の一連フロー

今後は、本記事で習得した環境を土台に、以下のような発展的トピックに挑戦してみてください。

  1. 複数 LED のシーケンス点滅やグラデーション表示
  2. ボタンやセンサを組み合わせたインタラクティブ制御
  3. Wi‑Fi や BLE を活用した LED 制御のリモート化
  4. FreeRTOS タスク分割による並列処理での制御
  5. Arduino から ESP-IDF への移行詳細解説(別記事で公開予定)
  6. GitHub 等からドライバを取得し、自分のプロジェクトに取り込む方法の詳細解説(別記事で公開予定)

これらのステップを通じて、ESP‑IDF の深い理解と StampFly の応用力を高めていきましょう!