Project 27.1 はじめてのBluetooth通信/Bluetooth Low Energy Data Passthrough

前回は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を制御してみましょう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

金重総合研究所の主席研究員。
子供の頃から研究者を目指し、ライフワークとして日々様々な研究をしています。
経営・マネジメント・金融・DXあたりが本職です。
私を採用したい人、私と一緒に働きたい人、一緒に知識を肥やしていきたい人はぜひお声がけ下さい。

コメント

コメントする

目次