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 使用環境
- Windows 10 64-bit
- Arduino IDE 1.8.13
- M5Stack Gray ESP32-D0WDQ6-V3 (revision 3)
MPU6886 + BMM150 16MB 40MHz
- AndroidスマホのBlurtooth serial terminalアプリ
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アプリとの間で双方向通信を確認しました。