プロトコルの煩雑なbleではなく、シンプルなbluetoothで接続してみます。
<環境>
・M5stack gray
・Macbook Monterey
・Python3 : mac側の動作確認用スクリプト記述
<ライブラリ>
bluetoothをあたかもシリアルのように見せるライブラリ(M5stack :
BluetoothSerial.h)とpythonでシリアルインターフェースを扱うための pyserialがあるのでそれらを使います。
・pyserialをインストールする
pip3 install pyserial
・BluetoothSerial.hのインストール
BluetoothSerial.hはM5stackのライブラリから選択、インストールできます
<main.cpp>
#include "BluetoothSerial.h"
#include <M5Stack.h>
BluetoothSerial bts;
void setup() {
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(0, 0, 2);
M5.Lcd.println("Bluetooth TEST");
bts.begin("ESP32test");
}
void loop() {
M5.Lcd.setCursor(0, 20, 2);
M5.Lcd.printf("Start Bluetooth");
bts.println("message from the M5stack");
//Serial.println("loop");
String str = bts.readString();
M5.Lcd.setCursor(0, 60, 2);
M5.Lcd.println(str);
delay(1000);
}
・シリアルポートを調べる
M5stackにコード書き込んで、シリアルポートを調べます。
% ls -l /dev/tty.*
crw-rw-rw- 1 root wheel 0x9000008 5 4 18:03 /dev/tty.ESP32test
<write.py>
該当のポート情報に上の情報を設定します。
import serial
mes = "messge from my Mac"
# initialize bt serial
m5data = serial.Serial('/dev/tty.ESP32test',115200, timeout=3)
# read from bt
line = m5data.readline()
print(line.decode()[:-2:])
# write to bt
m5data.write(mes.encode())
m5data.close()
・実行
% python write.py
b”
‘’に何も表示されないということはタイムアウトしている。
・macをリブートして、USBシリアル経由でpyserialの機能を確認してみる。
% ls -l /dev/tty.*
crw-rw-rw- 1 root wheel 0x9000008 5 5 09:39 /dev/tty.SLAB_USBtoUART
write.pyに以下のデバッグ行追加
Serial.println(“loop”);
% python write.py
b’loop\r\n’
デバッグ用にコンソールに出力させて、シリアルポート切り替えると受信できるからpyserialそのものは動いているんだろう。
じゃ、本来のbluetoothでどうなの?この時MacからESPtestのbluetoothに接続はしない。
% python write.py
b’message from the M5stack
\r\n’
ちゃんと受信できるから、どこかクリアされない状態があった?
リブートで状態がクリアされているようで、結果としてmacの設定でbluetoothの接続をしてしまうとダメ。一度接続選択すると接続選択解除してもpythonスクリプトからは使えなくなるから接続の権利(と言ってもmacに変わりはないけど)を他でキープしているようだ。
P.S ここでは接続しないと、% ls -l /dev/tty.*で見えないからダメだけど、
ここでは接続してはいけない。
読み出し文字列中のb’’はバイトストリングと言うことらしいけど、実際には必要ないからdecode()して普通の文字列に変換してやります。また書き込みの時にはencode()が必要です。
M5stackのスクショってどうすれば取れるんだろう?
bluetooth経由でデータの送受信ができるとやれることが広がります。
admin