M5StackGray Bluetooth Classic でスマホと通信

2021.7.4 Coskx Lab  

1 はじめに

M5StackGray Bluetooth Classic でAndroidスマホと通信します。 Blurtooth通信はClassicとBLE(Bluetooth Low Energy)がありますが,ここではスマホのBlurtooth serial terminalアプリと通信したいために,設定が簡単なBluetooth Classicを使います。

2 使用環境

3 スマホのBlurtooth serial terminalアプリと通信するM5Stack側のプログラム

スマホのBlurtooth serial terminalアプリでは送信時に文字列終端にLF.CR等のキャラクタを送信するように設定できますが,どちらにでも対応できます。
M5Stackのボタンを押すとスマホ側にボタン名を送信します。CR+LFのキャラクタを付加します。
初期化 SerialBT.begin("M5Stack"); //Bluetooth device name
文字列受信 String chkgetSerialBT();
文字列送信 SerialBT.println("xxxxxxxxx");

//BT04.ino//

#include <M5Stack.h>
#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

//BluetoothSerialをチェックし,文字列が来ていたら文字列を返す。そうでなかったら""を返す
//文字列の終端はCRまたはLF
String chkgetSerialBT() {
  static char buff[128];
  static int i=0;
  String result="";
  boolean done = false;
  while (!done && SerialBT.available()) {
    char c=(char)SerialBT.read();
    //M5.Lcd.printf("%c!",c);
    switch (c) {
     case '\n':
     case '\r':
      buff[i]=0;
      i=0;
      done =true;
      break;
     default:
      buff[i++]=c;
      if (i==127) {
        buff[i]=0;
        i=0;
        done =true;
      }
      break;
    }
  }
  if (done) {
    //M5.Lcd.println(buff);
    String str((char*)buff);
    result = str;
  }
  return result;
}

void setup() {
  SerialBT.begin("M5Stack"); //Bluetooth device name   
  M5.begin();
  M5.Power.begin();
  M5.Lcd.setTextSize(2);
  M5.Lcd.print("Serial Bluetooth started.\n");
  M5.Lcd.print("DeviceName : M5Stack\n");
  M5.Lcd.println("The device started!");
}

boolean APressed = false;   
boolean BPressed = false;   
boolean CPressed = false;   

void loop() {
  String str = chkgetSerialBT();
  if (str != "") M5.Lcd.println(str);
  
  M5.update();   // update button state
  if (M5.BtnA.pressedFor(50)) APressed = true;
  if (M5.BtnB.pressedFor(50)) BPressed = true;
  if (M5.BtnC.pressedFor(50)) CPressed = true;
  if(APressed && M5.BtnA.wasReleased()) {
     SerialBT.println("Key A");
     M5.Speaker.tone(440, 200); //Peett
     APressed = false;
  }
  if(BPressed && M5.BtnB.wasReleased()) {
     SerialBT.println("Key B");
     M5.Speaker.tone(880, 200); //Peett
     CPressed = false;
  }
  if(CPressed && M5.BtnC.wasReleased()) {
     SerialBT.println("Key C");
     M5.Speaker.tone(1760, 200); //Peett
     CPressed = false;
  }
}

4 通信確認

Androidスマホ側では,Blurtooth serial terminalアプリ「Serial Bluetooth Terminal」を使っています。


手順1 M5Stack側は,プログラムを起動しておきます。
手順2 Androidスマホの設定を開いて,Bluetooth設定をONにして,新しいBluetoothデバイスの検索を始めます。
手順3 プログラム中で設定した「M5Stack」というBluetooth機器が見つかりますので,これを選択します。(ペアリング完了)
手順4 androidスマホのBlurtooth serial terminalアプリ「Serial Bluetooth Terminal」を起動します
手順5 アプリの左上3本線メニューからsettingsを選びreceiveとsendの行端(newline)をCRに設定します。その他の設定は好みで。
手順6 アプリの左上3本線メニューからdeviceでBluetooth Classicを選ぶと「M5Stack」が見えるので,選択してください。
手順7 双方向通信を確認できます。

androidスマホのBlurtooth serial terminalアプリ「BT Terminal FREE」でも双方向通信を確認しました。アプリの送信オプションで文字列終端にCRを付けました。
文字列終端キャラクタを送信しないアプリでは動作できません。


5 スマホからのBlurtoothを通じてコマンドを受け取るM5Stack側のプログラム

スマホからのBlurtoothを通じてコマンドを受け取りM5Stackが何らかの作業を行うためのひな型プログラムです。
ロボットのリモコン操作などに使えます。
ここではコマンド文字列として,"tone1","tone2","tone3"を受け取り,それぞれのtoneを鳴らします。

//BT04Tone.ino//

//BT経由command
// "tone1", "tone2", "tone3" のどれかを与えるとtoneが鳴る

#include <M5Stack.h>
#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

//BluetoothSerialをチェックし,文字列が来ていたら文字列を返す。そうでなかったら""を返す
//文字列の終端はCRまたはLF
String chkgetSerialBT() {
  static char buff[128];
  static int i=0;
  String result="";
  boolean done = false;
  while (!done && SerialBT.available()) {
    char c=(char)SerialBT.read();
    //M5.Lcd.printf("%c!",c);
    switch (c) {
     case '\n':
     case '\r':
      buff[i]=0;
      i=0;
      done =true;
      break;
     default:
      buff[i++]=c;
      if (i==127) {
        buff[i]=0;
        i=0;
        done =true;
      }
      break;
    }
  }
  if (done) {
    //M5.Lcd.println(buff);
    String str((char*)buff);
    result = str;
  }
  return result;
}

void setup() {
  SerialBT.begin("M5Stack"); //Bluetooth device name   
  M5.begin();
  M5.Power.begin();
  M5.Lcd.setTextSize(2);
  M5.Lcd.print("Tone Generation with BT\n");
  M5.Lcd.print("Serial Bluetooth started.\n");
  M5.Lcd.print("DeviceName : M5Stack\n");
  M5.Lcd.println("The device started!");
}

void loop() {
  String command = chkgetSerialBT();
  if (command != "") {
    M5.Lcd.setCursor(0, 64);
    M5.Lcd.printf("command = %s  ",command);
  }
  
  M5.update();
  if(command == "tone1") {
     M5.Speaker.tone(440, 200); //Peett
  }
  if(command == "tone2") {
     M5.Speaker.tone(880, 200); //Peett
  }
  if(command == "tone3") {
     M5.Speaker.tone(1760, 200); //Peett
  }
}

6 動作確認

Androidスマホ側では,Blurtooth serial terminalアプリ「Serial Bluetooth Terminal」を使っています。


手順1から6までは「4」と同じです。 手順1 M5Stack側は,プログラムを起動しておきます。
手順2 Androidスマホの設定を開いて,Bluetooth設定をONにして,新しいBluetoothデバイスの検索を始めます。
手順3 プログラム中で設定した「M5Stack」というBluetooth機器が見つかりますので,これを選択します。(ペアリング完了)
手順4 androidスマホのBlurtooth serial terminalアプリ「Serial Bluetooth Terminal 1.35」を起動します
手順5 アプリの左上3本線メニューからsettingsを選びreceiveとsendの行端(newline)をCRに設定します。その他の設定は好みで。
手順6 アプリの左上3本線メニューからdeviceでBluetooth Classicを選ぶと「M5Stack」が見えるので,選択してください。
手順7 「Blurtooth serial terminalアプリ」から文字列でコマンド送信(例えばtone1)し,M5Stack側では意図通りのtoneを発生します。

このアプリではボタンのマクロ設定により,ボタン1つで必要な文字列を送信することが出来ます。


7 まとめ

スマホのBlurtooth serial terminalアプリとの間で双方向通信を確認しました。