今回はBluetoothのSPPを動かしてみます。
この記事は JTAG でデバッグすることを前提にして書いています。
環境構築については こちら をご覧になってください。
投稿時の開発環境を記しておきます。
PC:
Windows10 OS
開発ボード :
ESP32-DevKitCーVE
(Soc : ESP32-D0WD-V3)
デバッガー(H/W):
FT2232D
デバッガー (S/W) :
Visual Studio Code + PlatformIO + ESP-IDF Framework
Bluetooth SPPとは
Bluetoothは無線通信技術のひとつで、こちらでの説明は省略します。
Bluetoothプロファイルという標準仕様があり、使用する機器の用途によって使われるプロファイルが定まっています。
SPPとは Serial Port Profileの略で、仮想的なシリアルポートを使って通信するプロファイルです。
UARTを制御するのだけれど、回線は無線(Bluetooth)を使うイメージで良いと思います。
プロジェクトをつくる
使っていたプロジェクトを開いていたら、File – Close Folder して閉じておきます。
その後にVSCodeからPlatformIOをOpenします。
以下の内容でプロジェクトを新規に作成します。
Name : ESP32E-bt-spp-acceptor
Board : Espressif ESP32 Dev Module
Framework : Eresspsif IoT Development Framework
Name : ESP32E の “E” は Framework (Espressif IoT Development Framework)の頭文字を示しています。
(後から見てわかるように、ESP-IDFを使うことを明示しています)
platformio.ini に以下の3行を追加して、 Ctrl + s で保存しておきます。
COM[4]の4の部分はデバイスマネージャーのポート(COMとLPT)で Silicon Labs CP210x から始まるCOMの番号を記述します。
debug_tool = minimodule
upload_port = COM[4]
monitor_speed = 115200
bluetooth SPPリファレンスとサンプル
SPPのAPIは こちら を参照してください。
サンプルプログラムは こちら を参考にしました。
PlatformIOで Eresspsif IoT Development Framework を選択したことにより、以下のローカルフォルダからも参照可能なはずです。
C:\Users\xxxxx\.platformio\packages\framework-espidf\examples\bluetooth\bluedroid\classc_bt\bt_spp_acceptor
(xxxxxは皆さまのユーザー名)
ファイルを置き換える
プロジェクトの src にある main.c をサンプルの example_spp_acceptor_demo.c に置き換えます。
追加が必要なパスの設定
platformio.iniに更に以下の3行を追加します。
(下の2行は行頭(-Iの前)にTAB を入れておきます)
build_flags=
-I C:/Users/m3925/.platformio/packages/framework-espidf/components/bt/host/bluedroid/api/include/api/
-I C:/Users/m3925/.platformio/packages/framework-espidf/components/bt/include/esp32/include/
VSCodeによるパスの設定方法がよくわからないので、この方法でしのぎました 笑
コンフィグレーション
デフォルでplatformIOが吐き出すコンフィグレーションファイルでは、bluetoothが動きません。
サンプルでは以下の設定になっているので、これに合わせてみました。
(sdkconfig.defaultsというファイル)
CONFIG_BT_ENABLED=y
CONFIG_BTDM_CTRL_MODE_BLE_ONLY=
CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=y
CONFIG_BTDM_CTRL_MODE_BTDM=
CONFIG_BT_CLASSIC_ENABLED=y
CONFIG_WIFI_ENABLED=n
CONFIG_BT_SPP_ENABLED=y
CONFIG_BT_BLE_ENABLED=n
Make menuconfigから設定すると、ややわかりにくいので、
pio/ESP32E-bt-spp-acceptorにあるsdkconfig.esp32devというファイルを直接編集しました。
(試してみたらビルドエラーがなくなったので、うまくいったようです)
おそらく = で終わっているものは =n と同じだと思います。
イニシエーターとアクセプター
Bluetoothはペアリングという作業を行い、相手を決めてから通信を行うことになっています。
ペアリング操作を行う側がイニシエーター、受け付ける側がアクセプターになります。
今回はWindowsPCからペアリングを行うので、ESP32側はアクセプターのサンプルを使いました。
ビルドしてステップ実行する
app_main()の中に if()がたくさんあります。
設定がうまくいってなかったりすると、これらのどこかで引っかかってreturnしてしまいます。
最初はステップ実行して関数が成功することを確認しておいた方が安心です。
app_main()の最後、esp_bt_gap_set_pin()までたどり着いたら無事に初期化が終わったものと考えてよいと思います。
あれ、でもwhile()ループがなくて app_main()関数が終了してしまうのでは?と思いませんでしたか?
プログラムが終了してしまうはずはないので追いかけてみると、
esp_bluedroid_init() -> btc_init() の中でスレッドを生成していることが確認できました。
正しく設定が行われていて初期化でエラーがなければF5キーを押してプログラムを動かしておくことでペアリングできるようになります。
PCからペアリングしてみる
ESP32側はデバッガーを起動しF5キーを押してプログラムを動かしておきます。
PCのステータスバーの ^ 部分を押して、左上のBluetoothアイコンをクリックし「設定を開く」を選択します。
一番上の「Bluetoothまたはその他のデバイスを追加する」を選択し、更に次の画面の一番上の赤枠部分を選択します。
おぉっ、みーつけたっ(笑)
続いて以下の画面が出るので接続ボタンを押します。(PINの値を気にする必要はありません)
以下の画面が出て、無事にペアリングができました。
この時点で Tera Term の接続を試みると、Bluetoothリンク経由の標準シリアルが2つあることが確認できます。
少々長くなりましたので、今回はこのへんで。
お疲れさまでした。
この続きは こちら からどうぞ。