1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

UnityでM5StackとのBlueTooth無線通信をする

Last updated at Posted at 2023-08-08

はじめに

以前、UIFlowというツールでM5Stackとのシリアル通信をしていましたが、そちらだとBlueToothに対応していなかったので、結局Arduinoを利用することにしました。
結構つまづく箇所があったので、記事にします。

セットアップ

今回は、VSCodeでの開発を例として紹介します。
Arduino IDEでも問題ないんですが、予測変換とか出てこなくて使いづらく感じたので、僕はVSCodeを利用します。

  1. VSCodeのダウンロード: https://azure.microsoft.com/ja-jp/products/visual-studio-code

  2. 日本語化
    左側のテトリスの欠けたOミノみたいなアイコンクリックして、「japanese」と検索して、一番上のやつをインストール
    インストール後にVSCodeを再起動して日本語化完了
    image.png

  3. 次に、Arduinoと検索して追加
    image.png

  4. 同様に、「PlatformIO」と検索して、この芋虫みたいなやつ↓も追加
    image.png

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

  6. プロジェクト名、使用するデバイス、ディレクトリの選択をして作成
    image.png

  7. platformio.iniファイルを次のように変更

[env:m5stick-c]
lib_deps=m5stack/M5StickCPlus@^0.1.0

platform = espressif32
board = m5stick-c
framework = arduino

VSCodeの使い方

左下らへんのアイコン群をめちゃ使います。ここ覚えとけば使えるかも

image.png

最低限知っとけばいい機能

  • ✅:ビルド。
  • →:アップロード。デバイスに接続されている必要がある。
  • 🔌(一番右のやつ):接続されているデバイスのシリアルポートの選択。

シリアルモニタ

ここで、Arduino側でシリアル書き込みされたデータが表示されます。
ポートとボーレートを指定して、「Start Monitoring」をクリックすれば表示が開始されます。

image.png

また、先程追加したArduino IDEには、シリアルプロッタという、値をグラフ化して表示してくれる機能があります。
個人的には、こっちの方が分かりやすいのでこちらを利用しています。
image.png

コード

一例ですが、こんな感じのコードを利用しています。
加速度とボタン入力をシリアル通信でUnity側に渡す処理です。

.cpp
#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がインストールされていないと、インクルードできません。

インクルード

.cpp
#include <Arduino.h>
#include <M5StickCPlus.h>
#include "BluetoothSerial.h"

BluetoothSerial blueTooth;

また、BlueToothのシリアル通信を使用する場合、BluetoothSerialというものを使用します

初期化

  • m5本体
  • Bluetoothの初期化
  • (加速度関係の初期化)
    を行います。

Bluetoothの初期化では、Bluetoothのデバイス名を指定します。
これは、PCでBluetoothに接続するときに使用されます。
image.png

.cpp
void setup()
{
  m5.begin(); // M5初期化
  m5.Imu.Init();
  blueTooth.begin("M5Device");
}

更新処理

必要最低限の箇所だけ抜き出しました↓
注意点として、print系のメソッドでシリアルの書き込みをするのですが、改行を使用するは\nではなく\r\nでないとUnityがフリーズしてしまいます!!注意⚠️⚠️⚠️⚠️
(println()つかえば安心っぽいですけど、いちいち1行ずつ記載するのも面倒なので、printf()使ってます)

.cpp
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にしてます)
image.png

さいごに

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

参考サイト

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?