マツド・サイエンス研究所

IoTはぢめました ESP-WROOM-32 BluetoothでLEDチカ

1年以上、ブログの更新をサボっていて申し訳ない。

ESP-WROOM-32でBluetooth BLEでLEDチカに成功したので、報告する。

AndroidスマホとBLEで接続し、ESP32に付けたLEDをスマホからON/OFFコントロールできると共に、ESP32に付けたプッシュボタンのON/OFFをスマホ側からモニターできるようになった。

ESP-WROOM-32は、秋月電子でも僅か700円で売っている 240MHz デュアルコア 520kB RAM のマイコンの入った Wifi Bluetooth BLE 内蔵のモジュールである。

USBシリアルインターフェースまで付いた開発ボードが同じく秋月電子で1480円で販売しているので、半田付けの苦手な方は、こちらの方が良いかも知れない。

さて、今回の開発環境は、ハード的には 写真のようにユニバーサルボードに配線した ESP-WROOM-32 と Android 7.0、プログラム開発用として、Ubuntu 16.04 のパソコンを使っている。

なお、ESP-WROOM-32のプログラム開発環境は esp-idf 、Android のアプリ開発環境は Android Studio を使っている。WindowsやMAC その他の環境でも同様に開発できると思うが、確認を取っていないので、各自工夫をして欲しい。

ESP-WROOM-32の配線だが、ネット上に一般的にアップされているプログラム書き込み用にシリアルインターフェースを半田付け接続しただけのものだ。ただし、IO26に 5.1kΩ経由で LED に接続し、その先を GNDに落としている。

確認はしていないが、秋月電子で1480円で販売している開発ボードでも、IO26にLEDを配線したら、同様の事ができるであろう。

私が作ったプログラムだが、パッチにしている。

「patch_20170415.gz」をダウンロード

さて、まずは、ESP-WROOM-32のプログラムだが、 Ubuntu 16.04上での esp-idf 開発環境は下記を参考にして欲しい。

ubuntuからESP32にbluetooth接続して信号を送受信する方法

上記リンク先では、 esp-idf に含まれる サンプルの gatt_server のビルド方法を説明しているが、このプログラムを改良する。なお、上記リンク先と現在の esp-idf とはディレクトリ構成が異なっているので注意して欲しい。

(esp-idf は日々進歩しており、今回は 2017年4月15日 朝に git clone したesp-idfに対応しているが、いつまで使えるかは定かではない)

$ git clone --recursive https://github.com/espressif/esp-idf.git
$ patch -p1 -d esp-idf < esp32_ble_led.patch
$ cd esp-idf/examples//bluetooth/gatt_server/
$ make all

青い選択ダイアログが表示されたら、左右カーソルで「Exit」を選択し、エンター押すこと

次に、ESP-WROOM-32をUSB接続し、BOOT0ボタンを押しながら、リセットして、

$ make flash

でプログラムを書きこめる。

リセットすると、LEDが0.4秒毎に点滅する。

ここまでだと単なるLEDチカだが、次はスマホからBluetooth 経由でコントロールする。

スマホのプログラムは、Android Studio を使ったが、Android Studio のインストールの仕方は、ネット上に沢山あるので、それを参考にして欲しい。

プログラムは android-BluetoothLeGatt からを android-BluetoothLeGatt-master.zip をダウンロードして使う。

このサンプル・プログラムは古く、Android 6.0以降では動かない。そこで、私の作ったパッチは、Android6.0以降でも動くように改良し、さらにLEDのコントロール部分を入れている。

$ unzip android-BluetoothLeGatt-master.zip

$ patch -p1 -d android-BluetoothLeGatt-master < esp32_ble_led_android.patch

これを Android Studio でインポートして、「Build」「Build APK」

android-BluetoothLeGatt-master/Application/build/outputs/apk/Application-debug.apk が生成物で、これをAndroidのスマホのSDなどに入れる

スマホで、ファイル閲覧アプリで、APKをクリックして、インストールする。場合によっては「提供元不明のアプリ」のインストールを許可する必要がある

インストしたアプリ「BLE」を開くと、位置情報へのアクセスを許可する。(Android 6.0より古い場合は位置情報アクセス許可する必要は無い)

スマホで「BLE」を起動すると、スキャンモードになる。近距離で ESP-WROOM-32を動かしておくと、画面に「ESP_LED_BUTTON」と表示される。

「ESP_LED_BUTTON」をクリックすると、接続され、別画面が表示される(冒頭の写真)

一番下の「LED Control」をクリックすると「LED ON/OFF」が表示されるので、更に、これをクリックすると、ESP-WROOM-32のLEDがクリックするたびに交互に ON/OFF する。

10秒以上「LED ON/OFF」をクリックしないと、再び 0.4秒毎にLEDが点滅するモードに戻る。

下から2番目の「Push Button Sate」をクリックすると「get Push Button Sate」が表示される。これをクリックすると、ESP-WROOM-32のIO0に接続した押しボタン(いわゆるBOOTボタン、開発ボードにも付いている)が押されているかが、スマホの上の方に表示される。

ESP-WROOM-32のボタンを押すと直ぐにスマホ上の表示に反映される訳ではなく、「get Push Button Sate」を押すときにだけ、情報を取りに行くだけなので、注意して欲しい。

Androidのプログラムは、一定間隔毎にESP-WROOM-32のボタンのON/OFF情報を取りに行くように改造することもできたのだが、むしろ、余計な飾り付けをしない方がプログラミングする人の役に立つと思ったので、必要最低限のプログラムに留めた。

正直、Bluetooth BLEのプログラミングは初めてなので、BLEの流儀的に今回のプログラムが正しいか全く自信がない。

が、何かの役に立てれば、幸いである。

追記

秋月電子で1480円で販売している開発ボードでも試してみた。ブレッドボードに挿して、IO26に LED を接続し、5.1kΩ経由でGNDに落とせば、全く同じプログラムが実行できる。これなら、半田付けは要らない。

注意

ブログのコンテンツの内、「告知」など時期よって情報価値が無くなるのは除いてある。また、コンテンツに付いたコメントは書き込み者に著作権があるものと判断し、ここに持ってきていないので、コメントを見るときは、元々のブログコンテンツを参照してもらいたい。

その他、ブログ発表後、コメントなどの内容を反映するなど、内容を変更しているものもあるので、注意してほしい。