ESP-LINKでESP32のログをリモートで確認する (Arduinoも可)

# はじめに
ESP32やESP8266でソフトを書き込む際にOTAでリモートアップデートしてもSerialの値はPC上でArduinoのシリアルモニタ等を接続しないと見れないようです。
せっかくリモートアップデートが可能になってもログが確認できなくてデバッグができない状態で不便でした。
別途ESP-LINKをいれたESP8266が必要になりますが初期のデバッグ時に助かると思えば安いです。
PCの変わりにシリアル通信のログを取得保存してWifiで見れます。
これで給湯器にとりつけたESP32が調子悪いときに台所にPC持っていってデバッグする必要がなくなりました!

# 管理画面の動作イメージ

シリアル出力のログの確認以外にも
シリアル入力も可能です。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ESP-LINK使ってESP32のログをリモートで確認できるようになって便利。<br>OTAアップデートでのお供に最適そう。<br>やっと台所デバッグしないですむぞ！<br><br>雑ですがqiitaに書き書き<a href="https://t.co/VTZ2ayiOZQ">https://t.co/VTZ2ayiOZQ</a> <a href="https://t.co/31g45pqz0I">pic.twitter.com/31g45pqz0I</a></p>&mdash; ode (@odetarou) <a href="https://twitter.com/odetarou/status/1110207261949878273?ref_src=twsrc%5Etfw">2019年3月25日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 用意するもの

- ESP8266ボード
  - 安い256円ので確認しました ESP8266MOD(ESP-12?) https://ja.aliexpress.com/item/D1-mini-V2-Mini-NodeMcu-4M-bytes-Lua-WIFI-Internet-of-Things-development-board-based-ESP8266/32688079351.html
- ESP-LINK(各種マイコンをリモート制御できるようにするESP8266用のソフト)

# ESP-LINKとは
>esp8266 wifi-serial bridge, outbound TCP, and arduino/AVR/LPC/NXP programmer

とのことで、シリアル通信をWifiでbridgeするツールで、Arduino等をシリアル通信経由でESP8266につなげてWifi対応にするソフトのようです。
シリアル通信の内容はログとして保存しWeb管理画面上にて確認することができるので
今回はこちらを使ってESP32, ESP8266などのマイコンでのリモートデバッグ用のロガーに利用してみました。

# ESP8266へのESP-LINKのインストール方法

下記記事を参考にしました。
http://nopnop2002.webcrow.jp/esp-link/esp-link-1.html

簡単な流れ
書き込みツールでファームを選択。各種設定値を入力。Startボタン押下で書き込む
ESP-LINKがAPになるのでWifiで接続しWeb管理画面( http://192.168.4.1 )より家庭内APへの接続設定とIP固定化をする。

ファームウェアは下記URLより落とせます。現時点での安定版の3.0.14を利用しました。
https://github.com/jeelabs/esp-link/releases

書き込みツールURL(Windows用のみ) macではコマンドでできると思われます。
https://www.espressif.com/en/support/download/other-tools
コマンドの場合は下記公式英語docが参考になりそうです。
https://github.com/jeelabs/esp-link/blob/master/FLASHING.md#initial-serial-flashing

## ESP8266MOD(ESP-12?)固有問題
こちらのボード固有と思われる問題ではまりました。どうもSPI MODEをDOUTにして書き込まないと起動に失敗するようです。

下記がうまく書き込みができた設定値になります。
![ESP8266 DOWNLOAD TOOL V3.6.5 2019-03-24 01.53.45.png](https://qiita-image-store.s3.amazonaws.com/0/132679/8fb4def4-6e0e-51fe-11d7-00b806a98d69.png)

デフォルトのQIO書き込みだと下記のメッセージを最後に固まりました。（下記シリアル通信は74880bpsでないと見れませんでした。）

```
--- 省略 ---
csum err
ets_main.c
```

この問題には下記issue(英語)が参考になりました。
https://github.com/esp8266/Arduino/issues/2414
(自動翻訳にて)
>（DOUT-modeは最も遅くて最も互換性のあるものです、それで私はそれから始めます）

QIOの代わりにDOUTにて書き込めば正常起動しました。
ESP-LINK自体は起動すればシリアル通信は115200bpsになります。

# 接続方法

ESP32からESP-LINK(ESP8266)へケーブル接続します。
5V,GND,TX,RXを接続します。ESP32のTXはESP8266のRXへ、RXはTXへとクロスで接続

写真だと左がESP-LINK、右がESP32
（安物のESP32ボードのpinプリントがおかしくTX-RXが逆になってるせい？でTX-TXで繋いでます。。）
![IMG_20190324_185007.jpg](https://qiita-image-store.s3.amazonaws.com/0/132679/76f6678a-29e4-e1d3-7a75-bb0793e78a33.jpeg)

resetピンも接続すると管理画面からリセットすることが可能です。(写真では未接続)


# 他のログの検討手段

ESP-LINKが一番いいと思いましたが
その他検討したものを記載します。


## ログをSPIFFSに保存してWifiで確認

一旦安定稼働したアプリ or クラッシュするようなことがなさそうな簡単なアプリでしたら
こちらが便利かと思いました。

参考
ESP8266(ESP-WROOM-02)で動作ログを後で確認できるようにする - 知的好奇心 for IoT
http://intellectualcuriosity.hatenablog.com/entry/2017/04/16/182202

SPIFFSLogger
https://github.com/bitmario/SPIFFSLogger
固定長のデータ構造のみの対応みたいで、文字列はサポートしていませんでした。ローテートは対応しているのに残念。

メリット

- ESP32単独でログの保存、確認ができる

デメリット

- 決定版そうなライブラリが見当たらなかった。自作が必要。
- 書き込み時に専用の書き方が必要
- 起動メッセージやクラッシュエラー時のメッセージが見れない

## Bluetooth Serial

参考
ESP32 Arduino: Bluetoothシリアル通信 - 公開講座資料
http://web.is.tokushima-u.ac.jp/wp/archives/646

ESP32でserial bluetooth接続 - Qiita
https://qiita.com/keitasumiya/items/5b4961de169299e902db

デメリット

- ROMの容量を圧迫する。OTAのコードと一緒に使った場合は容量オーバーになった。
- 常時安定稼働の受信端末が必要になる。
- 書き込み時に専用の書き方が必要
- 起動メッセージやクラッシュエラー時のメッセージが見れない

## 自作のシリアルモニターソフトを作る
ESP-LINKの方式で
ESP-LINKの変わりのソフトとして自分でロガー書くのもよいかと思いました。
クラウドに転送したりすると便利かも。
timestampも表示できて便利そう。

## その他検討,失敗メモ

### 既存PGのSerialの挙動を変更できないか?
ロガーを自作した場合に既存PGをいじらずにSerial記述のままで出力できたら便利かと思い調査しました。

https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/HardwareSerial.h#L100
で定義済みのSerialをなくせそうなので、これを使って互換のSPIFFSLoggerなSerialを定義すればよさそう?
と思いましたが
`#define NO_GLOBAL_SERIAL 1`
してもSerialは定義されたままでした。
defineする前にarduino系のheaderが自動でincludeしている？
深くは追っていません。

### ESP32側のUSB出力をそのままgpioで入力できないか？
USBコネクタ作って繋いでみましたが無理でした。恐らくUART→USB変換されているためUSBを読むようなコードが必要になりそうです。

失敗図
![IMG_20190326_004023.jpg](https://qiita-image-store.s3.amazonaws.com/0/132679/2f8f351f-b781-2aba-1790-0cee5518cad5.jpeg)