ESP-WROOM-32(Arduino IDE使用)とBlueJellyでBLE再挑戦

#BLEが簡単にできそうだ。
クラシックBluetoothのSPPはAndroidと通信した経験はあったので、BLEもできるはず、早速やってみよう！
と1年半近く前に思い立ったのですが、わけわからんヨコモジばかりで、BLE挑戦は１年近くほったからしに。。。

しかし、今回、BLEに再挑戦して、まだ簡単なことしか出来ていませんが、通信できてうれしかったので、とりあえず書いちゃいました。

BLEについて私のようによくわからない人は、BlueJellyのサイトの[開発視点の超簡単BLE入門](http://jellyware.jp/kurage/bluejelly/ble_guide.html)よんで見てください。私もこれでやっとBLE特有のヨコモジについて少し理解できたという感じです。

# BlueJellyについて
*ESP32用に修正したサンプルコードは、https://i386koba.github.io/CelluCon.BlueJelly/org/read.html から実行できます。（Windowsは動きません（後述））*　

最近、BlueJellyというJavaScriptでサクッとお手軽に開発できちゃうライブラリがあるのを
[HTMLとJavaScriptだけでBLE通信できるのか？](https://qiita.com/ElectricBaka/items/0a319be20874a6817ed0)というので知りました。

BlueJellyについて詳しくは [BlueJellyって何だよ！]
(http://jellyware.jp/kurage/bluejelly/getting_started.html)を見てください。

![alt](https://github.com/i386koba/CelluCon.BlueJelly/blob/master/docs/img/read.html-1.jpg?raw=true)

上記のようにサンプルのJavascriptをちょこっとなおしてESP32と通信できました。

基本的にはread.htmlのサンプルプログラムの50行目のSSIDの表記を

`//UUIDの設定
  ble.setUUID("UUID1", "4fafc201-1fb5-459e-8fcc-c5c9c331914b", "beb5483e-36e1-4688-b7f5-ea07361b26a8");`

のように、ESP32のサンプルプログラムに書かれてるサービス、キャラスティック UUID のdefine文 

`#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"`
`#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"`

にあわせて変更します。

また、read.htmlのサンプルプログラムの79行目の　`value = data.getInt16(0);`
を ESP32のサンプルプログラムで`pCharacteristic->setValue()`で使える型`uint8_t`に合わせて
`value = data.getInt8(0);`　にします。

修正したソースは[CelluCon.BlueJelly](https://github.com/i386koba/CelluCon.BlueJelly/blob/master/docs/org/read.html)にあります。
修正したコードを、https://i386koba.github.io/CelluCon.BlueJelly/org/read.html から実行できます。　

しかし、対応OSは以下の通りで、iOSとWindowsは非対応 (2017年10月現在)、ブラウザは必ずChromeを使用してください。とのことです。
・Mac (OS X Yosemite以降)
・Android (Android 6.0 Marshmallow以降)
・Linux (Kernel 3.19以上 かつ BlueZ 5.41以上)
・Chrome OS
詳細は https://github.com/WebBluetoothCG/web-bluetooth/blob/master/implementation-status.md

わたしは、Android7.1.1のF-03Hで確認しました。
もう一つ、Pentium M の極古ノートThinkPadX41 に　BTのUSBドングル BSBT4D09BK と Cromium OS　60.0.3112 32ビットでも確認しました。Chrome が32ビットをサポートしなくなったので、これももう寿命でしょう。

#Arduino IDEでESP32 BLE
こちらも最近 [Arduino IDEでESP32 BLEライブラリを導入](https://qiita.com/tomorrow56/items/afa06e206eec9fafcc7a)というものを知って、ESP32-BLEサンプルのスケッチをチョコと変えてみたら…できました。Arduino IDEの設定は上記記事を参照してください。
![alt](https://github.com/i386koba/CelluCon.BlueJelly/blob/master/docs/img/ble-server.jpg?raw=true)
使用するサンプルスケッチは「スケッチ例」「ESP32 BLE Arduino」「BLE_Server」です。
とりあえずこれをESP32に書き込むと[BlueJelly-ESP32修正read.html](https://i386koba.github.io/CelluCon.BlueJelly/org/read.html) からデータを読みに行けます。
read.htmlで「72」と表示されるかと思います。
サンプルの BLE_Server の　29行目にある
`pCharacteristic->setValue("Hello World says Neil");` の最初の文字「 H 」のアスキーコード0x48 (72)が表示されています。

これだけでは面白くないので、https://github.com/i386koba/CelluCon.BlueJelly/blob/master/ESP32BLE/BLE_server1.ino
のように　loop()で`pCharacteristic->setValue(&txValue, 1);` として数値をインクリメントして変化させて、IO2ピンでLチカさせてみました。
これをESP32に書き込んでread.htmlで「Read」ボタンを押すと、毎回数値が変化します。

出来た方、とりあえずお疲れ様でした。

Notify,write は、まだ試していません。またサンプルプログラムに「BLE_uart」の文字が！
こちらはもう少し実験して、できたら報告いたします。

#ESP32の開発ボードについて
今回一番はまったのは、私の持っているESP32の開発ボード[ESP32最小構成ボード [K-ESP32T]](http://www.aitendo.com/product/15562)があまり調子よくないことでした。
2017年2月に[ESP-WROOM-32](http://akizukidenshi.com/catalog/g/gM-11647/)を700円という安さにつられ、裸で買って、[ESP32(ESP-WROOM-32)でLチカ (WindowsでArduino IDE使用)](https://qiita.com/rukihena/items/6a904368700eb1c7d2a3) を参考にブレッドボードで試みしました。
Lチカだけで、しばらくほっといたのですが、Aitendoで[ESP32最小構成ボード [K-ESP32T]](http://www.aitendo.com/product/15562)680円(税別)をみつけまして購入し、モジュールをハンダ付けしました。

このキットはESP32がついていないので、裸のモジュールだけ勢いで買ってしまった人は、ハンダ付けすればモジュールが無駄にならなくていいです。
![alt](https://github.com/i386koba/CelluCon.BlueJelly/blob/master/docs/img/K-ESP32T.jpg?raw=true)

早速動かしてみましたが、以下2点の問題がありました。

## 問題1 自動プログラム
Arduino IDEで書き込むが「Conectinng.... 」と出て書き込み終了しない。

[DEKO のアヤシいお部屋](https://ht-deko.com/)の[ESP-WROOM-32](https://ht-deko.com/arduino/esp-wroom-32.html)で、とても詳しくESP-WROOM-32のハードウェアについて書かれていますが、そこの[手動書き込み](https://ht-deko.com/arduino/esp-wroom-32.html#04_02)のようにボタンを押せば、とりあえず書き込みできたりします。

しかし、書き込み時のモード変更とリセットを勝手にやってくれる[自動プログラム回路](https://ht-deko.com/arduino/esp-wroom-32.html#24)用のトランジスタのようなものが[K-ESP32T]基板に乗っていますので、自動で書き込みしてくれれば、とても楽なんですが..

これは、[自動プログラム回路](https://ht-deko.com/arduino/esp-wroom-32.html#24)にありますように、Windows で USB<->シリアル変換に CP2102 を使う場合には EN <-> GND 間にもっと大きな 0.22μF～2.2μF のコンデンサを入れてください。とのこと。
ESP32最小構成ボード [K-ESP32T]もUSB<->シリアル変換に CP2102 を使っていますので、基板の「RST」スイッチの両端のランドに1uFのセラコン（上記写真の青い物)をハンダ付けしましたら、Lチカスケッチを自動書き込みできました。

## 問題2 Brownout detector was triggered
BLEのサンプルスケッチを書き込むとシリアルモニタに「Brownout detector was triggered」と出て、setup()をループする。

Brownout とは　電圧低下らしいです。LチカスケッチではBrownoutは出ませんでしたが、BLEのスケッチで
`BLEDevice::init("MyESP32");`
とBLE機能を有効にしたとたんにBrownoutしている模様です。

BLEを使うときは、USBからの5V電源では容量不足かと、USBのVbus外して外部から5V-1Aを加えてみたり、5VとGNDで100uFの電解コン付けたりしましたが、シリアルモニタに「OK,OK,OK... 」と何がOKか知らないか、繰り返しOKが出る状態になってしまいました。

そこで、3.3Vの方を疑って、5V-3.3Vのレギュレーターを見てみると「LG33」との表記。
3.3V-500mA の MIC5219 LDOレギュレータ―のようです。
![MIC5219.jpg](https://qiita-image-store.s3.amazonaws.com/0/131506/617c209f-9c7c-4a81-9a98-c01ffac90ec9.jpeg)
データシートを見ると、レギュレータ―5ピンが3.3V出力のようで、2.2uFタンタルと書いてありますが[K-ESP32T]基板では、タンタルぽくない、あやしいチップコンにつながっている。
手元にタンタルコンがないので、チップコンの両端に電解コン47uF-10Vをレギュレータ―5ピン側を+でハンダ付けしてみたら、元からあった、あやしいチップコンが割れてしまいました。
なので、チップコンをハンダを溶かして取ってしまい、レギュレータ―5ピンと「KEY」ボタンのGNDに電解コンをハンダ付けしました。
そうすると、Brownoutせずに動きました。(何の保証もないですが）

無理してこんなとこにコンデンサを付けなくても、ヘッダピン用の3.3V とGND のスルーホールにハンダ付けしても同じとおもいます。

また、細くて長いUSBケーブルや、USBポートによってはBrownoutして、USBケーブルを太くて短いものにしてUSBポートの差し込み場所を変えたりすると動く場合もあります。

ちなみに秋月の[ESP32-DevKitC](http://akizukidenshi.com/catalog/g/gM-11819/)のレギュレーターNCP1117は1000mAとのことでBrownoutの問題ないのでしょうか？USB2.0では500mAしかないけど。

[追記]
電源についてもう少し調べていましたら、[ESP-WROOM-32 ( ESP32 ) の保護機能付き電源強化対策の実験](https://www.mgo-tec.com/blog-entry-esp-wroom-32-power-switch.html)や
[ESP-WROOM-32を使ってみる2 -そんな電源で本当に大丈夫か-](http://nemuisan.blog.bai.ne.jp/?eid=220875)のように、ESP32は突入電流対策が必要で、開発ボードのデフォのレギュレーターでUSB2.0で動かすのは大変なようです。
レギュレーターはADP3338に交換やLT1963Aの回路を作るように変更したほうがいいようですが、

## Aitendo ESP32最小構成ボード [K-ESP32T]について
調べてみましたら、[macsbug](https://macsbug.wordpress.com/)ブログに[The cheapest ESP32 Development Board](https://macsbug.wordpress.com/2017/03/06/the-cheapest-esp32-development-board/)という記事でESP32最小構成ボード [K-ESP32T]らしきものが詳しく説明してありました。
[K-ESP32T] の元は[HIMALAYA ESP32 Dev Board](https://eckstein-shop.de/HIMALAYA-ESP32-Dev-Board-WiFi-Bluetooth-CP2102-USB-to-Serial-mit-LiPo-charger-Anschluss)の様で、こちらはリチウム充電回路がありますが、そのほかは同じなようです。

#BLE再挑戦までの経緯
BLEを始めてみたが、うまくいかなかった経緯を書いてみました。

最初に、2016年7月にBLEモジュール[RN4020](http://akizukidenshi.com/catalog/g/gM-10066/)を買ってみたはものの、BLEを全く理解していおらず、「BLEってBluetoothローエナジーだから、クラシックBluetoothの省電力版なんでしょ？」と簡単に考えていたのですが、BLEではSPP的なことは簡単にはできないとわかり、さらに、わけわからんヨコモジばかりで…
2016年の時は[RN4020 を操作しよう](http://toragi.cqpub.co.jp/Portals/0/support/junior/download/2016/10_aut/RN4020_howtouse.pdf)を参考にしてAndroid の BLE Scanner というアプリで一応 RN4020 が動いていることは確認はできました。

これでわかったことは、BLEのキャラクタリスティックと言われるものはデータは最大20バイトまで設定可能ということ。

つまりBLEは、
・データ値などを間欠的にやり取りするのがBLEの本懐、
・SPPのような文字列の通信するには向いてない。
つう、たぶんBLEやってる人からしたら当たり前のことがやっと理解しました。

ただ、RN4020 は MLDP 機能というのでSPPみたいなこともできるとのこと、Microchip 公式のアプリとか入れてみましたが、うまく行かず諦めました。

2017年2月に[ESP-WROOM-32](http://akizukidenshi.com/catalog/g/gM-11647/)をBLE付きで700円、しかもArduinoIDEでプログラムできるんか！と買ってはみたものの、BLEのスケッチはどうやってやるのかさっぱりわからず…

という、へなちょこな感じで一年近くほったらかし状態だったのですが、いろいろな先駆者の方々のおかげで、何とかできました。次はもう少し高度な実験をしてみたいと思います。