ESP-IDFでArduino用のライブラリ関数を使用するためにやったこと

# はじめに

ESP-IDFのESP32環境でArduinoの関数を使いたいと思ってその環境を構築しました。
そのための情報が散在していて少し手間取ったため、本記事を作成することにしました。

※Serial.println()で文字列を表示するサンプルプログラムを動作させるところまでの手順です

# 使用したもの

* [ESP-WROOM-32ピッチ変換済みモジュール《フル版》](https://www.switch-science.com/catalog/3170/)
* OS：Ubuntu18.04 ( Windows7 Pro 64bit をホストOSとするVirtualBoxにインストール ) 

# 手順

※ESP-IDFの開発環境を構築していることを前提としています。（[「ここ」](https://qiita.com/TwDaiki/items/862f61c9d3888e990209#%E6%89%8B%E9%A0%86%EF%BC%92mruby%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)の手順2の1～5を行った状態に該当します）

１. 以下のコマンドを上から順に実行する　  

```
$ cd ~/esp
$ cp -r $IDF_PATH/examples/get-started/hello_world .
$ cd hello_world
$ mkdir -p components
$ cd components
$ git clone https://github.com/espressif/arduino-esp32.git arduino
$ cd arduino
$ git submodule update --init --recursive
$ cd ~/esp/hello_world
$ make menuconfig
```
２. menuconfigの画面にて、設定値を以下の通りに変更してSaveしてExitする

```
・Arduino Configuration -> 
  [*] Autostart Arduino setup and loop on boot
・Compiler options -> 
  [*] Enable C++ exceptions
・Serial flasher config -> Flash size ->
  [*] 4 MB
・Component Config -> mbedTLS -> TLS Key Exchange Methods ->
  [*] Enable pre-shared-key ciphersuits
    [*] Enable PSK based ciphersuite modes
```
３. hello_world/main下の「hello_world_main.c」を削除し、代わりに以下の内容で「main.cpp」を作成する

```
#include "Arduino.h"
void setup(){
  Serial.begin(115200);
}

void loop(){
  Serial.println("loop");
  delay(1000);
}
```
４. 実機にサンプルプログラムを書き込んで動作をモニターする

```
$ make
$ make flash
$ make monitor
```
画像：モニターの様子(「loop」が１秒間隔で表示される）
![実行の様子.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155449/b7992fe1-629a-d012-e1bf-a1f942eb56fe.png)


# 終わりに

今後はAPモードでサーバーとして色々させたいので、Arduinoの色々な関数を使用する中で問題が出てくるかもしれません。（その時は以下の「おまけ」に追記して行こうかな）

それにしても、menuconfigで「mbedTLS」の設定が出てきたときには「mbed!?」と思いましたが、組込でTLSを実装する際にはよく使われているのかもしれません。

また、git cloneでarduinoの環境を持ってきているので、それが変わってしまったらmenuconfigの設定を変えなければいけない恐れがあります。自身のリポジトリでgit submoduleでバージョンを紐づけておいた方が良いかもしれません。（[参考URL1](https://qiita.com/lastcat_/items/abfd5a33acbb49dc4ed8)、[参考URL2](https://qiita.com/GotoKazu/items/2d399409810ca231bd39)）
→[追記しました](https://qiita.com/TwDaiki/items/fbbcfa7be2ec79976189#esp32%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%ABarduino%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E7%B4%90%E3%81%A5%E3%81%91%E3%82%8B)(2019/04/23)

見ていただいてありがとうございました。
тнайк чoμ_〆(・ω・｡)			
			
# おまけ

### ウオッチドッグタイマのリセットについて
本環境でWi-Fiのアプリケーションを作っている中で、ウオッチドッグタイマ（システムの監視機能）によるシステムリセットが発生することがありました。

ウオッチドッグタイマによるリセット時のメッセージ例：

```
Task watchdog got triggered. The following tasks did not reset the watchdog in time:
- IDLE (CPU 0)
Tasks currently running:
...
```
そこで、loop関数に以下のようにvTaskDelayを入れたところ、ウオッチドッグタイマをクリアする余地が入って現象を解消することができました。

```
void loop()
{
  WiFiClient client = server.available();
  if (client.connected()) {
　　　：
    client.stop();
  }
  vTaskDelay(1);
}
```
※ちなみにserverはWiFiServerクラスのオブジェクトです。


### ESP32プロジェクトにArduinoライブラリのプロジェクトを紐づける
gitのsubmoduleを使用して、自分のESP32(ESP-IDF)プロジェクトのリポジトリにArduinoライブラリのプロジェクト(外部リポジトリ)を紐づけます。

動作確認済みのバージョンのArduinoライブラリと自分のプロジェクトを紐づけることによって、そのArduinoライブラリが更新されて動作しなくなる、という心配を軽減することができます。（cloneする際に紐づけたバージョンが使用されるため）

使用したもの：
PCのOS：Windows7 Pro 64bit
ツール１：Git for Windows 2.14.1
ツール２：source tree 1.9.13.7


前提として、上記のhello_worldプロジェクトで扱ったような以下の階層でリポジトリを既に作成しているとします。ここのcomponentsにArduinoライブラリのプロジェクト(外部リポジトリ)を紐づけます。

```
hello_world
┣ build
┣ components
┗ main
```

source tree単体でもsubmoduleのメニューはありますが、エラーが出て上手くいかないのでコマンドでgitを使います。componentsフォルダに移動して以下のコマンドを実行します。

```
C:\WorkSpace\esp32examples\hello_world\components> git submodule add https://github.com/espressif/arduino-esp32.git arduino
```

数分待つと完了します（以下のコマンド実行結果参照）


```
C:\WorkSpace\esp32examples\hello_world\components>git submodule add https://github.com/espressif/arduino-esp32.git arduino
Cloning into 'C:/WorkSpace/esp32examples/hello_world/components/arduino'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 12465 (delta 0), reused 1 (delta 0), pack-reused 12461
Receiving objects: 100% (12465/12465), 186.76 MiB | 664.00 KiB/s, done.
Resolving deltas: 100% (7306/7306), done.
warning: LF will be replaced by CRLF in .gitmodules.
The file will have its original line endings in your working directory.
```

そのリポジトリをsource treeで開くと以下のように認識されていますので、コミット＆プッシュします。

図：source tree画面
![sourcetree3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155449/406693e8-ffcf-db2d-1039-f298c02128cb.png)

そうするとgithub上に登録されています。

図：github画面
![github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155449/b400074c-657d-6a4f-9ca4-d7ffe47727ed.png)

この「@f8eebb5」というは、Arduinoライブラリのプロジェクト(外部リポジトリ)の コミット f8eebb5 を外部モジュール(submodule)として登録していることを指しています。

そして、上記でプッシュしたリポジトリをクローンする際は以下のようにコマンドを実行します。

```
git clone --recursive https://github.com/xxx/esp32examples.git .
```

### ESP32 WiFiClientSecure ライブラリのハングアップ問題
「ESP32 WiFiClientSecure ライブラリのハングアップ問題」というものがあるようで、その解決方法が以下のサイトに記載されていました。私がいま使っている中では影響はありませんが、参考まで。

[リンク：Arduino – ESP32 WiFiClientSecure ライブラリのハングアップ問題がついに解決！](https://www.mgo-tec.com/blog-entry-arduino-esp32-wificlientsecure-hangup-solution.html/2)


# 更新履歴
* 2019-04-14：新規作成 
* 2019-04-20：「ウオッチドッグタイマのリセットについて」を追加 
* 2019-04-23：「ESP32プロジェクトにArduinoライブラリのプロジェクトを紐づける」を追加