UnityでArduinoからシリアル通信を受け取る


 罠だらけらしいので最低限の動作確認から

やること

UnityでArduinoのシリアル通信を受信するテストを行います。
逆方向の通信が必要な方は、当記事のチェック後に、UnityでArduinoにシリアル通信を送るをご覧ください。

主な参考URL

環境

  • Unity Hub
  • Unity 2018.4.28f1
  • Arduino

Arduinoの準備

Arduino側のスクリプトはシンプルに下記のようにします。
"Hello, this is Arduino."という文字列のメッセージを1秒毎にシリアルに送信します。

Arduino
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の新規プロジェクトを作成します。


メニューの「EDIT」→「Project settings...」を選択します。


「Player」の「Other Settings」から、
- 「Script Runtime Version」 を「.NET 4.x Eauivalent」に設定。
- 「Api Compatibility Level」を 「.NET 4.x」に設定。

これで環境設定は完了です。

Unityのスクリプト設定

Unityで使うスクリプトを2つ準備します。

① SerialHandler.cs を作成します。


スクリプトファイルを作ります。
画面下の「Assets」の中で右クリックし、「Create」→「C# Script」を選択。
ファイル名を「SerialHandler」とします。


UnityとArduinoをシリアル通信より、SerialHandler.csのスクリプトを作成したファイルの中にコピペします。

ファイルの内容を環境に合わせて書き換えます。
先に、ArduinoのIDE等で今回のシリアル通信で使うポート名を調べます。

スクリプトを、下記のように書き換えます。

    public string portName = "(調べたポート名)";
    public int baudRate = 115200;

終わったらセーブします。

② SerialReceive.cs を作成します。

①と同様にC#のスクリプトを作成し、ファイル名を「SerialReceive」にします。
スクリプトは下記のようにします。

SerialReceive.cs
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);//エラーを表示
        }
    }
}

終わったらセーブします。

スクリプトをアタッチする

作成したスクリプトが実行できるようにします。



左上のヒエラルキーウィンドウの中で右クリックし、空のオブジェクトを作成します。
オブジェクト名を「Serial_Test」などに変更します。

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


ヒエラルキーウィンドウの「Serial_Test」をクリックし、右のインスペクターウィンドウを確認します。


インスペクターの「SerialReceive(Script)」の「SerialHandler」のボックスに、ヒエラルキーウィンドウの「Serial_Test」をドラッグアンドドロップしてアタッチします。

これで準備が完了です。

実行

Unityの再生ボタンを押し、実行します。


画面下部の「Console」タブを選択すると、Arduinoから受信したメッセージが表示されます。

おわりに

これで最低限のArduino→Unity間のシリアル通信環境がなんとか整いました。
双方向通信やスピード調整、長いデータのやりとりなどに細かなTipsが必要のようなので、そのあたりを調べていきます。

次の記事では、Unityから送られたシリアル信号をArduinoで受け取りLチカをさせてみますので、よかったら合わせてお読みください。

参考

下記のサイトを参考にさせていただきました。ありがとうございました。