ESP32-WROOM-32EでMicroPythonを使い開発(BLE編3)

〔マイコンのトップに戻る〕
[準備編] [module編] [GPIO編] [通信編] [I2S編] [WiFi編] [BLE編1] [BLE編2]   [色々編]


 前回は、ESP32の"Bluetooth"を動作せる為の基礎仕様を簡単に記述して置きました。
ここでは、セントラル機器をESP32とし、ペリフェラル側をRN4020で実験を行います。
ESP32側のスクリプトは、githubのこちらに在る[examples]の[bluetooth]サンプルを利用します。
1つは、"ble_temperature_central.py"を改造して、"ble_battery_central.py"と改めて
RN4020の"バッテリサービス"を受けるデバイスとしました。
もう1つは、"ble_simple_central.py"を改造して、"ble_uart_central.py"と改めて
RN4020のプライベート サービスで"UART通信サービス"を受けるデバイスとしました。
それと、"ble_observer_central.py"これは、オブザーバーを行うセントラルデバイスです。
この"ble_xxxxx_central.py"の3つのファイルには、"ble_advertising.py"が必要です

《ダウンロードについて》

 ↓ここから、このページで使用したESP32側の全スクリプトファイルはダウンロード出来ます。
[ESP32_BLE3sample.zip]

《バッテリ サービス》

 RN4020側のペリフェラル動作はこちらのページと同じ物です、セントラル側をPCからESP32へ変更
した物がここのページ記事です。
尚、RN4020とPC側のターミナルエミュレーター(TeraTerm)との接続は、こちらを参照しましょう。
バッテリサービスは、BLE機器の電池残量を確認する為のサービスで、下記の様にコマンドを入力します。
(その他の主なコマンドはこちらか、又は、モジュールユーザガイドを参照しましょう)

TeraTerm(BatteryService操作)
黄色い網掛け部分が入力ヶ所で、他はデバイスの応答です。
"ERR"が返されたら入力間違いでしょう、入力にはスペースは入れません
この設定は、モジュール内蔵の不揮発性メモリ(NVM)に保存されます。
なのでぇ、次回モジュールを起動させる場合はこの入力は必要なく立ち上がります。

ESP32側操作

@ "ble_advertising.py"ファイルを"PyCharm(MicroPythonエディター)"の
  プロジェクトディレクトリ(ここでは"esp32Test"を作成している)へコピーします。
  ("ble_advertising.py"がESP32へ書き込まれているならこの操作は必要ありません)
A ESP32-WROOM-32EボードをUSBでPCに繋ぎます。
B "PyCharm"を起動させ、作成してあるプロジェクトを開きましょう。
  こちらのCを操作する必要が有ります。(起動時最初のみ設定)
C "main.py"を新規登録して"ble_battery_central.py"のコードを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
D デバイス名"RNF0A9 (私のRN4020時)"が記述して有ります、自分の物に合わせて書換えましょう。
  (RN4020の"D"コマンドで表示("Name")されるので確認できます)
E ESP32-WROOM-32Eに書き込みます
  ・左側プロジェクトウインドウから"ble_advertising.py"の文字を右クリックをして、
   [実行(U)'Flash ble_advertising.py']をクリックします。
  ・左側プロジェクトウインドウから"main.py"の文字を右クリックをして、
   [実行(U)'Flash main.py']をクリックします。
F 書き込めたら"REPL"を起動しましょう。
  メニューバーから[ツール]->[MicroPython]->[MicroPython REPL]と順番にクリックし起動します。
  ">>>"が表示されたら、[CTRL]+[D]キーを押します (尚、[CTRL]+[C]はプログラム停止です)。

REPL起動時の画面(バッテリサービス)
"バッテリサービス"をスキャンし、サービスとキャラクタリスティックの問い合わせ
そして接続を行い、3秒毎の属性読み込み(read)を行います。
ですがぁペリフェラル側からは何も書き込んでいないのでぇ0%のままです。

ESP32(read)←RN4020

 ESP32セントラル側は、接続したら約3秒毎にペリフェラル側の属性(キャラクタリスティック)から
繰り返し読み込んでいます。

@ RN4020のペリフェラル側を書き込んでみます。

TeraTerm(read操作)
'LS’コマンドでサーバサービスとそのキャラクタリスティックをリスト表示します。
"SHW,000E,32"のハンドル番号で0x32(50%)を入力します。
"SUW,2A19,64"のUUIDで0x64(100%)を入力します。

A ESP32のREPL画面側のreadした結果表示

REPLでのread表示結果
RN4020のペリフェラル側の属性(キャラクタリスティック)をreadした内容です。

《UART通信サービス》

 RN4020側のペリフェラル動作はこちらのプライベートサービスと同じ物です、
セントラル側をPCからESP32へ変更した物がここのページ記事です。
UART通信サービスは、BLE機器でUARTの送受信を行うサービスで、下記の様にコマンドを入力します。

TeraTerm(UART通信サービス操作)
黄色い網掛け部分が入力ヶ所で、他はデバイスの応答です。
次回モジュールを起動させる場合はこの入力は必要なく立ち上がります。
尚、"PC,xx--xx,xx,05"(TX/RX)の"05"は、送受信するデータの長さ(5byte)です。

ESP32側操作

@ "ble_advertising.py"ファイルを"PyCharm(MicroPythonエディター)"の
  プロジェクトディレクトリ(ここでは"esp32Test"を作成している)へコピーします。
  ("ble_advertising.py"がESP32へ書き込まれているならこの操作は必要ありません)
A ESP32-WROOM-32EボードをUSBでPCに繋ぎます。
B "PyCharm"を起動させ、作成してあるプロジェクトを開きましょう。
  こちらのCを操作する必要が有ります。(起動時最初のみ設定)
C "main.py"を新規登録して"ble_uart_central.py"のコードを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
D デバイス名"UARTF0A9 (私のはRN4020)"が記述して有ります、自分の物に合わせて書換えます。
  (RN4020の"D"コマンドで表示("Name")されるので確認できます)
E ESP32-WROOM-32Eに書き込みます
  ・左側プロジェクトウインドウから"ble_advertising.py"の文字を右クリックをして、
   [実行(U)'Flash ble_advertising.py']をクリックします。
  ・左側プロジェクトウインドウから"main.py"の文字を右クリックをして、
   [実行(U)'Flash main.py']をクリックします。
F 書き込めたら"REPL"を起動しましょう。
  メニューバーから[ツール]->[MicroPython]->[MicroPython REPL]と順番にクリックし起動します。
  ">>>"が表示されたら、[CTRL]+[D]キーを押します (尚、[CTRL]+[C]はプログラム停止です)。

REPL起動時の画面(UART通信サービス)
"UART通信サービス"をスキャンし、サービスとキャラクタリスティックの問い合わせ
そして接続を行い、3秒毎の属性書き込み(write)を行います。
書き込むデータは、"xxx_"でxxxは0からインクリメントされる数値です。

ESP32(write)→RN4020

G ESP32側で書き込まれたデータを読んでみましょう。

TeraTerm(UART通信サービス操作)
'LS’コマンドでサーバサービスとそのキャラクタリスティックをリスト表示します。
"SHR,0011"のハンドル番号を使って読み込みます。
Fの図で赤丸の場所が読み込まれた様ですね、"2_(325F)"が表示されました。
又、"WV,0011,xxxx,の行はESP32側がwriteを行えば表示される様ですね。

ESP32←RN4020(通知:notify)

H RN4020から"notify"データ"SHW,000E,48657921"を入力してみます。

TeraTerm(notify操作)
'LS’コマンドでサーバサービスとそのキャラクタリスティックをリスト表示します。
"SHW,000E,xxx"で通知を行うのですがぁ、このままではread送信にしかなりません。
なのでぇ、notifyを開始する為の操作"SHW,000F,FFFF"が必要です、停止は"0000"です。
通常は、この"000F"ディスクリプタ(設定)のキャラクタリスティックには
セントラル側が、開始・停止の操作を行う事になっているらしいです。
因みに、開始の"FFFF"データは、実験の結果での値であり実際の値は不明です。

I ESP32側のREPL画面を見てみます

REPLの画面(通知)
"48657921(Hey!)"が表示されていますね。


《オブザーバー》

 RN4020側のペリフェラル動作はこちらのブロードキャスタと同じ物です、
セントラル側(オブザーバー)をPCからESP32へ変更した物がここのページ記事です。

@ ブロードキャスタ ロールの設定を行います、下記の様にコマンドを入力します。

TeraTerm(ブロードキャスタ操作)
黄色い網掛け部分が入力ヶ所で、他はデバイスの応答です。
注意は、ブロードキャスタの場合は、'A’コマンドで手動アドバタイズを行う事です。
次回モジュールを起動させた場合は、'N’コマンドから始めます。

'SF’コマンド
基本設定を工場出荷時に戻します。
但しパラメータの"1"は、デバイス名、デバイス情報、スクリプト、プライベート サービス等は残ります。
この情報も初期化したい場合は、パラメータを"2"とします。

'N’コマンド
このコマンドはブロードキャスタとして、アドバタイズの内容を設定する為に使います。
 N,xxxx
  xxxx:25バイト以下の16 進数値(内の先頭2バイトはベンダーIDです)
 例)N,FFFF4142434445 // FFFFがベンダーID、4142434445('ABCDE')は通知するデータ

ESP32側操作

@ "ble_advertising.py"ファイルを"PyCharm(MicroPythonエディター)"の
  プロジェクトディレクトリ(ここでは"esp32Test"を作成している)へコピーします。
  ("ble_advertising.py"がESP32へ書き込まれているならこの操作は必要ありません)
A ESP32-WROOM-32EボードをUSBでPCに繋ぎます。
B "PyCharm"を起動させ、作成してあるプロジェクトを開きましょう。
  こちらのCを操作する必要が有ります。(起動時最初のみ設定)
C "main.py"を新規登録して"ble_observer_central.py"のコードを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
D デバイスのアドレス"68:27:19:0A:F0:A9 (私の場合)"が記述して有ります、自分の物に合わせて
  書換えましょう。
  (RN4020の"D"コマンドで表示("BTA")されるので確認できます、但し、":"を付けましょう)
E ESP32-WROOM-32Eに書き込みます
  ・左側プロジェクトウインドウから"ble_advertising.py"の文字を右クリックをして、
   [実行(U)'Flash ble_advertising.py']をクリックします。
  ・左側プロジェクトウインドウから"main.py"の文字を右クリックをして、
   [実行(U)'Flash main.py']をクリックします。
F 書き込めたら"REPL"を起動しましょう。
  メニューバーから[ツール]->[MicroPython]->[MicroPython REPL]と順番にクリックし起動します。
  ">>>"が表示されたら、[CTRL]+[D]キーを押します (尚、[CTRL]+[C]はプログラム停止です)。

REPL起動時の画面(オブザーバー)
スキャンされ、ブロードキャスタ(68:27:19:0A:F0:A9)を見つけたと思います。
アドバタイズされたメッセージの内容"4142434445(ABCDE)"が表示されましたね。
又、"ABCD"と異なるメッセージを更に送りたい場合は、こちらのC項を参照しましょう。


《タグもどき》

 RN4020のスクリプトを使ってタグのデバイスもどきを作成し、携帯を持っていないので
セントラル側をESP32で行います(PCのMyツール"skBLEtool.py"でも動作可能)。
と言う記事は、こちらを参照しましょう。



[BLE編2へ] [ページ上へ] [色々編へ]


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2021 Shigehiro Kimura All Rights Reserved.