#BLEが簡単にできそうだ。
クラシックBluetoothのSPPはAndroidと通信した経験はあったので、BLEもできるはず、早速やってみよう!
と1年半近く前に思い立ったのですが、わけわからんヨコモジばかりで、BLE挑戦は1年近くほったからしに。。。
しかし、今回、BLEに再挑戦して、まだ簡単なことしか出来ていませんが、通信できてうれしかったので、とりあえず書いちゃいました。
BLEについて私のようによくわからない人は、BlueJellyのサイトの開発視点の超簡単BLE入門よんで見てください。私もこれでやっとBLE特有のヨコモジについて少し理解できたという感じです。
BlueJellyについて
ESP32用に修正したサンプルコードは、https://i386koba.github.io/CelluCon.BlueJelly/org/read.html から実行できます。(Windowsは動きません(後述))
最近、BlueJellyというJavaScriptでサクッとお手軽に開発できちゃうライブラリがあるのを
HTMLとJavaScriptだけでBLE通信できるのか?というので知りました。
BlueJellyについて詳しくは [BlueJellyって何だよ!]
(http://jellyware.jp/kurage/bluejelly/getting_started.html)を見てください。
上記のようにサンプルの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://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ライブラリを導入というものを知って、ESP32-BLEサンプルのスケッチをチョコと変えてみたら…できました。Arduino IDEの設定は上記記事を参照してください。
使用するサンプルスケッチは「スケッチ例」「ESP32 BLE Arduino」「BLE_Server」です。
とりあえずこれをESP32に書き込むとBlueJelly-ESP32修正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]があまり調子よくないことでした。
2017年2月にESP-WROOM-32を700円という安さにつられ、裸で買って、ESP32(ESP-WROOM-32)でLチカ (WindowsでArduino IDE使用) を参考にブレッドボードで試みしました。
Lチカだけで、しばらくほっといたのですが、AitendoでESP32最小構成ボード [K-ESP32T]680円(税別)をみつけまして購入し、モジュールをハンダ付けしました。
このキットはESP32がついていないので、裸のモジュールだけ勢いで買ってしまった人は、ハンダ付けすればモジュールが無駄にならなくていいです。
早速動かしてみましたが、以下2点の問題がありました。
問題1 自動プログラム
Arduino IDEで書き込むが「Conectinng.... 」と出て書き込み終了しない。
DEKO のアヤシいお部屋のESP-WROOM-32で、とても詳しくESP-WROOM-32のハードウェアについて書かれていますが、そこの手動書き込みのようにボタンを押せば、とりあえず書き込みできたりします。
しかし、書き込み時のモード変更とリセットを勝手にやってくれる自動プログラム回路用のトランジスタのようなものが[K-ESP32T]基板に乗っていますので、自動で書き込みしてくれれば、とても楽なんですが..
これは、自動プログラム回路にありますように、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レギュレータ―のようです。
データシートを見ると、レギュレータ―5ピンが3.3V出力のようで、2.2uFタンタルと書いてありますが[K-ESP32T]基板では、タンタルぽくない、あやしいチップコンにつながっている。
手元にタンタルコンがないので、チップコンの両端に電解コン47uF-10Vをレギュレータ―5ピン側を+でハンダ付けしてみたら、元からあった、あやしいチップコンが割れてしまいました。
なので、チップコンをハンダを溶かして取ってしまい、レギュレータ―5ピンと「KEY」ボタンのGNDに電解コンをハンダ付けしました。
そうすると、Brownoutせずに動きました。(何の保証もないですが)
無理してこんなとこにコンデンサを付けなくても、ヘッダピン用の3.3V とGND のスルーホールにハンダ付けしても同じとおもいます。
また、細くて長いUSBケーブルや、USBポートによってはBrownoutして、USBケーブルを太くて短いものにしてUSBポートの差し込み場所を変えたりすると動く場合もあります。
ちなみに秋月のESP32-DevKitCのレギュレーターNCP1117は1000mAとのことでBrownoutの問題ないのでしょうか?USB2.0では500mAしかないけど。
[追記]
電源についてもう少し調べていましたら、ESP-WROOM-32 ( ESP32 ) の保護機能付き電源強化対策の実験や
ESP-WROOM-32を使ってみる2 -そんな電源で本当に大丈夫か-のように、ESP32は突入電流対策が必要で、開発ボードのデフォのレギュレーターでUSB2.0で動かすのは大変なようです。
レギュレーターはADP3338に交換やLT1963Aの回路を作るように変更したほうがいいようですが、
Aitendo ESP32最小構成ボード [K-ESP32T]について
調べてみましたら、macsbugブログにThe cheapest ESP32 Development Boardという記事でESP32最小構成ボード [K-ESP32T]らしきものが詳しく説明してありました。
[K-ESP32T] の元はHIMALAYA ESP32 Dev Boardの様で、こちらはリチウム充電回路がありますが、そのほかは同じなようです。
#BLE再挑戦までの経緯
BLEを始めてみたが、うまくいかなかった経緯を書いてみました。
最初に、2016年7月にBLEモジュールRN4020を買ってみたはものの、BLEを全く理解していおらず、「BLEってBluetoothローエナジーだから、クラシックBluetoothの省電力版なんでしょ?」と簡単に考えていたのですが、BLEではSPP的なことは簡単にはできないとわかり、さらに、わけわからんヨコモジばかりで…
2016年の時はRN4020 を操作しようを参考にしてAndroid の BLE Scanner というアプリで一応 RN4020 が動いていることは確認はできました。
これでわかったことは、BLEのキャラクタリスティックと言われるものはデータは最大20バイトまで設定可能ということ。
つまりBLEは、
・データ値などを間欠的にやり取りするのがBLEの本懐、
・SPPのような文字列の通信するには向いてない。
つう、たぶんBLEやってる人からしたら当たり前のことがやっと理解しました。
ただ、RN4020 は MLDP 機能というのでSPPみたいなこともできるとのこと、Microchip 公式のアプリとか入れてみましたが、うまく行かず諦めました。
2017年2月にESP-WROOM-32をBLE付きで700円、しかもArduinoIDEでプログラムできるんか!と買ってはみたものの、BLEのスケッチはどうやってやるのかさっぱりわからず…
という、へなちょこな感じで一年近くほったらかし状態だったのですが、いろいろな先駆者の方々のおかげで、何とかできました。次はもう少し高度な実験をしてみたいと思います。