LoginSignup
14
12

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-06-20

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

やること

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チカをさせてみますので、よかったら合わせてお読みください。

参考

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

14
12
1

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
14
12