M5StickCのesp-idfとArduinoライブラリとM5StickCライブラリを用いた環境構築
- 想定環境
- 1. esp-idfのインストール
- 2. esp-idfのサンプルプロジェクトからテンプレートを作成
- 3. arduino-esp32をコンポーネントに加える
- 4. M5StickCライブラリをコンポーネントに加える
- 5. menuconfigを設定する
- 5-2. make menuconfigの設定(esp-idf: v3.2 arduino-esp32: 1.0.2 の場合)
- 6. VS Codeの設定
- 7. ソースコードの作成・コンパイル
- 参考になったサイト
Arduino IDEを使わずにM5StickCをesp-idfに加えarduino-esp32とM5StickCをコンポーネントとした開発環境で、vscodeでプログラムします。
すでにgit cloneでダウンロードするだけで環境を構築できるものを公開されている方がいます。
ただ、使用しているM5StickCのライブラリが古いので、IMUがMPU6886に変更されているものでは適用できない可能性があります。(まだ試していない)
なので、esp-idfのサンプルプロジェクト(hello_world)を改変して最新のM5StickCライブラリを取り込んでM5StickCの開発に対応させる手順を記録しておきます。
なお、M5Stackにおいても同様の環境が公式より提供されています。
想定環境
- M5StickC (6軸センサ: MPU6886を搭載)
- Windows10 (ver.1903)
- toolchain 20181001(esp-idfをコンパイルするための環境。今回はlegacyなtoolchainを用います。)
- esp-idf v3.2 (ESP32のC++開発環境。)
- arduino-esp32 1.0.2 (esp-idfにコンポーネントとして取り込むとArduino風の関数が使えます。)
- M5StickC (esp-idfにコンポーネントとして取り込めるように少し改変すると、esp-idf内でArduino風の
M5.begin()
等が使えるようになります。)
ここより今回はarduino-esp32は1.0.2を用います。Releasesよりesp-idfのバージョンは3.2を用いることにします。上の画像のように依存関係はリリースページやコミットのメッセージから参照できます。
利用時は最新の依存関係を確認してください。
(なお、arduino-esp32が1.0.2、esp-idfが3.2.2のものでも今回の記事と同じ操作で環境を構築することが可能であることを確認しています。)
1. esp-idfのインストール
現在、esp-idfのWindows向けのインストールには
Pythonベースのもの(Windowsのネィティブで高速なもの)も存在しますが、うまく行かなかったため、今回はLegacyなmsys2のtoolchainを用います。バージョンは安定版を用います。
(なお、現時点でのツールチェインはesp32_win32_msys2_environment_and_toolchain-20181001.zip
でした。)
公式の手順に従ってStep 3.のmingwの環境変数の設定まで済ませてください。
ただ、今回はStep 2.でgit clone
を使ってesp-idfをクローンする際はv3.2を指定します。
git clone -b v3.2 --recursive https://github.com/espressif/esp-idf.git
また、後にVS Code上でも$IDF_PATH
を参照したいため、Windows上の環境変数にもIDF_PATH
をmingw32で設定したものと同じパスで設定します。
2. esp-idfのサンプルプロジェクトからテンプレートを作成
次にesp-idf上からもととなるサンプルプロジェクトをコピーしてきます。mingw32上で
cd ~ cp -r $IDF_PATH/examples/get-started/hello_world . cd hello_world
でhello_worldプロジェクトをもとにM5StickCの開発を始めます。
3. arduino-esp32をコンポーネントに加える
mkdir -p components cd components git clone -b 1.0.2 https://github.com/espressif/arduino-esp32.git arduino cd arduino git submodule update --init --recursive cd ../..
以上のコマンドでarduino-esp32(Arduino core for the ESP32)の1.0.2のバージョンをプロジェクト上にサブモジュールとして加える事ができます。
4. M5StickCライブラリをコンポーネントに加える
cd components git clone https://github.com/m5stack/M5StickC.git m5stickc cd m5stickc git submodule update --init --recursive curl https://raw.githubusercontent.com/m5stack/M5Stack/master/component.mk -o component.mk cd ../..
以上のコマンドでArduino IDEのM5StickCライブラリをプロジェクト上のサブモジュールとして加えることが出来ます。
また、5行目でcurlでダウンロードしているcomponent.mk
は前述のM5Stack-IDFにおいて用いられていたコンポーネントのために必要なファイルをそのまま流用しています。
最後にプロジェクトフォルダ内でビルドデータを一度削除します。(念の為です。やらなくてもおそらく大丈夫です。)
make clean
5. menuconfigを設定する
デバイスマネージャーよりM5StickCを接続したポートを覚えておきます。
次に、menuconfigを立ち上げます。
make menuconfig
Serial flasher config
からDefault serial port
より、ポートを設定しておきます。
arduino-esp32をコンポーネントに追加するとArduino Configuration
が追加されAutotostart Arduino setup and loop on boot
が設定できるようになります。
enableにすると、Arduino IDEと同様にsetup()
やloop()
で処理を書くことが出来ます。(今回はenableにします。)
(ちなみに、有効にしない場合はエントリーポイントはapp_main()
となり、その内部でinitArduino()
を呼ぶ必要があります。)
5-2. make menuconfigの設定(esp-idf: v3.2 arduino-esp32: 1.0.2 の場合)
以下の設定は、今回環境構築に用いた、esp-idfがv3.2、及びarduino-esp32が1.0.2の組み合わせの際に必要となった設定です。
(または、esp-idfのv3.2.2を用いてる場合も必要です。)
新しいバージョン同士で構築する際には必要でない可能性があります。
もし、異なるバージョンで行う場合は一度、この操作は行わないで、「6. VS Codeの設定」を試してみてください。
コンパイルオプションの「C++ exceptions」を有効化する
menuconfig内でCompiler options
→Enable C++ exceptions
を有効にします。
一部のArduinoライブラリを無効化する
menuconfigからArduino Configuration
→Include only specific Arduino libraries
を有効にします。
次にEnable AzureIoT
→Enable HTTPClient
→Enable WiFiClientSecure
の順にチェックを外します。
(コンパイル時にエラーが発生するのは「WiFiClientSecure」のみですが依存の関係で「HttpClient」と「AzureIoT」も使えないようです。新しいバージョンになれば使えるようになるかも知れません……)
Flash sizeを変更する
menuconfigのSerial flasher config
→Flash size
を選択し、2MB→4MBに変更してください。
以上で、menuconfigの設定の完了です。トップでEscを押してから、「Yes」を選択すると設定ファイルが作成されます。
6. VS Codeの設定
VS Codeでも入力補完とビルドを行えるようにします。
hello_worldフォルダを開き、C/C++拡張機能を追加します。
Ctrl+Shift+Pよりコマンドパレットから>C/C++: Edit Configurations (JSON)
を入力してc_cpp_properties.json
を開き、以下のように入力します。
{ "configurations": [ { "name": "ESP32", "includePath": [ "${workspaceRoot}/**", "${IDF_PATH}/components/**", "${IDF_PATH}/../../../../opt/xtensa-esp32-elf/**" ], "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "msvc-x64" } ], "version": 4 }
includePath
の3行目の設定はmsys32/optxtensa-esp32-elf
以下のフォルダをインクルードパスに含めるために相対パスです。必要に応じて変更してください。
また、.vscode/settings.json
を作成し、以下のように入力します。
{ "terminal.integrated.shell.windows": "C:\\develop\\esp\\msys32\\usr\\bin\\bash.exe", "terminal.integrated.env.windows": { "MSYSTEM": "MINGW32", "CHERE_INVOKING": "1" }, "terminal.integrated.shellArgs.windows": [ "--login" ], "C_Cpp.intelliSenseEngine": "Default" }
1行目の設定、terminal.integrated.shell.windows
はmsys32\msys32\usr\bin\bash.exe
を絶対パスで入力します。必要に応じて変更してください。(また、ディレクトリの区切り文字\
は\\
に置き換えてください。)
これらの設定より、VS Code内のターミナルよりmake **
コマンドによってコンパイル、書き込みが行えるようになります。
変更後、ターミナルを開いたときはコンソールの変更について尋ねるウィンドウが開くため「許可」を選択し、最初から開いているPowerShellを一度ゴミ箱のボタンで閉じてください。
再度、ターミナルを開くとbashに切り替えられています。
7. ソースコードの作成・コンパイル
以下のようにプロジェクトを修正します。
hello_world\main
以下のhello_world_main.c
をmain.cpp
に変更hello_world\main\CMakeLists.txt
の1行目をset(COMPONENT_SRCS "hello_world_main.c")
→set(COMPONENT_SRCS "main.cpp")
に変更hello_world\Makefile
の6行目を好きな名前に変更します。(ここではPROJECT_NAME := hello-world
とします。)hello_world\CMakeLists.txt
の6行目を好きな名前に変更します。(ここではproject(hello-world)
とします。)
hello_world\main\main.cpp
を以下のようにします。
#define ESP32 #include <M5StickC.h> void setup(void){ M5.begin(); M5.Lcd.begin(); M5.Lcd.fillScreen(BLACK); } void loop(void){ M5.Lcd.setCursor(1, 15); M5.Lcd.printf("Hello World!\n"); delay(1000); M5.Lcd.fillScreen(BLACK); delay(1000); }
最初の#define ESP32
は、M5StickC.h
を利用するために必要です。
また、delay
関数が参照エラーを示してしまいますが、コンパイルは通ります。
関数自体はarduino(arduino-esp32)/cores/esp32/esp32-hal.h
に定義があるため、#include <esp32-hal.h>
を追加すれば直ります。
以上より、プロジェクトの基本形は完成しました。
VS Code内のターミナルから
make -j4 flash
を実行します。
できました!
参考になったサイト
M5Stackで同様のことを実践されています。
arduino-esp32をesp-idfにコンポーネントとして導入する公式の解説ページです。
M5Stackをesp-idfとarduino-esp32とM5Stackライブラリで開発するM5Stack-IDFについての解説をされています。
どうして、コンポーネント化できるのか、その仕組を解説されてます。