前回は3軸ジャイロセンサーを使用してみました。
今回はBluetooth通信を試してみましょう。
Bluetoothについて
Bluetoothは、短距離無線通信規格です。Bluetoothには、Bluetooth Low Energy (BLE) と Bluetooth Classicという2つの種類があります。Bluetoothデバイスは、一方がマスターモード、もう一方がスレーブモードで動作することによって、相互にデータ通信を行うことができます。データ通信を行う際には、マスターモードのBluetoothデバイスが周辺のスレーブデバイスを検索し、選択して接続を確立します。接続が確立された後、データの送受信を行うことができます。スマートフォンとESP32-S3がデータを交換する場合、スマートフォンがマスターモード、ESP32-S3がスレーブモードとなるのが一般的です。
マスターモード
このモードでは、マスターデバイスが主体的に動作し、周辺のスレーブデバイスを検索します。検索したスレーブデバイスを選択し、接続することができます。マスターモードで接続リクエストを発信するには、接続したいデバイスのアドレスとペアリングパスキーなどの情報が必要です。ペアリングが完了すると、選択したデバイスと直接接続することができます。
スレーブモード
スレーブモードのBluetoothモジュールは、ホストコンピュータからの接続要求を受け付けることしかできません。自ら接続要求を発信することはできません。ホストデバイスと接続した後、ホストデバイスとデータの送受信をすることができます。
アプリのインストール
シリアルBluetoothがスマートフォンにインストールできない場合、LightBlueを試してみてください。
LightBlueがスマートフォンにインストールされていない場合は、以下のリンクからダウンロードできます。
コード
/**********************************************************************
Filename : BLE_USART
Description : Esp32 communicates with the phone by BLE and sends incoming data via a serial port
Auther : www.freenove.com
Modification: 2022/10/26
**********************************************************************/
#include "BLEDevice.h"
#include "BLEServer.h"
#include "BLEUtils.h"
#include "BLE2902.h"
#include "String.h"
BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
uint8_t txValue = 0;
long lastMsg = 0;
String rxload="Test\n";
#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxValue = pCharacteristic->getValue();
if (rxValue.length() > 0) {
rxload="";
for (int i = 0; i < rxValue.length(); i++){
rxload +=(char)rxValue[i];
}
}
}
};
void setupBLE(String BLEName){
const char *ble_name=BLEName.c_str();
BLEDevice::init(ble_name);
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(SERVICE_UUID);
pCharacteristic= pService->createCharacteristic(CHARACTERISTIC_UUID_TX,BLECharacteristic::PROPERTY_NOTIFY);
pCharacteristic->addDescriptor(new BLE2902());
BLECharacteristic *pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX,BLECharacteristic::PROPERTY_WRITE);
pCharacteristic->setCallbacks(new MyCallbacks());
pService->start();
pServer->getAdvertising()->start();
Serial.println("Waiting a client connection to notify...");
}
void setup() {
Serial.begin(115200);
setupBLE("ESP32S3_Bluetooth");
}
void loop() {
long now = millis();
if (now - lastMsg > 100) {
if (deviceConnected&&rxload.length()>0) {
Serial.println(rxload);
rxload="";
}
if(Serial.available()>0){
String str=Serial.readString();
const char *newValue=str.c_str();
pCharacteristic->setValue(newValue);
pCharacteristic->notify();
}
lastMsg = now;
}
}
コードの大半は『お作法』という感じですので、守破離の守ということで分からなくても受け入れましょう。コードを追いかけるポイントはシリアルモニターに入出力している箇所ですね。個々さえ分かれば応用できます。
動作確認
まずはプログラムをESP32-S3にアップロードしましょう。
アップロードしたらシリアルモニターを開いておきましょう。
ボーレートはいつも通り115200です。
スマートフォンのBluetoothをオンにしてください。そして、先程インストールしたLightBlueを実行します。
スキャンページで、スマートフォンが検索するBluetoothの名前を更新するには、画面を下方向にスワイプします。
「ESP32S3_Bluetooth」をタップします。
「Receive」の吹き出しが指し示している箇所をタップします。
※Notifyとなっている番号のところをタップします。
「Data format」の右にあるボックスで、『UTF-8 String』を選択します。
迷わずuft8-Stringを選択してください。文字列データで良いです。選択したらSUBSCRIBEボタンをタップしてください。
パソコン上のシリアルモニターに戻ります。
「送信」の左側にある境界線に好きな文字『Hello World!』を入力し、「送信」ボタンをクリックします。
プログラムの世界では最初に出力するのはHello World!と決まっています。この感覚を身に着けないとプログラマーとは言えません(笑)
するとスマホ側にデータが届いたでしょうか?
同様に、スマートフォンでも「送信」を選択できます。「データ形式」を設定し、「送信」ボックスに任意の文字を入力して、「書き込み」をクリックして送信します。
※先程はNotifyを選択しましたが、今回はWritableの方を選択してください。
シリアルモニターに届けば成功です。
プログラムの大半は
次回はBluetoothを使用してスマホからLEDを制御してみましょう!
コメント