マイコン同士のBluetooth通信

コンピュータ、組み込み

NODEMCU ESP-32Sを使ってマイコン同士のBluetooth通信を試してみます。

やること

やること

NODEMCU ESP-32S 同士でBluetooth通信をします。

パソコンのCOMからデータを受信します。
受信したデータが英文字列なら大文字/小文字の変換をしてBluetoothを使って受信側へ送信します。

Bluetoothからデータを受信した場合は、そのままCOMを使ってパソコンに送信します。
反対のパソコンからデータを送信した場合も同じ動作になります。

今回MasterとSlaveの関係があるので、それぞれに違うスケッチを書き込みます。

結果

パソコンからの通信にはTeratermを使用します。

パソコンは2台用意しそれぞれにNODEMCU ESP-32Sを接続します。
(PC-AをMaster側、PC-BをSlave側)
それぞれのパソコンでTeratermを起動します。

今回PC-AはCOM51, PC-BでもCOM51で認識されました。
入力したデータがわかるようにTeratermのローカルエコーはONにしています。

PC-AのCOM51(左側)から入力したデータ(赤枠)が、PC-BのCOM51(右側)赤枠点線のように大文字と小文字が入れ替わりました。数字は変化していません。

次にPC-BのCOM51(右側)から入力したデータ(青枠)が、PC-AのCOM50(左側)の青枠点線のように大文字と小文字が入れ替わりました。数字は変化していません。

注意
今回NODEMCU ESP-32Sを1台のPCで2枚同時にCOM認識がうまくできなかったためにパソコンを2台使って動作を確認しました。
上手く認識できた場合には1台のPCで確認することもできると思います。

使用感

配線不要でパソコンから離れた場所に設置したセンサの情報を読み取ったり、センサに指示を出したりできるので使い勝手のいい無線通信です。
Wifiルータやテザリング機器が不要であるというのも大きいと思います。

はじめは通信がうまくいかないことの原因がわからなかったり、カンコツが必要だったりします。

次回バッテリーコネクタ付きのESPを使って評価をします。

準備

用意するもの

使うMCUボード用途
NODEMCU ESP-32S 2枚USB対向通信に使用
パソコン2台それぞれのNODEMCU ESP-32Sと通信

調べること

スレーブ側のBluetoothMACアドレスを調べます。

方法1
NODEMCU ESP-32Sが自分のMACアドレスを読み出すスケッチで調べる。

方法2
NODEMCU ESP-32Sにスレーブ用のスケッチを書き込みスマートフォンなどでペアリングする。
※ペアリング時に表示される機種もありますので確認してください。

配線

マイコン同士の配線は不要です。

スケッチ

スケッチの説明

マスター/スレーブ

今回行う対向通信では、マスター側のスケッチとスレーブ側のスケッチがあります。

初めにスレーブ側のスケッチを書き込みます。
スマートフォンやBluetoothアダプタを使ってペアリングし、Bluetoothシリアル通信ができることを確認してからマスター側のスケッチを書き込むことをお勧めします。

Bluetoothペアリング、Bluetoothシリアル通信はこちらの記事で紹介しています。

マスター側のスケッチにはスレーブ側のBluetooth MACアドレスが必要です。
上記リンクの記事に載せていますので、調べてスケッチに書き込んでください。

スケッチ

/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【スケッチの説明】
NODE MCU ESP-32S 基板で使用できます。
確認をしていませんが ESP32-WROOM 搭載基板で使用できます。

Bluetooth通信のマスターとして動作します。
スレーブのMACアドレスを調べてコンパイルしてください。

パソコンからシリアル通信で受信した文字が英文字なら大文字と小文字を入れ替えてBluetoothで
スレーブに送信します。
スレーブからBluetoothで受信した文字はそのままパソコンにシリアル通信で送信します。

【ライブラリ】
esp32 > ESP32 Dev Module


【バージョン情報】
2022/9/15 : 新規
**********************************************************************/
#include "BluetoothSerial.h"

BluetoothSerial SerialBT;
bool connected;

//相手側のMACアドレス 
//※スレーブ側のMACアドレスを設定してください。
uint8_t address[6]  = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};   
void setup()
{
  Serial.begin(115200);                           //パソコンとの通信用
  SerialBT.begin("BTCOM-Transmitter", true);      //Bluetooth開始
  connected = SerialBT.connect(address);

  //接続が成功するまで待機
  if(connected) {
Serial.println("Connect OK");
  } else {
    while(!SerialBT.connected(10000)) {
Serial.println("No connect"); 
    }
  }
  
  if (SerialBT.disconnect()) {
    Serial.println("Disconnected Succesfully!");
  }

  SerialBT.connect();
}
 
void loop()
{
  char buf = 0;

  if(Serial.available() != 0)
  {
    buf = Serial.read();
    //ASCコード上で、0b1000 0000ビットが0の時、0b0111 0000 のいずれかが 1なら英文字(正確ではありません。)
    if(((buf & 0x80) != 0x80) && ((buf & 0x40) == 0x40))
    {
      //ASCコード上で 0b0010 0000 のビットを反転させることで、大文字と小文字を入れ替える。
      buf = buf ^ 0x20;
    }
    //受信側へデータを送信する。
    SerialBT.write(buf);
  }

  //<<受信側としての処理>>
  //送信側からの受信処理と、パソコンへの送信
  if(SerialBT.available() != 0)
  {
    buf = SerialBT.read();
    Serial.write(buf);
  } 
}
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【スケッチの説明】
NODE MCU ESP-32S 基板で使用できます。
確認をしていませんが ESP32-WROOM 搭載基板で使用できます。

Bluetooth通信のスレーブとして動作します。

パソコンからシリアル通信で受信した文字が英文字なら大文字と小文字を入れ替えてBluetoothで
スレーブに送信します。
スレーブからBluetoothで受信した文字はそのままパソコンにシリアル通信で送信します。

【ライブラリ】
esp32 > ESP32 Dev Module


【バージョン情報】
2022/9/15 : 新規
**********************************************************************/
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;                 //BLEオブジェクト

void setup() 
{
  Serial.begin(115200);                   //パソコンとの通信用
  SerialBT.begin("NODEMCU BT-Receiver");  //NODEMCU BT-Receiver という名前でBLE通信開始
                                          //スマートフォンなどでBLE機器の検索をすると、この名前が表示される
}

void loop()
{
  char buf = 0;

  if(Serial.available() != 0)
  {
    buf = Serial.read();
    //ASCコード上で、0b1000 0000ビットが0の時、0b0111 0000 のいずれかが 1なら英文字(正確ではありません。)
    if(((buf & 0x80) != 0x80) && ((buf & 0x40) == 0x40))
    {
      //ASCコード上で 0b0010 0000 のビットを反転させることで、大文字と小文字を入れ替える。
      buf = buf ^ 0x20;
    }
    //受信側へデータを送信する。
    SerialBT.write(buf);
  }

  //<<受信側としての処理>>
  //送信側からの受信処理と、パソコンへの送信
  if(SerialBT.available() != 0)
  {
    buf = SerialBT.read();
    Serial.write(buf);
  } 
}

関連リンク

コメント

タイトルとURLをコピーしました