とうふ荘の手記てき!

プログラムとか

M5StickCのesp-idfとArduinoライブラリとM5StickCライブラリを用いた環境構築

Arduino IDEを使わずにM5StickCをesp-idfに加えarduino-esp32M5StickCコンポーネントとした開発環境で、vscodeでプログラムします。

すでにgit cloneでダウンロードするだけで環境を構築できるものを公開されている方がいます。

github.com

ただ、使用しているM5StickCのライブラリが古いので、IMUがMPU6886に変更されているものでは適用できない可能性があります。(まだ試していない)

なので、esp-idfのサンプルプロジェクト(hello_world)を改変して最新のM5StickCライブラリを取り込んでM5StickCの開発に対応させる手順を記録しておきます。

なお、M5Stackにおいても同様の環境が公式より提供されています。

github.com

想定環境

f:id:tofu-so-shioaji:20190911005848p:plain

ここより今回は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を用います。バージョンは安定版を用います。

docs.espressif.com

(なお、現時点でのツールチェインは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

docs.espressif.com

また、後にVS Code上でも$IDF_PATHを参照したいため、Windows上の環境変数にもIDF_PATHをmingw32で設定したものと同じパスで設定します。

f:id:tofu-so-shioaji:20190906194704j:plain

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を接続したポートを覚えておきます。

f:id:tofu-so-shioaji:20190906235028p:plain

次に、menuconfigを立ち上げます。

make menuconfig

Serial flasher configからDefault serial portより、ポートを設定しておきます。

f:id:tofu-so-shioaji:20190911023813p:plain

arduino-esp32をコンポーネントに追加するとArduino Configurationが追加されAutotostart Arduino setup and loop on bootが設定できるようになります。

enableにすると、Arduino IDEと同様にsetup()loop()で処理を書くことが出来ます。(今回はenableにします。)

(ちなみに、有効にしない場合はエントリーポイントはapp_main()となり、その内部でinitArduino()を呼ぶ必要があります。)

f:id:tofu-so-shioaji:20190911023943p:plain

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 optionsEnable C++ exceptionsを有効にします。

f:id:tofu-so-shioaji:20190911023512p:plain

一部のArduinoライブラリを無効化する

menuconfigからArduino ConfigurationInclude only specific Arduino librariesを有効にします。

次にEnable AzureIoTEnable HTTPClientEnable WiFiClientSecureの順にチェックを外します。

コンパイル時にエラーが発生するのは「WiFiClientSecure」のみですが依存の関係で「HttpClient」と「AzureIoT」も使えないようです。新しいバージョンになれば使えるようになるかも知れません……)

f:id:tofu-so-shioaji:20190911024542p:plain

Flash sizeを変更する

menuconfigのSerial flasher configFlash 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.windowsmsys32\msys32\usr\bin\bash.exe絶対パスで入力します。必要に応じて変更してください。(また、ディレクトリの区切り文字\\\に置き換えてください。) これらの設定より、VS Code内のターミナルよりmake **コマンドによってコンパイル、書き込みが行えるようになります。

変更後、ターミナルを開いたときはコンソールの変更について尋ねるウィンドウが開くため「許可」を選択し、最初から開いているPowerShellを一度ゴミ箱のボタンで閉じてください。

f:id:tofu-so-shioaji:20190907025321p:plain

再度、ターミナルを開くとbashに切り替えられています。

7. ソースコードの作成・コンパイル

以下のようにプロジェクトを修正します。

  • hello_world\main以下のhello_world_main.cmain.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

を実行します。

できました!

f:id:tofu-so-shioaji:20190911033425g:plain

参考になったサイト

another.maple4ever.net

M5Stackで同様のことを実践されています。

github.com

arduino-esp32をesp-idfにコンポーネントとして導入する公式の解説ページです。

kazkojima.github.io

M5Stackをesp-idfとarduino-esp32とM5Stackライブラリで開発するM5Stack-IDFについての解説をされています。

どうして、コンポーネント化できるのか、その仕組を解説されてます。