ESP32で遊ぶ


開発環境を作る (1)

Espressif社から提供されているESP-WROOM-32は、WiFiの他にBluetoothを組み込んだSoC(?)で、技適(TELEC)番号を取得済みのモジュールです。しかも、秋月電子通商では単体で1個550円(執筆時点)とお手頃価格です。
今回から、ESP32-DevKitCを使って遊んでみたいと思います。

Windows 10 にESP-IDF をインストール

ESP32はESP8266に比べるとまだ情報が少ないものの、デュアルコアになっていたりメモリが増えていたりと、やれることが大きく増えています。
早速、開発環境をインストールしていきましょう。

ESP-IDFのインストールは、Espressif社の公式なドキュメントに従って作業を進めれば良いのですが、Linuxなどの各種OSにも対応するように書かれているので、少々戸惑うところもありましたので、整理ておきたいと思います。

  • ツールチェーンのインストール
    1. Get StartedSetup ToolchainからWindowsへと進み、Toolchain Setupに示されたzipファイル(執筆時点では、esp32_win32_msys2_environment_and_toolchain-20180110.zip)をダウンロードします。
    2. ダウンロードされたzipファイルを解凍します。
    3. 解凍してできたmsys32フォルダをC:¥に移動します。
    4. スタートメニューに追加します。
      1. C:¥msys32¥mingw32.exeを選択してマウスの右ボタンをクリックします。
      2. 右メニューの中から[ショートカットの作成]を選択します。
      3. C:¥ProgramData¥Microsoft¥Windows¥Start Menu¥Programsフォルダにmsys2フォルダを作成します。
      4. 先ほど作成したショートカットを今作成したC:¥ProgramData¥Microsoft¥Windows¥Start Menu¥Programs¥msys2フォルダに移動します。
    5. MSYS2のパッケージを更新します。
      1. mingw32.exeを起動します。
      2. パッケージデータベースを更新します。
        $ pacman -Sy ↵
        :: パッケージデータベースの同期中...
         mingw32 は最新です         0.0   B  0.00B/s 00:00 [---------------------]   0%
         mingw64 は最新です         0.0   B  0.00B/s 00:00 [---------------------]   0%
         msys は最新です            0.0   B  0.00B/s 00:00 [---------------------]   0%
        
      3. パッケージを更新します。
        $ pacman -Su ↵
        :: Starting core system upgrade...
         何も行うことがありません
        :: システム全体の更新を開始...
         何も行うことがありません
        
      4. mingw32.exeを終了します。
        $ exit ↵
        
      5. 更新するパッケージがなくなるまで、更新と終了を繰り返します。

  • ESP-IDFをインストールします。
    1. mingw32.exeを起動します。
    2. カレントディレクトリを移動します。
      $ cd /opt ↵
      
    3. GitHubからESP-IDFをクローンします。
      $ git clone https://github.com/espressif/esp-idf.git esp-idf-v30 ↵
      Cloning into 'esp-idf-v30'...
      remote: Counting objects: 52644, done.
      remote: Compressing objects: 100% (755/755), done.
      remote: Total 52644 (delta 673), reused 1203 (delta 555), pack-reused 51285
      Receiving objects: 100% (52644/52644), 49.5
      
    4. カレントディレクトリを移動します。
      $ cd esp-idf-v30 ↵
      
    5. チェックアウトします。
      $ git checkout release/v3.0 ↵
      Branch 'release/v3.0' set up to track remote branch 'release/v3.0' from 'origin'.
      Switched to a new branch 'release/v3.0'
      
    6. サブモジュールを取得します。
      $ git submodule update --init --recursive ↵
      Submodule 'components/aws_iot/aws-iot-device-sdk-embedded-C' (https://github.com/espressif/aws-iot-device-sdk-embedded-C.git) registered for path 'components/aws_iot/aws-iot-device-sdk-embedded-C'
      Submodule 'components/bt/lib' (https://github.com/espressif/esp32-bt-lib.git) registered for path 'components/bt/lib'
      Submodule 'components/coap/libcoap' (https://github.com/obgm/libcoap.git) registered for path 'components/coap/libcoap'
      Submodule 'components/esp32/lib' (https://github.com/espressif/esp32-wifi-lib.git) registered for path 'components/esp32/lib'
      Submodule 'components/esptool_py/esptool' (https://github.com/espressif/esptool.git) registered for path 'components/esptool_py/esptool'
      Submodule 'components/json/cJSON' (https://github.com/DaveGamble/cJSON.git) registered for path 'components/json/cJSON'
      Submodule 'components/libsodium/libsodium' (https://github.com/jedisct1/libsodium.git) registered for path 'components/libsodium/libsodium'
      Submodule 'components/micro-ecc/micro-ecc' (https://github.com/kmackay/micro-ecc.git) registered for path 'components/micro-ecc/micro-ecc'
      Submodule 'components/nghttp/nghttp2' (https://github.com/nghttp2/nghttp2.git) registered for path 'components/nghttp/nghttp2'
      Submodule 'components/spiffs/spiffs' (https://github.com/pellepl/spiffs.git) registered for path 'components/spiffs/spiffs'
      Cloning into '/opt/esp-idf-v30/components/aws_iot/aws-iot-device-sdk-embedded-C'...
      Cloning into '/opt/esp-idf-v30/components/bt/lib'...
      Cloning into '/opt/esp-idf-v30/components/coap/libcoap'...
      Cloning into '/opt/esp-idf-v30/components/esp32/lib'...
      Cloning into '/opt/esp-idf-v30/components/esptool_py/esptool'...
      Cloning into '/opt/esp-idf-v30/components/json/cJSON'...
      Cloning into '/opt/esp-idf-v30/components/libsodium/libsodium'...
      Cloning into '/opt/esp-idf-v30/components/micro-ecc/micro-ecc'...
      Cloning into '/opt/esp-idf-v30/components/nghttp/nghttp2'...
      Cloning into '/opt/esp-idf-v30/components/spiffs/spiffs'...
      Submodule path 'components/aws_iot/aws-iot-device-sdk-embedded-C': checked out '7132505b00d2dd57f48478e75efa636021919aae'
      Submodule path 'components/bt/lib': checked out 'b76cf6aa307acca2bf3634f2534c84b89f60a054'
      Submodule path 'components/coap/libcoap': checked out '6468887a12666f88b8704d797fc176cd4f40ee4c'
      Submodule path 'components/esp32/lib': checked out '494b2d809619e2af51a27ad39b187164e3acaa94'
      Submodule path 'components/esptool_py/esptool': checked out '4dab24e1b28632d270adf7305fe0d008d1acee99'
      Submodule path 'components/json/cJSON': checked out '7cc52f60356909b3dd260304c7c50c0693699353'
      Submodule path 'components/libsodium/libsodium': checked out '70170c28c844a4786e75efc626e1aeebc93caebc'
      Submodule path 'components/micro-ecc/micro-ecc': checked out '14222e062d77f45321676e813d9525f32a88e8fa'
      Submodule path 'components/nghttp/nghttp2': checked out '3bcc416e13cc790e2fb45fcfe9111d38609c5032'
      Submodule 'third-party/mruby' (https://github.com/mruby/mruby) registered for path 'components/nghttp/nghttp2/third-party/mruby'
      Submodule 'third-party/neverbleed' (https://github.com/h2o/neverbleed.git) registered for path 'components/nghttp/nghttp2/third-party/neverbleed'
      Cloning into '/opt/esp-idf-v30/components/nghttp/nghttp2/third-party/mruby'...
      Cloning into '/opt/esp-idf-v30/components/nghttp/nghttp2/third-party/neverbleed'...
      Submodule path 'components/nghttp/nghttp2/third-party/mruby': checked out '22464fe5a0a10f2b077eaba109ce1e912e4a77de'
      Submodule path 'components/nghttp/nghttp2/third-party/neverbleed': checked out 'da5c2ab419a3bb8a4cc6c37a6c7f3e4bd4b41134'
      Submodule path 'components/spiffs/spiffs': checked out 'f5e26c4e933189593a71c6b82cda381a7b21e41c'
      
      ※masterブランチで作業をするは少々気持ちが悪かったので、ブランチを変更しています。
       release/v3.0ブランチも時々更新されているため、現時点ではブランチを変更する意味はないかもしれません。
    7. ESP-IDFのパスを登録します。
      1. C:¥msys32¥etc¥profile.dフォルダにexport_idf_path.shファイルを作成します。
      2. export_idf_path.shファイルに次の内容を記録します。
        export IDF_PATH="C:/msys32/opt/esp-idf-v30"
        
    8. mingw32.exeを終了します。
      $ exit ↵
      

  • サンプルをコンパイルしてみる
    1. プロジェクト用のフォルダを作成します。
      今回は、E:¥MyDocuments¥Project¥esp32とします。
    2. C:¥msys32¥opt¥esp-idf-v30¥examples¥get-started¥hello_worldフォルダを作成したE:¥MyDocuments¥Project¥esp32の下にコピーします。
    3. mingw32.exeを起動します。
    4. カレントディレクトリを移動します。
      $ cd /e/MyDocuments/Project/esp32/hello_world/ ↵
      
    5. コンパイルする際に必要な設定を行います。
      $ make menuconfig ↵
      
    6. Espressif IoT Development Framework Configuration画面で[Exit]を選択します。
      ※コンパイルが通ることを確認するだけですので、正しい設定はしていません。
    7. コンパイルを行います。
      $ make ↵
              :
      LD build/hello-world.elf
      esptool.py v2.1
      To flash all build output, run 'make flash' or:
      python /opt/esp-idf-v30/components/esptool_py/esptool/esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 /e/MyDocuments/Project/esp32/hello_world/build/bootloader/bootloader.bin 0x10000 /e/MyDocuments/Project/esp32/hello_world/build/hello-world.bin 0x8000 /e/MyDocuments/Project/esp32/hello_world/build/partitions_singleapp.bin
      
    8. コンパイルが正常に終了しました。
    9. mingw32.exeを終了します。
      $ exit ↵
      

以上で、ESP-IDFがインストールできました。
次回は、Eclipseでの開発が進められるように設定などをしていく予定です。