Edited at

M5StackとUnity間でBluetoothシリアル通信をしよう

最近話題になってるM5StackにはBluetoothモジュールが標準で付いてます。

これ一個あればUnityで開発できるゲームの幅が広がるなぁと思い、Unityと通信しようとすると結構つまずいたので、方法を共有しようと思います。

この記事内では、M5Stackで取得した情報を、Bluetoothシリアル通信でPCに送ってUnityで取得するまでをやります。


---開発環境---


  1. Unity2018.2.15f1

  2. M5Stack Basic

  3. Arduino IDE 1.8.7

  4. UniRx


M5Stack側準備

Bluetooth通信回りは、BluetoothSerial.hというライブラリを使ってやります。

M5Stackの最初のセットアップでこのライブラリは追加されていると思いますが、見つからない場合はインストールしなおしてください。

下のプログラムはM5Stackで0から255までの数字を0.1秒おきにBluetoothでPCに送るプログラムです。これをArduino IDEのスケッチに書いてください。

コンパイルして問題がなければ、選択してるボードとシリアルポートが間違えてないか確認して、M5Stackに書き込みましょう。


BluetoothTest

#include <M5Stack.h>

#include "BluetoothSerial.h"

byte counter;

BluetoothSerial bts;

void setup() {
M5.begin();
M5.Lcd.println("Bluetooth Now");

Serial.begin(9600);
bts.begin("M5Stack");//PC側で確認するときの名前

counter = 0;
}

void loop() {
bts.println(counter);
counter++;
delay(100);
}


ここで一度シリアルモニタでちゃんとBluetoothでシリアル通信できてるか確認しましょう。

Windowsならば、設定>デバイス>Bluetoothとその他のデバイス を開き、Bluetoothデバイスを追加しましょう。

デバイスの名前はM5Stackになってます。

無事に接続できたら、コントロールパネルからデバイスマネージャーを開き、ポートを確認してください。

確認すると、Bluetoothリンク経由の標準シリアル(COMn)という名前でポートが二つ開かれているはずです。

bandicam 2018-11-29 03-15-41-464.jpg

ここでなんで二つポートが開くかまだ理解してないんですよね...(すみません:sweat:

とりあえず小さい方の数字のポートを、ArduinoIDEのシリアルポートで選択してください。

そしたらシリアルモニタを開いて、ボーレートを9600bpsにして、1から255までの数字が表示されていれば成功です。無事にPCとBluetooth経由でシリアル通信ができました。

もしも何も表示されなければ、もう一つのポートを選択して同じことをやってみてください。


Unity側準備

それではUnity側の準備です。

ここの準備は、下記の引用サイト2のおもちゃラボ様の記事内まんまです。

記事内のUnity側のプログラムを作るに書かれていることをそのまま実行してください。


実行してみる

これもおもちゃラボ様の記事内通りなんですが諸々補足。

最後の、Unity内のコンソールビューで、何度実行しても何も表示されない、またはcan not open serial portとなる時があるんですが、これは単純にArduinoIDEのシリアルモニタを出しっぱなしにしてるのが原因かもしれません。シリアルモニタを閉じて再度やってみましょう。


未解決の課題


  1. なんで一個のM5Stackでポートが二つ開くのか。

  2. M5Stackを二つ使って、Unity側で二つのデータを受け取ろうとすると不安定過ぎて使い物にならない。

2の問題についてなんですが、

M5Stackを二つ使って、Unity側で二つのデータを受け取るということをやってみました、10回に1回くらいは無事にデータを取得できるんですが、ほとんどは片方のデータしか取れなかったり、両方とも取れなかったりします。

1,2とも原因がわかり次第追記します。


開発、執筆にあたり、下記のサイト様を参考、引用させていただきました。

 

1. 【Unity】UniRxを使ってArduinoとシリアル通信 - おもちゃラボ

2. SerialPort または Uniduino を使った Unity と Arduino を連携させる方法調べてみた

3. ESP32でBluetoothSerial通信をしよう!