やること
UnityでArduinoのシリアル通信を受信するテストを行います。
逆方向の通信が必要な方は、当記事のチェック後に、UnityでArduinoにシリアル通信を送るをご覧ください。
主な参考URL
環境
- Unity Hub
- Unity 2018.4.28f1
- Arduino
Arduinoの準備
Arduino側のスクリプトはシンプルに下記のようにします。
"Hello, this is Arduino."という文字列のメッセージを1秒毎にシリアルに送信します。
void setup() {
Serial.begin(115200); //シリアルポートを115200bpsで開く
}
void loop()
{
//文字列のメッセージを1秒毎にシリアルに送信する
Serial.print("Hello, this is Arduino.");
Serial.println();
delay(1000);
}
Arduinoに書き込んだら準備は終了です。
Unityの環境設定
Unityのプロジェクトを作成し、環境設定を整えます。
Unity Hubより、バージョンを2018.4.28f1に指定してUnityの新規プロジェクトを作成します。


これで環境設定は完了です。
Unityのスクリプト設定
Unityで使うスクリプトを2つ準備します。
① SerialHandler.cs を作成します。


ファイルの内容を環境に合わせて書き換えます。
先に、ArduinoのIDE等で今回のシリアル通信で使うポート名を調べます。
スクリプトを、下記のように書き換えます。
public string portName = "(調べたポート名)";
public int baudRate = 115200;
終わったらセーブします。
② SerialReceive.cs を作成します。
①と同様にC#のスクリプトを作成し、ファイル名を「SerialReceive」にします。
スクリプトは下記のようにします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SerialReceive : MonoBehaviour
{
//https://qiita.com/yjiro0403/items/54e9518b5624c0030531
//上記URLのSerialHandler.cのクラス
public SerialHandler serialHandler;
void Start()
{
//信号を受信したときに、そのメッセージの処理を行う
serialHandler.OnDataReceived += OnDataReceived;
}
//受信した信号(message)に対する処理
void OnDataReceived(string message)
{
var data = message.Split(
new string[] { "\n" }, System.StringSplitOptions.None);
try
{
Debug.Log(data[0]);//Unityのコンソールに受信データを表示
}
catch (System.Exception e)
{
Debug.LogWarning(e.Message);//エラーを表示
}
}
}
終わったらセーブします。
スクリプトをアタッチする
作成したスクリプトが実行できるようにします。


次に、「Assets」内にある2つのスクリプト、「SerialHandler」「SerialReceive」をヒエラルキーウィンドウの「Serial_Test」オブジェクトにドラッグ&ドロップでアタッチします。


これで準備が完了です。
実行
Unityの再生ボタンを押し、実行します。

おわりに
これで最低限のArduino→Unity間のシリアル通信環境がなんとか整いました。
双方向通信やスピード調整、長いデータのやりとりなどに細かなTipsが必要のようなので、そのあたりを調べていきます。
次の記事では、Unityから送られたシリアル信号をArduinoで受け取りLチカをさせてみますので、よかったら合わせてお読みください。
参考
下記のサイトを参考にさせていただきました。ありがとうございました。