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はこの形になっている。

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 = -Wall

2つのUSB-Cポート

このボードにはUSB-Cが2つある。授業では「UART」と書かれている側を使う。

ポート何が繋がっているか授業で使うか
UARTUSB-UART変換チップ。Serialがそのまま使える(GPIO11=TX / GPIO12=RX)こちらを使う
USBESP32-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はんだ付けなしで配線を組む
LED2〜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 / 12UART0(Serial)。塞ぐとシリアルモニタが使えなくなる
GPIO13 / 14チップ直結USBのD- / D+
GPIO15N8R8ではPSRAMのSPICS1に使われている(PSRAMなしのモジュールなら空いている)
GPIO16〜22ヘッダに出ていない
GPIO0 / 132.768kHzの水晶用。使わないなら空いているが、I2Cの既定でもある

教材で使うピン

本文・解答例・code/のすべてで、用途ごとに次のピンを使っている。コード例に出てくる数字はこの表のどれかである。

用途ピン備考
内蔵LEDLED_BUILTINGPIO27のRGB LED。配線なしで光る
外付けLEDGPIO23第6回の2個目のLED
ボタンGPIO9INPUT_PULLUPで使う
モータGPIO24サンプルではつながない。出力はシリアル表示
モータ(2本目)GPIO10第14回
アナログ入力(距離センサなど)GPIO6ADC1_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
  • PDF

コード

  • 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 # ビルド結果の確認