memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

Arduino+Unity(シリアル通信)するときの手順メモ

ArduinoとPCをUSBケーブルで接続してUnityで何かしたいことがあります.以前ならProcessingを使っていましたが,Unityも便利なツールなので.

Arduino  Unity」  でぐぐるといい記事が見つかります.Assetもあるようですが,この記事で提案されている手法は無料で使えるところがいいところです.

UnityとArduinoをシリアル通信 - Qiita はじめに (読み飛ばしてください 笑) ちょっとした趣味でデータグローブを作ってUnityで遊べたらなと思いました。 qiita.com  

この記事を参考にした記事がかなりの数がありますが,とりあえず試した記録を残しておきたいので書いておきます.ノイズかなぁ?

環境は,macOS 10.15.7,Unityは2019.4.10f1,Arduinoはまぁいいでしょう.

以下,手順とはまりポイントをメモします.

(1)Unityを起動してプロジェクトを新規作成します.2Dでも3Dでも用途に合わせて.とりあえず今回はテストなので2Dでオブジェクトはデフォルトで入っているMain Cameraのみを使用します.

(2)UnityのProjectペインで,C#スクリプトを新規作成して,上記の記事から,SerialHandler.csとhogehoge.csをコピペします.

(3)SerialHandler.csの16と17行目のportNameとboudRateを書き換えます.私はmacの環境に合わせて以下のように書き換えてみました.

  public string portName = "/dev/cu.usbserial-141130";
  public int baudRate    = 115200;

(4)hogehoge.csも私の用途に合わせて書き換えました.私の用途は,Arduinoでタクトスイッチの押下状態をdigitalReadして,その値を,Serial.printlnでPCに送信するものです.まず,Updateメソッド内はコメントにしました.Arduinoに対しての出力はしないからです.

  void Update()
 {
   //文字列を送信
   //serialHandler.Write("hogehoge");
 }

続いて,\tを\nに変えました.\tではArduinoでシリアルモニタでデバッグするときに見にくいからですね.改行の方がいいということです.そして,if (data...)という行をコメントにしました.あとでArduinoのコードを示しますが,私の場合は1個しかデータが含まれないのでコメントにしないと永久にデータを取得できないからですね.

   //受信した信号(message)に対する処理
   void OnDataReceived(string message)
   {
       var data = message.Split(
               new string[]{"\n"}, System.StringSplitOptions.None);
       //if (data.Length < 2) return;
       try {
           Debug.Log(data[0]);
       } catch (System.Exception e) {
           Debug.LogWarning(e.Message);
       }
   }

(5)SerialHandler.csとhogehoge.csをMain Cameraにアタッチします.成功すると以下の青枠の部分が追加されます.ちなみにこのペインはMain Cameraをクリックすると表示されます.

スクリーンショット 2020-10-20 19.23.38

(6)つづいて,上図の赤←の◎をクリックして,Main Camera(C#スクリプトをアタッチしたオブジェクト)を選択します.

(7)ここまでで,プレイボタンを押すと,エラーが出ることがわかります.このエラーを回避するには,Unityのメニューから Edit - Project Settingsを選択して,その中のPlayerを選択し,スクロールして下側にある Api Compatibility Level を .NET Standard 2.0 から .NET 4.x に変えるだけです.

Assets/SerialHandler.cs(3,17): error CS0234: The type or namespace name 'Ports' does not exist in the namespace 'System.IO' (are you missing an assembly reference?)

Assets/SerialHandler.cs(19,13): error CS0246: The type or namespace name 'SerialPort' could not be found (are you missing a using directive or an assembly reference?)

Unityをスタートしてもエラーが出ることもあるのですが,何度かプレイボタンを押してみると動作することもあります.なんか気持ち悪いですが.

あ,そうそう.Arduinoのコードもついでに挙げておきますね.2番ピンにタクトスイッチの1つの足をつなげ,もう片方をGNDにつなげます.コードにあるとおり,プルアップなのでスイッチを押していないときにはHIGHになり,押したときにはLOWになります.

void setup() {
 Serial.begin(115200);
 pinMode(2, INPUT_PULLUP);
}

void loop() {
 Serial.println(digitalRead(2));
 delay(300);
}

とりあえず,これだけ書いておけば思い出せますので.ちなみに,Unityのバージョンが変わると方法も変わるようです.