2章
開発環境
受講者側の環境と、教材作成側の環境。
推奨環境
| 用途 | ツール |
|---|---|
| エディタ | Visual Studio Code |
| ビルド | C++コンパイラ |
| バージョン管理 | Git |
| 共有 | GitHub |
| マイコン | ESP32-C5-DevKitC-1-N8R8 |
| マイコン開発環境 | PlatformIO(pioarduino版のプラットフォーム) |
ボードの設定
使うボードはESP32-C5-DevKitC-1-N8R8(ESP32-C5、フラッシュ8MB、PSRAM 8MB)。ESP32-C5はRISC-Vコアの新しいチップで、PlatformIO公式のplatform-espressif32ではまだ対応していない。そのため、コミュニティが保守しているpioarduino版を指定する。code/以下の各プロジェクトのplatformio.iniはこの形になっている。
[env:esp32-c5-devkitc-1]
platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip
board = esp32-c5-devkitc1-n8r4
framework = arduino
monitor_speed = 115200
build_flags = -Wall2つのUSB-Cポート
このボードにはUSB-Cが2つある。授業では「UART」と書かれている側を使う。
| ポート | 何が繋がっているか | 授業で使うか |
|---|---|---|
| UART | USB-UART変換チップ。Serialがそのまま使える(GPIO11=TX / GPIO12=RX) | こちらを使う |
| USB | ESP32-C5のUSBに直結(GPIO13=D- / GPIO14=D+) | 使わない |
内蔵LEDはRGB LEDである
このボードの内蔵LEDは普通のLEDではなく、アドレサブルRGB LED(WS2812系)が1個、GPIO27に繋がっている。点けると白く光る。
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH); // 白く点く
digitalWrite(LED_BUILTIN, LOW); // 消える見た目は普通のLEDと同じように書けるが、裏ではdigitalWriteがRGB LEDへの書き込みに振り替えられている。LED_BUILTINはピン番号ではなく「内蔵LEDを指す名前」なので、27と数値で書き換えても同じようには光らない。色を変えたいときは別の関数を使う。
rgbLedWrite(LED_BUILTIN, 0, 64, 0); // 緑に点けるサンプルの動かし方
各回の講義ページには「動かして確かめる」という節がある。そこで紹介しているサンプルはcode/examples/以下にあり、それぞれが独立したPlatformIOプロジェクトになっている。演習に入る前に、まずこれを動かして結果を見るのが本講座の進め方である。
cd code/examples/00-blink
pio run # ビルドだけする
pio run -t upload # ボードに書き込む
pio device monitor # シリアルモニタを開く(115200 bps)VS CodeでそのフォルダをそのままPlatformIOのプロジェクトとして開けば、下のツールバーのボタンからも同じことができる。
| 困ったこと | 見るところ |
|---|---|
| 書き込みに失敗する | USBケーブルとポート。pio device listで見えるか確認する |
| モニタが文字化けする | 速度。platformio.iniのmonitor_speedとSerial.begin()を合わせる |
| 最初の数行が出てこない | 書き込み直後はモニタの接続が間に合わない。各サンプルのsetup()にdelay(1000)を入れてある |
| シリアルに何も出ない | チップ直結のUSBポートに挿していないか。「UART」と書かれた側に挿す |
| 内蔵LEDが光らない | 挿したUSBポートを確認する。LED_BUILTINを27のような数値に書き換えていると、RGB LEDは光らない |
Unknown board IDと出る | platformio.iniのplatformがpioarduino版になっているか。公式版にはC5のボード定義がない |
実物をつなぐ場合
サンプルを動かすだけなら、追加の部品は要らない。光るのはボードに載っている内蔵のRGB LEDで、LED_BUILTINがそれを指している。モータや距離センサを使うサンプルも、値はプログラムの中で作ってシリアルに表示しているだけで、実物はつないでいない。
そのうえで、外付けのLEDをつなぐと分かりやすくなる回がある。第6回は「同じクラスから2つのオブジェクトを作る」のが主題で、led2はGPIO23に割り当ててあるが、内蔵LEDは1つしかないので2つ目の点滅はボード単体では見えない。ここだけは実物をつなぐ価値がある。
必要なもの
| 部品 | 数 | 用途 |
|---|---|---|
| ブレッドボード | 1 | はんだ付けなしで配線を組む |
| LED | 2〜3 | 第6回で2個あると「同じクラスから2つ」が見える |
| 抵抗 220Ω〜330Ω | LEDと同数 | LEDに直列に入れる。省略するとLEDとGPIOを壊す |
| ジャンパ線(オス-オス) | 10本程度 | |
| タクトスイッチ | 1 | 第2回の「ボタンが押されている間だけ点灯」を実機で試す場合 |
配線
ESP32-C5-DevKitC-1 ブレッドボード
────────────────── ─────────────────────────────
GPIO23 ──────────────── 抵抗 220Ω ──── LED アノード(足が長い側)
LED カソード(足が短い側・
外形が平らになっている側)
GND ─────────────────────────────────┘2つ目のLEDを足すときはGPIO24から同じ形でもう1組つなぐ。GNDは共通でよい。
ピンの選び方
ESP32-C5のGPIOはGPIO0〜28。古いESP32にあった「入力専用ピン」はなく、0〜28のすべてが出力に使える。ただしDevKitC-1のヘッダに出ているのは一部で、他の機能が割り当たっているものもある。
| ピン | なぜ避けるか |
|---|---|
| GPIO2 / 3 / 4 / 5 / 7 / 25 / 26 / 27 / 28 | 起動時の状態を見ているピン(ストラッピング)とJTAG。外付けを繋ぐと書き込みや起動に失敗することがある |
| GPIO27 | 上記に加えて内蔵RGB LEDが繋がっている |
| GPIO11 / 12 | UART0(Serial)。塞ぐとシリアルモニタが使えなくなる |
| GPIO13 / 14 | チップ直結USBのD- / D+ |
| GPIO15 | N8R8ではPSRAMのSPICS1に使われている(PSRAMなしのモジュールなら空いている) |
| GPIO16〜22 | ヘッダに出ていない |
| GPIO0 / 1 | 32.768kHzの水晶用。使わないなら空いているが、I2Cの既定でもある |
教材で使うピン
本文・解答例・code/のすべてで、用途ごとに次のピンを使っている。コード例に出てくる数字はこの表のどれかである。
| 用途 | ピン | 備考 |
|---|---|---|
| 内蔵LED | LED_BUILTIN | GPIO27のRGB LED。配線なしで光る |
| 外付けLED | GPIO23 | 第6回の2個目のLED |
| ボタン | GPIO9 | INPUT_PULLUPで使う |
| モータ | GPIO24 | サンプルではつながない。出力はシリアル表示 |
| モータ(2本目) | GPIO10 | 第14回 |
| アナログ入力(距離センサなど) | GPIO6 | ADC1_CH5 |
サンプルを外付けLEDで動かす
| 回 | 書き換えるところ |
|---|---|
| 第3回 / 第9回 | const int LED_PIN = LED_BUILTIN;を= 23;にする |
| 第6回 | そのままでよい。GPIO23に2つ目のLEDを挿せばled2が光る |
| 第7回 | LED led(LED_BUILTIN);をLED led(23);にする |
| モータを使う回 (第8回・第10回・第14回・第18回) | 実物のモータはESP32-C5のピンから直接は回せない。モータドライバと別電源が要る。本講座のサンプルはシリアル表示までにしてあり、ピン番号は仮に置いてあるだけ(GPIO24など) |
講師向け
教材作成
スライド
- Marp
- Markdown
- Visual Studio Code
図
- draw.io
配布資料
- Markdown
コード
- Git / GitHub
教材のリポジトリ例
cpp-microcontroller-course/ │ ├── README.md │ ├── slides/ │ ├── 01_intro.md │ ├── 02_basic.md │ ├── 03_function.md │ ├── 04_array_pointer.md │ ├── 05_cpp_basic.md │ ├── 06_class.md │ ├── 07_header.md │ ├── 08_encapsulation.md │ ├── 09_enum.md │ ├── 10_inheritance.md │ ├── 11_virtual.md │ └── 12_design.md │ ├── examples/ │ ├── 01_basic/ │ ├── 02_function/ │ ├── 03_pointer/ │ ├── 04_class/ │ ├── 05_header/ │ ├── 06_encapsulation/ │ ├── 07_enum/ │ ├── 08_inheritance/ │ └── 09_virtual/ │ ├── exercises/ │ ├── 01_basic/ │ ├── 02_function/ │ ├── 03_class/ │ ├── 04_header/ │ ├── 05_encapsulation/ │ ├── 06_enum/ │ ├── 07_inheritance/ │ └── 08_virtual/ │ └── final_project/
このサイトのリポジトリ構成
本サイトは上記の教材リポジトリを実際のファイル構成に落としたものである。
. ├── .github/workflows/deploy.yml # push → build → GitHub Pages ├── site/ # Viteのroot(公開されるサイト) │ ├── index.html │ ├── guide/ lessons/ exercises/ final-project/ │ ├── styles/ scripts/ public/ │ ├── checklist.html │ └── advanced.html ├── diagrams/ # draw.io の元ファイル ├── code/ # 受講者向けC++コード │ ├── examples/ exercises/ solutions/ final-project/ ├── package.json ├── tsconfig.json └── vite.config.ts
| ディレクトリ | 内容 |
|---|---|
site/ | Webサイト本体。Viteのroot。 |
code/examples/ | 各回のサンプル(PlatformIOプロジェクト) |
code/exercises/ | 演習の雛形(穴あき) |
code/solutions/ | 解答例のPlatformIOプロジェクト(サイト側は段階公開) |
code/final-project/ | 最終課題の雛形(src/ include/ 構成) |
diagrams/ | draw.ioの.drawioファイル |
ローカルでの動かし方
npm ci
npm run dev # 開発サーバ
npm run build # dist/ に出力
npm run preview # ビルド結果の確認