ESP32 DevKitCを使ってみる(Mac)

年末年始の暇つぶしに、IoT界隈で人気があるらしいWiFi+BLEモジュールESP32の開発ボードで遊ぼうと思っていたのですが、なんやかんや環境設定で詰まって終わってしまいました…。
というわけで、今回はその記録です。

環境

macOS Mojave 10.14.2 on MacBook Pro 2016
ESP32 DevKitC

私は帰省先のタケイムセンで購入しました。WiFiのみのバージョン(ESP8266かな?)もあったので、取り違えに注意。

いろいろブログ記事も出てますが、ここは公式の手順に沿って進めていきます。一次資料をあたる習慣は大事。
docs.espressif.com

ToolchainとAPIを取得する

Mac用のToolchainを落としてきます。執筆時点のバージョンはここ
https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz

最新版は公式で確認しましょう。
Standard Setup of Toolchain for Mac OS — ESP-IDF Programming Guide v3.3-beta1-210-gb173cf2 documentation

落としてきたtarを~/espに展開します。~/はホームディレクトリ(/Users/あなたの名前/)です。
というか、普通に開いたらその場に展開されたので、ホームディレクトリにespディレクトリを作成してその中に移動しました。
本来、展開先はどこにしても良いと思いますが、他の場所を指定した場合は以降の~や$HOMEを変更先に適宜読み替えてください。

ターミナルを開いて、~/espに移動します。

$ cd ~/esp

この中にライブラリをgitからクローンします。

$ git clone --recursive https://github.com/espressif/esp-idf.git
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

…ん?さっそく失敗したぞ。
qiita.com

$ xcode-select --install
xcode-select: note: install requested for command line developer tools

これで通るようになりました。

$ git clone --recursive https://github.com/espressif/esp-idf.git
Cloning into 'esp-idf'...
...

パスを通す

Macのパス事情を分かってなかったので勉強。
qiita.com
.bash_profileがある場合はそちらが優先されるらしい。公式には.profileに設定しろって書いてあったので、鵜呑みにしたら反映されなくて困った。

$ ls -a .bash_profile .profile
ls: .profile: No such file or directory
.bash_profile

というわけで、.bash_profileに書き込んでいきます。次のログイン時からパスが通ります。

$ echo 'export PATH=$HOME/esp/xtensa-esp32-elf/bin:$PATH' >> ~/.bash_profile
$ echo 'export IDF_PATH=$HOME/esp/esp-idf' >> ~/.bash_profile

ここで再起動するか、以下のコマンドでパスを通して次に進みます。

$ export PATH=$HOME/esp/xtensa-esp32-elf/bin:$PATH
$ export IDF_PATH=$HOME/esp/esp-idf

ちゃんと反映されたか確認しておきます。PATHの中身は各自違うと思いますが、~/esp/xtensa-esp32-elf/binが入ってればOK。

$ printenv PATH
/Users/あなたの名前/esp/xtensa-esp32-elf/bin:/Users/あなたの名前/.rbenv/shims:/Users/あなたの名前/.rbenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

$ printenv IDF_PATH
/Users/あなたの名前/esp/esp-idf

Python環境の準備

Pythonの依存パッケージを入れていきます。

$ python -m pip install --user -r $IDF_PATH/requirements.txt
/usr/bin/python: No module named pip

$ python -V
Python 2.7.10

さっそくpipがいないって怒られました。Python 2.7系が入ってるらしい。何がしたかったんだ、過去の自分。
brewからPython 3系を入れると自動的にpipが入ってくるらしいです。何も指定しなければ最新版が入るので、

$ brew install python
==> Installing dependencies for python: gdbm, openssl, readline, sqlite and xz
...
Error: An unexpected error occurred during the `brew link` step
The formula built, but is not symlinked into /usr/local
Permission denied @ dir_s_mkdir - /usr/local/Frameworks
Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks

…なんかエラーが出てる。もう一回やってみましょう。

$ brew install python
Warning: python 3.7.2 is already installed, it's just not linked
You can use `brew link python` to link this version.

言われるがままにコマンドを打つと

$ brew link python
Linking /usr/local/Cellar/python/3.7.2... Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks

/usr/local/Frameworks に権限がないらしい。というか、そもそも存在しなかったのでディレクトリ作って権限をつけていきます。

$ ls /usr/local/Frameworks
ls: /usr/local/Frameworks: No such file or directory
$ sudo mkdir /usr/local/Frameworks
$ sudo chown $(whoami):admin /usr/local/Frameworks

$ brew link python
Linking /usr/local/Cellar/python/3.7.2... 1 symlinks created

こちらが参考になりました。
qiita.com
chownは所有権を変更するコマンド。whoami=ログイン中のユーザー、およびユーザーグループadminに指定ディレクトリの所有権を変更するという意味。

ここでPythonのバージョンを調べるとまだ2.7系になっていたので、pythonエイリアスをpython3に変更します。ここではパスと同様、ログイン時に変更されるように.bash_profileに追記していきます。

$ python -V
Python 2.7.10

$ echo 'alias python=python3' >> ~/.bash_profile

ここで再起動するか、以下のコマンドを叩いて次に進みます。

$ alias python=python3

変更できたか確認して、改めて依存パッケージをインストールします。

$ python -V
Python 3.7.2

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

ESP32を認識させる

USBドライバを入れます。
USB to UART Bridge VCP Drivers - Silicon Labs
途中、システム環境設定 > セキュリティとプライバシー > 一般 が開いて「SiLabのソフトがブロックされたよ」的なメッセージに許可ボタンを押しましょう。私は反射的にウィンドウを閉じてしまい、後でデバイスが見えなくて、なんで~?ってなりました。
taxio.hatenablog.com

ESP32 DevKitCをUSBケーブルで接続して、Macから見えるか確認します。/dev/cu.SLAB_USBtoUARTが見えればOK。

$ ls /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port	/dev/cu.SLAB_USBtoUART
/dev/cu.MALS			/dev/cu.SOC

ちなみにMacBook ProにはUSB-Cしかついてないのでハブを噛ませているのですが、2つあるUSB-Aポートのうち1つしか認識してくれません…謎。

Hello World!

ライブラリの中に入っているサンプルをコピーしてきます。

$ cp -r $IDF_PATH/examples/get-started/hello_world ~/esp
$ cd ~/esp/hello_world
$ make menuconfig
...

Serial flasher config > Default serial portと選んで「/dev/cu.SLAB_USBtoUART」を設定します。その後、Save → Exitの順に選んで設定画面を出ます。
ちなみに、ここでパスが通ってないとこうなります。パスを通すに戻って設定し直しましょう。

$ make menuconfig
make: *** No rule to make target `menuconfig'.  Stop.

次にプログラムを書き込みます。

$ make flash
...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

ちなみに、Pythonの依存パッケージが足らなかったり、Pythonのaliasが3に入ってないとこんな感じになります。Python環境の準備に戻って設定しましょう。

Traceback (most recent call last):
  File "/Users/あなたの名前/esp/esp-idf/components/esptool_py/esptool/esptool.py", line 35, in <module>
    import serial.tools.list_ports as list_ports
ImportError: No module named serial.tools.list_ports
make[1]: *** [/Users/あなたの名前/esp/hello_world/build/bootloader/bootloader.bin] Error 1
make: *** [/Users/あなたの名前/esp/hello_world/build/bootloader/bootloader.bin] Error 2

無事書き込めたら、モニターを起動させます。停止はControl+]です。

$ make monitor
Toolchain path: /Users/あなたの名前/esp/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc
Toolchain version: crosstool-ng-1.22.0-80-g6c4433a
Compiler version: 5.2.0
Python requirements from /Users/あなたの名前/esp/esp-idf/requirements.txt are satisfied.
MONITOR
--- idf_monitor on /dev/cu.SLAB_USBtoUART 115200 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
ets Jun  8 2016 00:22:57

...
Hello world!
This is ESP32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 1, 4MB external flash
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
Restarting in 3 seconds...
Restarting in 2 seconds...
Restarting in 1 seconds...
Restarting in 0 seconds...
Restarting now.
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
...

おつかれさまでした!