ESP32 で Hello world! - Ubuntu (Windows Subsystem for Linux)

# はじめに
ESP32は、BluetoothやWi-Fiを標準装備しており、様々な開発ボードや小型製品に搭載されています。ここでは、そのESP32で、[公式のプログラミングガイド Hello world!](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#step-5-start-a-project) の手順をWindows Subsystem for LinuxのUbuntuで説明しています(64bit版を使います)。

![what-you-need.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/8655a0b9-cffa-63ea-9071-74b342726fd7.png)

> 詳しくは、[Get Started - ESP Programming Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#get-started-get-esp-idf)を参照してください。

# Ubuntuのインストール
Windows10では、Windows Subsystem for Linux として、Ubuntuが用意されています。ストアからUbuntuを選択して、インストールします。インストールしたら、次のコマンドで　update します。

```bash
sudo apt-get -y update
```

# 開発環境の準備
開発環境として、次のツールを準備していきます。

* Toolchain - ESP32アプリケーションをビルドします
* ESP-IDF - ESP32ライブラリとソースコード、Toolchain連携スクリプトが含まれています。
* Python関連のパッケージ - 開発に必要なパッケージです。

## Toolchain の設定
ToolChainに必要なパッケージをインストールします。

```bash
sudo apt-get -y install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools
```

Toolchain(64bit版)をダウンロードし、展開します。

```bash
mkdir -p ~/Downloads
cd ~/Downloads
wget https://dl.espressif.com/dl/xtensa-esp32-elf-gcc8_2_0-esp32-2019r1-linux-amd64.tar.gz
mkdir -p ~/esp
cd ~/esp
tar -xzf ~/Downloads/xtensa-esp32-elf-gcc8_2_0-esp32-2019r1-linux-amd64.tar.gz
```

Toolchain が ~/esp/xtensa-esp32-elf/ ディレクトリに展開されたと思いますので、PATHとaliasの記述を ~/.profile ファイルに追加します。

```bash
export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"
alias get_esp32='export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"'
```

~/.profile ファイルを保存したら、一旦、Ubuntuを終了し(exit)、再度、起動します。
次のコマンドで、PATHが設定されていることを確認できます。

```bash
printenv PATH
```

> Toolchainの最新版は[こちら](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/linux-setup.html)を参照してください。

## ESP-IDF の取得

GitHub から 最新の ESP-IDF を取得(clone)します。

```bash
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
```

IDF_PATH の記述を ~/.profile ファイルに追加します。

```bash
export IDF_PATH=~/esp/esp-idf
```

~/.profile ファイルを保存したら、一旦、Ubuntuを終了し(exit)、再度、起動します。
次のコマンドで、IDF_PATHが設定されていることを確認できます。

```bash
printenv IDF_PATH
```

## Python関連のパッケージのインストール

Python関連のパッケージをインストールします。

```bash
python -m pip install --user -r $IDF_PATH/requirements.txt
```

# USBシリアルポートの設定
ESP32とは、USBシリアルポートで通信しますが、例えば、 /dev/ttyS1 (COM1)にアクセスしようとするとエラーが発生することがあります。
次のように、ユーザーを dialout グループに追加しておく必要があります。

```bash
sudo usermod -a -G dialout $USER
```
# Hello world! プロジェクト

## プロジェクトのコピー
get-started/hello_world プロジェクトを ~/esp ディレクトリーにコピーします。

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

## ESP32の接続
ESP32 をUSBケーブルでパソコンに接続し、デバイスマネージャで、ポートを確認します。
例えば、Windows10で、COM14 として認識されている場合、Ubuntuでは、/dev/ttyS14 として認識されます。

![project-configuration1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/c8e2e5d6-e267-fb74-98d1-c56fe3283a40.png)

```bash
ls /dev/tty*
```

## プロジェクトの設定
menuconfig というプロジェクト設定ツールを起動し、シリアルポートの設定を行います。

```bash
cd ~/esp/hello_world
make menuconfig
```

![project-configuration1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/eeabc358-5e8c-f0fb-ffe8-6e7af9fe9805.png)

[Serial flasher config] → [Default serial port] で、先ほど確認したシリアルポートを設定します（例えば、/dev/ttyS14）。
設定後、< Save >で保存し、< Exit >で終了します。

## ビルドと書き込み

次のコマンドを実行することにより、ビルドと書き込みが行われます。

```bash
make flash
```

## モニター

次のコマンドで、hello_world が実行されている様子を確認できます。monitor を中断するには、 Ctrl+] キーを押下します。

```bash
make monitor
```

# おわりに

ESP32は、様々な開発ボードや小型製品に搭載されていますので、ここで紹介した開発環境で、より一層、その性能を活用していただけると思います。