この記事で得られること
-
RISC-Vで動くESP-IDF開発環境の最短セットアップ
-
esp32c6
向けプロジェクト雛形の作成と書き込み -
LED点滅(GPIO制御)の最小コード
-
gdbによる基本デバッグ手順
-
よくあるエラーの潰し方
前提と対象読者
-
Cの基礎とターミナル操作がわかる人
-
ホストOS:Windows 10/11、macOS、Ubuntu 22.04 いずれか
-
ボード:ESP32-C6搭載開発ボード(例:ESP32-C6-DevKitC)
*オンボードLEDが無い場合は抵抗付きLEDを任意GPIOに接続
準備物
-
USBケーブル(データ対応)
-
Python 3.8+ / Git
-
シリアルポート権限(Linuxは
dialout
等のグループにユーザーを追加)
ステップ1:ESP-IDFの導入
Windows(最短)
-
公式 ESP-IDF Tools Installer を使用
-
インストール後、ESP-IDF PowerShell を起動
-
ターゲット設定:
idf.py set-target esp32c6
macOS / Ubuntu
# 任意の作業ディレクトリで
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
# 安定版ブランチ例(必要に応じて更新)
git checkout release/v5.2
git submodule update --init --recursive
./install.sh esp32c6
# シェルに環境を反映
. ./export.sh
idf.py --version
ヒント:毎回開くシェルで
. ./export.sh
を実行するか、シェルの初期化ファイルに追記。
ステップ2:プロジェクト作成とビルド
idf.py create-project gpio_blink
cd gpio_blink
idf.py set-target esp32c6
idf.py build
成功すればbuild/
にファームウェアが生成される。
ステップ3:GPIO点滅の最小コード
main/main.c
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
static const char *TAG = "BLINK";
// 開発ボードに応じて変更。ESP32-C6 DevKitCの例: GPIO8 など
#ifndef BLINK_GPIO
#define BLINK_GPIO GPIO_NUM_8
#endif
void app_main(void) {
gpio_config_t io_conf = {
.pin_bit_mask = 1ULL << BLINK_GPIO,
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = 0,
.pull_down_en = 0,
.intr_type = GPIO_INTR_DISABLE
};
gpio_config(&io_conf);
bool level = false;
while (1) {
gpio_set_level(BLINK_GPIO, level);
ESP_LOGI(TAG, "LED: %s", level ? "ON" : "OFF");
level = !level;
vTaskDelay(pdMS_TO_TICKS(500));
}
}
main/CMakeLists.txt
idf_component_register(SRCS "main.c"
INCLUDE_DIRS ".")
オンボードLEDが無い場合は、
BLINK_GPIO
を外付けLEDの接続ピンに合わせる。
ステップ4:書き込みとシリアルモニタ
-
ボードをUSB接続
-
ポート確認
-
Windows: デバイスマネージャで
COMx
-
macOS/Linux:
ls /dev/tty.*
orls /dev/ttyACM*
- フラッシュ+モニタ
idf.py -p <PORT> flash monitor
# 例: idf.py -p COM7 flash monitor
# 例: idf.py -p /dev/ttyACM0 flash monitor
ログにLED: ON/OFF
が交互に表示され、LEDが点滅すれば成功。
モニタ終了:Ctrl+]
ステップ5:gdbでRISC-Vをステップ実行(入門)
ESP32-C6はUSB経由のSerial/JTAGに対応。追加アダプタ無しで基本デバッグが可能な構成が多い。
# ビルドにデバッグ情報を含める(デフォルトでOK)
idf.py -p <PORT> flash
# gdb起動(別ターミナル)
idf.py gdb
# 典型操作
(gdb) target remote :3333
(gdb) break app_main
(gdb) continue
(gdb) next
(gdb) print level
OpenOCDが裏で起動し、
3333
に接続。接続不可時はドライバやポートの競合を確認。
付録:省電力の最小サンプル(おまけ)
#include "esp_sleep.h"
void app_main(void) {
// 省電力が見たい場合はLED点滅の代わりにこちらを有効化
esp_sleep_enable_timer_wakeup(5 * 1000 * 1000); // 5秒
esp_deep_sleep_start();
}
実電流計測は次回記事で実施。USB測定器やDMMでの注意点も扱う。
トラブルシューティング速攻表
-
Failed to open port
:ポート名誤り。占有アプリ(ターミナル/別モニタ)を終了。Linuxはsudo usermod -aG dialout $USER
後に再ログイン。 -
Permission denied
(macOS):初回接続でアクセサリ許可ダイアログを承認。/dev/cu.usbmodem*
を使用。 -
Timed out waiting for packet header
:ブートモード移行失敗。BOOTボタン押下→ENリセットやAuto-RSTを確認。 -
LEDが点かない:GPIO番号の再確認。外付けなら抵抗向きとGND/3V3の誤配線を確認。
-
gdb接続不可:他プロセスが
3333
使用。OpenOCDログでエラーを特定。
次回予告
-
割り込みとタイマで正確な点滅周期を作る
-
FreeRTOSタスク設計と
SystemView
でのトレース -
Light/Deep-sleepの実測と削減テク