ESP32にZephyr OSを入れて動かしてみる

# はじめに

これまで、公式SDKのESP-IDF（OSはFreeRTOS）を使ってESP32を触っていましたが、他のOSも試してみようと思い、ドキュメントが充実していそうな[Zephyr](https://zephyrproject.org/)を試してみました。

結果から言うと、Hello WorldとLチカまではできたものの、ESP32のWifiが使えずネットワーク通信できないことが後で分かったので、そこで止めてしまいました。ESP32でWifi接続する仕組みは以下で議論されていますが、まだ整備中のようです。
[WiFi support for ESP32](https://github.com/zephyrproject-rtos/zephyr/issues/3723)

というわけで、まさに「動かしてみた」だけになってしまいましたが、記録として残しておきます。

【今回の環境】

- ボード：ESP32-DevKitC-32D
- 開発環境：Windows 10 + ESP-IDF v4.0.1 + Zephyr v2.4.0 rc2

# Zephyrビルド環境の準備

以下にガイドに沿って進めます。
[Getting Started Guide](https://docs.zephyrproject.org/latest/getting_started/)

また、ESP32での利用については以下にガイドがあります。
[Supported Boards » XTENSA Boards » ESP32](https://docs.zephyrproject.org/latest/boards/xtensa/esp32/doc/)

ESP32で使う際は、ESP-IDFに含まれるSDKとToolchainの双方が必要になるので、既に設定済のESP-IDF環境の上にZephyr環境を作りました。フォルダ構成は以下の通り。

```
C:\IoT\ESP-IDF
 ├ ESP-IDF-v4.0.1  ... SDK
 ├ Tools           ... Toolchain
 └ zephyrproject   ... この後に入れるZephyr Project
```

## 1. Select and Update OS

Windows Updateせよとあります。実施済なのでスキップ。

## 2. Install dependencies

まず、Windows用パッケージ管理ツールChocolateyをインストールします。インストール方法はこちら。
[Installing Chocolatey](https://chocolatey.org/install)

上記に従って、管理者モードでPowerShellを起動して以下を実行すると、Chocolateyがインストールされます。

```
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

次に、管理者モードでコマンドプロンプトを開いて以下を実行とありますが、

```
choco feature enable -n allowGlobalConfirmation
choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'
choco install ninja gperf python git
```

gperf以外はESP-IDFを入れたときに既に入っているので、以下を実行しました。

```
choco feature enable -n allowGlobalConfirmation
choco install gperf
```

## 3. Get Zephyr and install Python dependencies

まず、Zephyrの管理ツールwestをインストールします。

```
pip3 install west
```

続いて、このwestを使ってzephyrprojectを所定の場所に用意します。

```
cd \IoT\ESP-IDF
west init zephyrproject
cd zephyrproject
west update
```

続いて、ZephyrアプリをビルドするためのCMake環境を準備。

```
west zephyr-export
```

続いて、追加で必要なツールをインストール。

```
pip3 install -r zephyr\scripts\requirements.txt
```

## 4. Install a Toolchain

Toolchainを入れた上で必要な環境変数を設定せよとあります。
Toolchainは既に入っているので、以下ESP32用ガイドを参考に環境変数を設定します。
[Supported Boards » XTENSA Boards » ESP32](https://docs.zephyrproject.org/latest/boards/xtensa/esp32/doc/)

ESP32用ガイドには、Linux向けの設定例しか記載がありませんが、以下のように設定せよとあります。

```
export ZEPHYR_TOOLCHAIN_VARIANT="espressif"
export ESPRESSIF_TOOLCHAIN_PATH="/path/to/xtensa-esp32-elf/"
```

実際にやってみると、上記に加えて`ESP_IDF_PATH`という環境変数の設定も必要になります。
最終的には以下のように設定することで、後述のビルドが通るようになりました。

```
set ZEPHYR_TOOLCHAIN_VARIANT=espressif
set ESPRESSIF_TOOLCHAIN_PATH=%IDF_TOOLS_PATH%/tools/xtensa-esp32-elf/esp-2019r2-8.2.0/xtensa-esp32-elf
set ESP_IDF_PATH=%IDF_PATH%
```

# サンプルのビルド＆実行

Getting Started Guideには、Blinky Sample（いわゆるLチカ）を動かしてみよ、とありますが、ESP32の場合そのままでは動きません。
ということで、まずHello Worldを動かしてみます。

## Hello World

ESP-IDFのコンソールを開き、上記の環境変数を設定。
続いてサンプルコードをコピーして、そのままビルド。

```
cd \IoT\ESP-IDF\zephyrproject
mkdir projects\hello_world
xcopy /E zephyr\samples\hello_world projects\hello_world
cd projects\hello_world
west build -p always -b esp32
```

無事にビルドできたらフラッシュします。

```
west flash --esp-device COM3
```

シリアル接続して出力を見ると、無事に`Hello World!`が出力されてます。

```
*** Booting Zephyr OS build v2.4.0-rc2-53-g61d42cf42b30  ***
Hello World! esp32
```

## Blinky

次にLチカです。まずはサンプルコードをコピー。

```
cd \IoT\ESP-IDF\zephyrproject
mkdir projects\blinky
xcopy /E zephyr\samples\basic\blinky projects\blinky
cd projects\blinky
```

しかし、ESP32についてはLEDの定義が無いので、そのままビルドすると以下のように怒られます。

```
 #error "Unsupported board: led0 devicetree alias is not defined"
```

自分の環境ではIO19にLEDを接続してあったので、ソースコードの24～26行付近を以下のように修正。

```
//#error "Unsupported board: led0 devicetree alias is not defined"
//#define LED0	""
#define LED0	"GPIO_0"
//#define PIN	0
#define PIN	19
```

これでビルドして書き込みます。

```
west build -p always -b esp32
west flash --esp-device COM3
```

![IMG_20200928_185914_R.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679422/a1746fde-6125-13d0-d201-cefdd6ea5fbf.jpeg)

無事にLチカできました。

今回はここで終わりですが、ESP32でWifiが使えるようになったら、また色々試してみようと思います。