はじめに
以前、UIFlowというツールでM5Stackとのシリアル通信をしていましたが、そちらだとBlueToothに対応していなかったので、結局Arduinoを利用することにしました。
結構つまづく箇所があったので、記事にします。
セットアップ
今回は、VSCodeでの開発を例として紹介します。
Arduino IDEでも問題ないんですが、予測変換とか出てこなくて使いづらく感じたので、僕はVSCodeを利用します。
-
VSCodeのダウンロード: https://azure.microsoft.com/ja-jp/products/visual-studio-code
-
日本語化
左側のテトリスの欠けたOミノみたいなアイコンクリックして、「japanese」と検索して、一番上のやつをインストール
インストール後にVSCodeを再起動して日本語化完了

-
インストール後に芋虫アイコンが追加されているので、選択して
Openをクリック、右側にウィンドウが表示されるので、「New Project」を選択する

-
platformio.iniファイルを次のように変更
[env:m5stick-c]
lib_deps=m5stack/M5StickCPlus@^0.1.0
platform = espressif32
board = m5stick-c
framework = arduino
VSCodeの使い方
左下らへんのアイコン群をめちゃ使います。ここ覚えとけば使えるかも
最低限知っとけばいい機能
- ✅:ビルド。
- →:アップロード。デバイスに接続されている必要がある。
- 🔌(一番右のやつ):接続されているデバイスのシリアルポートの選択。
シリアルモニタ
ここで、Arduino側でシリアル書き込みされたデータが表示されます。
ポートとボーレートを指定して、「Start Monitoring」をクリックすれば表示が開始されます。
また、先程追加したArduino IDEには、シリアルプロッタという、値をグラフ化して表示してくれる機能があります。
個人的には、こっちの方が分かりやすいのでこちらを利用しています。

コード
一例ですが、こんな感じのコードを利用しています。
加速度とボタン入力をシリアル通信でUnity側に渡す処理です。
#include <Arduino.h>
#include <M5StickCPlus.h>
#include "BluetoothSerial.h"
BluetoothSerial blueTooth;
float accX, accY, accZ;
void setup()
{
m5.begin(); // M5初期化
m5.Imu.Init();
blueTooth.begin("M5Device");
}
void loop()
{
m5.update();
m5.Lcd.fillScreen(BLACK); // 塗りつぶし
// パラメータ取得
bool buttonA = m5.BtnA.isPressed();
m5.Imu.getAccelData(&accX, &accY, &accZ);
//blueTooth.println(accX);
blueTooth.printf("%.1f,%.1f,%.1f,%d\r\n", accX, accY, accZ,buttonA);
// 表示
m5.Lcd.setCursor(0, 30);
m5.Lcd.printf("Acc: (%.1f,%.1f,%.1f)\n", accX, accY, accZ);
m5.Lcd.setCursor(0, 60);
m5.Lcd.printf("Button:%d", buttonA);
delay(100);
}
解説
まず、これらのヘッダーファイルをインクルードします。
注意点として、これらはPlatformIO IDEがインストールされていないと、インクルードできません。
インクルード
#include <Arduino.h>
#include <M5StickCPlus.h>
#include "BluetoothSerial.h"
BluetoothSerial blueTooth;
また、BlueToothのシリアル通信を使用する場合、BluetoothSerialというものを使用します
初期化
- m5本体
- Bluetoothの初期化
- (加速度関係の初期化)
を行います。
Bluetoothの初期化では、Bluetoothのデバイス名を指定します。
これは、PCでBluetoothに接続するときに使用されます。

void setup()
{
m5.begin(); // M5初期化
m5.Imu.Init();
blueTooth.begin("M5Device");
}
更新処理
必要最低限の箇所だけ抜き出しました↓
注意点として、print系のメソッドでシリアルの書き込みをするのですが、改行を使用するは\nではなく\r\nでないとUnityがフリーズしてしまいます!!注意⚠️⚠️⚠️⚠️
(println()つかえば安心っぽいですけど、いちいち1行ずつ記載するのも面倒なので、printf()使ってます)
void loop()
{
m5.update();
// パラメータ取得
bool buttonA = m5.BtnA.isPressed();
m5.Imu.getAccelData(&accX, &accY, &accZ);
//blueTooth.println(accX);
blueTooth.printf("%.1f,%.1f,%.1f,%d\r\n", accX, accY, accZ,buttonA);
delay(100);
}
Unity側の処理
以前の記事の内容のと同様です
よろしければ、そちらを参照にしてください。
実装結果
こんな感じで、デバイスの加速度とボタン入力状態の取得ができました!やったー
(ボタン入力はArduino側ではintとして表示して、Unity側でその値が0じゃないかというboolに変換してます。0と1でもいいんですけど、個人的な好みでboolにしてます)

さいごに
普段はPCとかスマホ向けのゲームを制作していますが、こういうマニアックなデバイスでの開発も楽しいですね~
参考サイト




