3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

m5stackはPlatformIOでESP-IDFは使えなかった

Posted at

#ESP-IDFを試してみようとしたきっかけ

m5stackArudinoを使ってパルスカウンターを作ってみました。

パルスカウンターを作ってみる
https://qiita.com/zasshyu6/items/d4a1d719e59c713b2eeb

ですが、タイマ割込が1usec以下だとvTaskDelayをかけてもリセットがかかってしまう。
また、今回のパルスカウンターでは、5usec以上でないと動いてくれないので、100kHz周期が限界。
通常制御だと確かに十分な速度ですが、パルスカウンターとして使う場合はさすがに遅くないかな・・・
もともとArduinoloop()の待ち時間が遅いというのでとりあえずArduino以外であたりをつけてみる。

というわけで、今度はESP-IDFを使ってみようと思いました。
ESP-IDF初めてなので、とりあえずUARTでループバックを作ろうとしました。

結論として言えば、作れませんでした。
cpu_start.c:(.text.main_task+0x5f): undefined reference to 'app_main'
というコンパイラエラーが出てしまい、elfファイルが作れませんでした。
(PlatformIOm5stackのライブラリ限定かもしれませんが・・・)

m5stackについて調べたことは以下の記事に乗せています。

m5stackで遊ぼう
https://qiita.com/zasshyu6/items/35a1048a9781bdcfebb7

以下は、ESP-IDFを使う為に調べたことです。

##開発環境

  • windows 10 Home 64bit
  • Visual Studio Code 1.38.1
  • PlatformIO
    • 使用ライブラリはESP-IDF
    • 使用言語はC++

Arduinoって言語というよりライブラリでしたね・・・
今まで全部言語でくくっちゃってました・・・
また、気づいたらVisual Studio Codeがアップデートされてました。

##ESP-IDFについて

ESP32およびESP8266用の開発ライブラリで、driverがついているため各種周辺機能にアクセスできます。
Arduinoよりもマイコンっぽく使える!ライブラリですね。
PlatformIOをインストールするときに一緒にライブラリがインストールされます。
PLatFormIOの入れ方は以下の記事を参考にしました。わかりやすかったです。

M5Stackの開発環境を整える - PlatformIO IDE編
https://qiita.com/lutecia16v/items/1c560bdd7eac7ebeaff7

プロジェクト作成でArduinoを選択していた部分をESP-IDFに変更するとプロジェクトが作成されます。
開発環境組み立ては非常に楽ですね。

プロジェクトを作成すると、sdkconfig.hという設定ファイルだけが作成されました。
main.cppが作成されないのでどうやって動かすんだろ?と思って探したら、サンプルがパッケージの中にありました。
とりあえずサンプルのmainをコピペしてきて色々調べてみます。

##ESP-IDFのスタートアップについて

サンプルのmain.cの中身は、FreeRTOSdriverをインクルードして、
Lチカのタスクを生成、app_main()で起動させているといった流れでした。
driverはそのまま周辺機能やI/Oポートにアクセスするためのヘッダみたいです。

driverがインストールされてるからFreeRTOSはいらないんじゃないか?と思っていたのですが、
スタートアップについてESP-IDFの公式が説明してくれていました。

(公式)General Notes About ESP-IDF Programming
https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/general-notes.html

流れはROMからプログラムを読みだしてRAMへ展開してソフトを起動させるといった普通のブート動作です。
面白いのが、ソフト起動してからFreeRTOSでスケジューリング開始させてから動作開始といったFreeRTOSありきの起動方法です。
ESP-IDFは公式でFreeRTOSを使うマイコンってことでよさそうです。

確か、Arduinoでもマルチコア対応のためにFreeRTOSを使っていたので、
ESP-IDFでもタイマ割込の周期を1 μsec以下は難しそうですね。
それでも練習がてら、試しては見たいところです。

##PlatfromIO+ESP-IDFのLCD表示ライブラリが見当たらない!?
次に、せっかくm5stackなのですから、LCD表示をしてみようと思いました。
今まで、m5stack.h内のTFT_eSPIを使っていたのですが、m5stack.hをincludeすることができません。
Arduino.hを参照してm5stack.h内のTFT_eSPIは作られているので、今回のフレームワークであるESP_IDFをは参照に失敗します。
PlatformIOで配布してくれているライブラリを調べてみましたが、すべてフレームワークがArduinoでした・・・
(だれかPlatformIOESP-IDFに対応したLCDライブラリを見つけた人がいたら教えてください)

PlatformIOの公式外ですが、外部ライブラリでm5stackに対応しているライブラリはありました。

ESP32 TFT display library
https://www.esp32.com/viewtopic.php?t=1937

これを使ったLCDテストがyoutubeには上がってたので試そうと思ってダウンロードしましたが・・・
中にあったサンプルファイルをコンパイルしても通らず・・・
コンパイルエラーを消そうと頑張ってみましたが、PlatformIOのコンポーネントとぶつかっている様子でしたので断念しました。

結局、PlatfromIO+ESP-IDFでLCD表示を行うためには、ライブラリを自作するしかないようです。

##そしてコンパイルエラーが始まる
UARTループバックはサンプルがあったのでそれをとりあえずコピペしてコンパイルをしてみました。
はじめは、xTaskCreateの引数のTaskHandle_tがNULLだとコンパイルが通らないので適当に名前を付けて、
コールバック関数の引数をポインタ持たせてあげてコンパイルを通しました。
そしてLink時に以下のエラーメッセージが出ました。
cpu_start.c:(.text.main_task+0x5f): undefined reference to 'app_main'
cpu_start.cはPlatformIOで用意されるところなのでこれを言われちゃうと何もできず・・・
断念しました。

##結論

  • LCD用のライブラリがない
  • サンプルがコンパイルできない

上記2点をもって、自分のような知識不足の初学者は使うべきではないと思いました。

####補足
PlatformIO自体は自動で必要なファイルを用意してくれるので非常に便利です。
また、VScodeのオートコンプリートと定義検索とPlatformIOArduino環境はすごく楽で使いやすいです。

今回できなかったという点ですが、自分の環境(m5stack)に限るかもしれないです。
また、PlatformIOのアップデート次第では使えるようになると思います。
是非ともどなたか試してみて、うまくいったら教えてください。

3
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?