M5stack Bluetoothでのmacとの送受信

プロトコルの煩雑な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