SNSへはこちら

ESP32で遊んでみる(2) - 環境構築等をしっかり解説

ラズピコで遊んでいる現状ですが、この前買ったっきりいじっていない ESP32 さんの記事です。ESP8266 をいじったのを契機に「宝の持ち腐れ状態にしたら残念だなあ」と思ったので、いじってみます。
こちらの記事でけりさんがおすすめしているアレです。以前お会いした時にこのマイコン(SoC ?)の魅力を語っていただきました。

ESP8266 でアレルギー的に嫌いだった SDK に手を出したことで、高レイヤへの気持ち悪さが緩和されたので、「じゃあいじるなら今でしょ」ということで再度入門してみたという記事です。

ハード

マイコンボードはこちらから Amazon で購入。商品名は NodeMCU-32 というらしい。ESP32 が入っているモジュールは技適の通った ESP-WROOM-32 です。
秋月で DevKit-C が売っているが、アレは通常のブレッドボードに差す場合、左右どちらかのピンにジャンパケーブルを指すことが不可能なピッチなため却下。横幅のあるブレッドボードを使えばいい話だけどね。

肝心の ESP32 モジュール自体ですが、個人的に以下がアツいです。

  • ROM 4MB 搭載
  • Wi-Fi(802.11 b/g/n) に対応
  • Bluetooth 4.2 対応

注意!:現在は素の ESP-WROOM-32 は NRND になったようです。現在はこれより新しい ESP-WROOM-32E が出ているよう。こちらのサイトによると、バグ等が取れたバージョンらしいので、購入される方はこちらが搭載されているものを買ったほうが良いと思います。

電源レギュレータ問題

物によるらしいですが、こちらのねむいさんの記事によるとボード上のレギュレータが ESP32 起動時のバカ食い突入電流に耐えきれず3.3Vを保持できない問題(本当はもっと深刻な問題が...)があるらしいです。まあぼくが買ったやつは怪しそうなので該当しそうですね。ちゃんとしたやつなら大丈夫だと思いますが(震え声)。

僕の買ったボードはパチモンですので、よわよわレギュレータでした。もともと積んであったレギュレータの型番は知らないですが...

これを解決するためにこちらの記事を参考にして、秋月の ADP3338 を実装し直します。ここらへん上級者向けなので、はんだ付けが得意じゃない方は誰かに金払って頼みましょう。それにしてもこのレギュレータすごいですね。ちょっと電流が重いアプリケーションに使用しているのですが、マジで電圧がドロップアウトしません。

環境構築

ESP2866 では NonOS SDK とか RTOS SDK とかありましたが、ESP32 では ESP-IDF という RTOS ベースの開発環境のみです(え??Arduino IDE??知らないなあ)。

ドキュメンテーション

その前に、ドキュメント等を揃えましょう。

  • Getting Started
    • Web ページ。ESP-IDF を用いた入門等が一連のページになっていて分かりやすい。
  • HW ドキュメンテーション
    • 上のページのサイドバーからもアクセス可能。取り敢えず Technical Reference Manual, Datasheet を PDF で持っておいても良いかも。API に関するリファレンスは Web ページとして存在するので、今後は要 Check。
  • NodeMCU のデータシート・回路図
    • 直リンクしか見つからなかったので、リンクを貼るのは控えます。nodemcu schematicnodemcu datasheet で検索して出てきた PDF ファイルをダウンロードすればいいです。

IDFの導入

公式の Getting Started を参考に導入。

$ mkdir esp32
$ cd esp32
$ git clone --recursive https://github.com/espressif/esp-idf.git
$ cd esp-idf

現状の最新バージョンは約 870MB あるそうです。デカすぎ〜〜

./install.sh は変なのが入るのが嫌なので無視。取り敢えず openocd を入れて(元々入ってた)、更にこちらからダウンロードした ESP32 用の ビルド済み xtensa-esp32-elf GCC をパスの通った場所に入れました。しかしながらこれでは十分に要件を満たしていないので、後から追加パッケージをインストールすることになります。

最後に、ESP-IDF へのパスを通すために以下をシェルの設定ファイルに記述します。僕は Zsh 使いなので、~/.zshenv に環境変数を設定するコマンドを書きました。この辺は各自の環境で適宜変えましょう。

export IDF_PATH="/Users/yuki/Dropbox/esp32/esp-idf"

設定したらシェルを再起動することをおすすめします。echo $IDF_PATH で上記の値が出てきたら OK です!

USBシリアルチップのドライバインストール

そう言えばこんな記事書いてましたね。全くこのとおりです。メーカーのサイトからドライバを持ってきてインストール、再起動してください。

取り敢えずビルド

こちらも Getting Started に従います。

$ pwd
/Users/yuki/Dropbox/esp32
$ ls
esp-idf/

$ cp -r esp-idf/examples/get-started/hello_world/ .
$ cd hello_world

make をすると、まあ色々怒られます。

$ make
mconf-idf is not required on this platform
mconf-idf is not required on this platform
The following Python requirements are not satisfied:
click>=7.0
cryptography>=2.1.4
pyparsing>=2.0.3,<2.4.0
pyelftools>=0.22
gdbgui==0.13.2.0
pygdbmi<=0.9.0.2
kconfiglib==13.7.1
reedsolo>=1.5.3,<=1.5.4
bitstring>=3.1.6
ecdsa>=0.16.0
Please follow the instructions found in the "Set up the tools" section of ESP-IDF Getting Started Guide
Diagnostic information:
    IDF_PYTHON_ENV_PATH: (not set)
    Python interpreter used: /usr/local/opt/python@2/bin/python2.7
    Warning: python interpreter not running from IDF_PYTHON_ENV_PATH
    PATH: /Users/...(省略)

ここから分かることは、python2.7 をインタプリタとして使用していること、そして挙げられたパッケージがインストールされていないことです。しかし 2.7 だと pip でのインストールに失敗します。しかも今どき 2.7 を使うはずがないだろ...ということで python3 を使うようにしたいと思います。結果として以下のコマンドを叩きました。

$ pip3 install --upgrade pip
$ pip3 install click cryptography pyelftools gdbgui pygdbmi kconfiglib reedsolo bitstring ecdsa future 'pyparsing==2.0.3' 'gdbgui==0.13.2.0' 'pygdbmi==0.9.0.2' 'kconfiglib==13.7.1'

わざわざバージョン指定するくらいなら最初からインストールスクリプトを叩いたほうが良かったような気がしますが、まあ取りあえずこれで動くので...()

このままだと Mac の仕様上(?)、python2.7 で実行されてしまうので、ビルドスクリプト実行時には python3 を付けることにします。また、このようにコマンドを改変する都合上、idf.py に関してはフルパスを入力します。一部は IDF_PATH が使えるんですけどね。

$ python3 $IDF_PATH/tools/idf.py menuconfig

Getting Started によると、ここで Wi-Fi パスワード等の設定ができるらしいですが、今回の Hello World ではデフォルトの設定でビルドできてしまうらしいです。Q を押してメニューを抜け、次のコマンドでビルドしましょう。

$ python3 $IDF_PATH/tools/idf.py build

書き込み

続いて書き込みです。なんと簡単なコマンド。

$ python3 $IDF_PATH/tools/idf.py -p /dev/cu.SLAB_USBtoUART flash

よく見てみると、この書き込みコマンドは書き込み対象バイナリ名を指定するために、プロジェクトディレクトリ名を見ているようです。つまり ディレクトリ名を変えたら使えないらしいね。その時は「再度ビルドしてください」などと怒られますので従いましょう。

シリアル通信データを見る

以下で見れます。

$ python3 $IDF_PATH/tools/idf.py -p /dev/cu.SLAB_USBtoUART monitor

Hello World! とか陽気なことを言っておきながら、何度も再起動を繰り返す動作になっていればOKです。C-] で抜けます。

最後に - サンプルプロジェクト配布

これから自分でプロジェクトを作っていくということで、空のサンプルプロジェクトを作成しました。こちらからどうぞ。次回からはこれを利用していきます。

使うときは(必須ではないですが)、CMakeLists.txtproject を編集してください。例えば blink というプロジェクト名の場合は

# The following five lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.5)

include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(blink)

とします。また、build.sh というスクリプトを同封しています。これに引数として build 等のみを与えるだけで簡単にコマンドを書けます。例えば、

$ ./build.sh build flash monitor

と書けばこれだけでビルド、書き込み、シリアルモニタ起動ができます。