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

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


 前回は、ESP32の"Bluetooth"を動作せる為の基礎仕様を簡単に記述して置きました。
ここでは、ペリフェラル機器をESP32とし、セントラル側をPCで実験を行います。
ESP32側のスクリプトは、githubのこちらに在る[examples]の[bluetooth]サンプルを使います。
PC側のツールは"skBLEtool.py(自作)"を使います、ダウンロードと使い方はこちらをご覧ください。
この"skBLEtool.py"では、pythonのbleakモジュールを使い"BLE通信"を行っています。

先ずは、Windowsの[Bluetoothとその他のデバイス]設定パネルを表示させ、Bluetoothを[ON]
しておきましょう。尚、"mpy-uart"のESP32デバイスとはペアリングはしないで下さい

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

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

《mpy-uart》

 "mpy-uart"は、UARTペリフェラル機器を示しデータの送信と受信を行うサンプルです。
ここで使う"mpy-uart"は、[bluetooth]サンプル内の"ble_simple_peripheral.py"を利用し、コードを
日本語コメントにして若干変更しています。 又このスクリプトには、ble_advertising.pyが必要です。
尚、"ble_advertising.py"は、アドバータイジングパケットを生成する為のヘルパー関数です。

ESP32の準備

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

skBLEtool操作

 ツールでESP32デバイスと通信操作中は、ツール画面の操作は出来ません。
操作が終了するまで待ちましょう。

@ ツールを起動させます。(方法はこちら)
A デバイスを検出します。
B デバイスの全サービスを調べます。
C 操作できる属性(キャラクタリスティック)を調べます。
D これでPCとESP32間で送受信可能な情報を得ました。

skBLEtoolの画面図(mpy-uart)
こんな感じぃ
選択場所のコメントは、"Nordic UART TX(notify)"が正解です。

ESP32 -> PC 通信 (通知)

@ キャラクタリスティックリストからハンドル番号"20"をクリック選択を行います。
A コンソール画面を表示させます。
  ツールのメニューバーから[表示]->[コンソール]と順番にクリックします。
B 通知(Notify)を受けられ様に"有効"操作を行います。
  ツールのメニューバーから[デバイス]->[接続]->[通知]と順番にクリックします。

コンソールの画面図(通知)
こんな感じにESP32から送られてくるデータを10秒間表示します。
10秒後に通知を"無効"にし接続を切ります(ESP32はアドバタイジングに戻ります)。
尚、10秒は変更可能です、因みにESP32からは1秒毎に3データづつ送信してきます。

PC -> ESP32通信 (write)

@ キャラクタリスティックリストからハンドル番号"23"をクリック選択を行います。
A コンソール画面を表示させます。(もう既に上の操作で表示していますね)
B コンソール画面で送信データを入力して[ENTER]キーを押します。
  ここでの例は、"ESP32 Hello!"としています。
  尚、送信後は接続が切断されます(ESP32はアドバタイジングに戻ります)。

コンソールの画面図(write)
"PyCharm"のREPL画面にも"ESP32 Hello!"と表示されていますね。
ESP32側は接続されるとデータを送り続けますが、ツール側で通知を有効にしていないので
コンソール画面には表示されません。

ATT MTU

 GATT層のパケットでペイロード部分のサイズ長さの事で、変更可能です(デフォルトは23Byte)。
pythonのbleakは、接続時に必ず"ATT MTU交換"を行う様です。
ESP32でこの交換が完了すると、"_IRQ_MTU_EXCHANGED"イベントが発生します。
ESP32でMTU値を変更するには、例えば128Byteとするとぉ。
 ble.active(True)      # bluetoothをアクティブにする
 ble.config(mtu=128)   # MTU値の変更(最大251Byte)
とするだけです、これでESP32からデータの送信は増やす事が出来ますが(128-3 Byte 書き込める)、
bleak側からwriteして見たのですがぁ...20Byteしか送れなかった。なぁ〜ぜぇ?

《mpy-temp》

 "mpy-temp"は、単純な温度センサー周辺機器を示し温度値はランダム値でダミーデータとなります。
ここで使う"mpy-temp"は、[bluetooth]サンプル内の"ble_temperature.py"を利用し、コードを
日本語コメントにしてツール側が表示できる様に若干変更しています。
又このスクリプトには、ble_advertising.pyが必要です。

ESP32の準備

@ "ble_advertising.py"ファイルはESP32-WROOM-32Eへ既に 書き込み済みですね。
A ESP32-WROOM-32EボードをUSBでPCに繋ぎます。
B "PyCharm"を起動させ、作成してあるプロジェクトを開きましょう。
  こちらのCを操作する必要が有ります。(起動時最初のみ設定)
C "main.py"を新規登録して"ble_temperature.py"のコードを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
D ESP32-WROOM-32Eに書き込みます
  ・左側プロジェクトウインドウから"main.py"の文字を右クリックをして、
   [実行(U)'Flash main.py']をクリックします。
E 書き込めたら"REPL"を起動しましょう(上記Eと同じです)。

skBLEtool操作

 上記の"skBLEtool操作"と同様に検出操作を行いましょう。

skBLEtoolの画面図(mpy-temp)
ESP32側は"indicate"通知が可能な様ですが、pythonのbleakは対応していない様です。

ESP32 -> PC 通信 (通知)

@ キャラクタリスティックリストからハンドル番号"20"をクリック選択を行います。
A コンソール画面を表示させます。
B 通知(Notify)を受けられ様に"有効"操作を行います。
  ツールのメニューバーから[デバイス]->[接続]->[通知]と順番にクリックします。

コンソールの画面図(通知)
こんな感じに表示されます。
10秒の接続期間中にESP32からは1秒毎に通知がくる様に変更しています。
又、"bleak"は整数では受信できないっぽいから、"bytearray"型で送信する様に変更しています。

ESP32 -> PC 通信 (read)

@ キャラクタリスティックリストからハンドル番号"20"をクリック選択を行います。
A コンソール画面を表示させます。
B ツールのメニューバーから[デバイス]->[接続]->[read]と順番にクリックします。
  1回だけデータを読んだ後は接続が切断されます(ESP32はアドバタイジングに戻ります)。

コンソールの画面図(read)
こんな感じに表示されます。

《mpy_sht31》

 ここで使う"mpy_sht31"は、"ble_temperature.py"を利用し、コードに湿度機能を追加した物です、
センサーは"SHT31"を使っています。使用するファイル名は"ble_sht31.py"です。
又このスクリプトには、ble_advertising.pysht31.pyが必要です(sht31.pyはここのを使用しました)。

ESP32の準備

 上記の"mpy-uart"や"mpy-temp"と同様なのでここは割愛します。
(sht31.pyもESP32に書き込んで下さい、お忘れなく)

実態配線図

実態配線図(mpy_sht31)  電源はUSB接続で、回路電源はボード出力
 3.3Vです。
 LEDはD4(GPIO4)に配線しています、
 I2CはGPIO26(SDA)/GPIO25(SCL)を
 使っています。
 ピンのプルアップ抵抗はチップ内蔵を
 使います。I2Cアドレスは"0x45"です。

 "SHT31"のピン配列は、正面側より
 [VDD][SDA][SCL][ADR][GND]
 [ADR]をGND配線でアドレスは"0x44"です

skBLEtool操作

 上記の"skBLEtool操作"と同様に検出操作を行いましょう。

skBLEtoolの画面図(mpy_sht31)

ESP32 -> PC 通信 (複数選択read)

 "通知"も可能ですが説明はまたまた割愛します、"通知"の場合は1個のみの選択操作ですが、
"read"の場合は複数選択出来ます。

@ キャラクタリスティックリストからハンドル番号"2023"をクリック選択を行います。
  尚、複数選択時は[CTRL]キーを押しながら選択しますよ、老婆心ながら。
A コンソール画面を表示させます。
B ツールのメニューバーから[デバイス]->[接続]->[read]と順番にクリックします。
  1回だけデータを読んだ後は接続が切断されます(ESP32はアドバタイジングに戻ります)。

コンソールの画面図(複数選択read)
こんな感じに表示されます。

ディープスリープ

 コードに記述の、"_DEEPSLEEP_USE"を"True"に設定する事でディープスリープモードにする事が
出来ます。
ESP32はアドバタイジングで待ち接続(read、通知後)が切断されたら3分間のスリープに入ります。
尚、サービスの検索やキャラクタリスティックの検索時は接続され検索したら切断を行うので、
その度にスリープに入るので煩わしいから検索後"True"に変更した方がお勧めです。
又、3分間を変更する場合は、"_DEEPSLEEP_UP_TIME = const(1000 * (60 * 3))"を変えます。

操作はESP32が起きている時はLEDが点灯しているのでその際に"read"しましょう。

《BroCast》

 このサンプルは、ESP32側が"SHT31"の値をブロードキャストのアドバタイジングを行うだけの物です。
使用するファイル名は"ble_broadcaster.py"です。
又、このスクリプトにはble_advertising.pysht31.pyが必要です。

ESP32の準備

 上記の"mpy-uart"や"mpy-temp"と同様なのでここは割愛します。
 回路は上図の物を使っています。

skBLEtool操作

 上記の"skBLEtool操作"と同様に検出操作を行いましょう。

skBLEtoolの画面図(BroCast)

オブザーバー

@ "検出"の操作を行って置きます。
  ブロードキャストを出している機器を選択しましょう。
A コンソール画面を表示させます。
B ツールのメニューバーから[デバイス]->[オブザーバー]と順番にクリックします。

オブザーバー操作画面図
”製造元のデータ”内容が表示されています。

ブロードキャストのアドバタイジングパケット

 アドバタイジングパケットの全体図は、こちらを参照しましょう。
"Adevertising Data"部は、[Length][AD Type][AD Data]で31byte以内なら繰り返し設定可能です。

ESP32が出している内容は
[0x08][0x09]["BroCast"] + [0x10][0xFF][ID+"25.3 'C/62.4 %"] の2個です(前側は無くても可)。
ID=0xFFFF(ベンダーのID)です。
ID前のAD Type(0xFF)は、任意の送信データ(ベンダー固有のデータ)となります(ここに自由に記述可)。
AD Type(0x09)は、デバイスの名称(完全版)となります。




[BLE編1へ] [ページ上へ] [BLE編3へ]


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