korechi’s diary

とあるVR/ARエンジニアのブログ

Uniduinoを使ったUnityとArduinoの通信

大きく分けて2つの方法がある。一つはSerialPortを使う方法、もう一つはUniduinoを使う方法。
Uniduinoは20$必要ですが、その分非常に使いやすく手間も省けるので自分はUniduinoを使います。SerialPortを使った方法については SerialPort または Uniduino を使った Unity と Arduino を連携させる方法調べてみた - 凹みTips を参照してください。

それではUniduinoの使い方
1. UniduinoをAssetStoreからダウンロードする
2. Arduinoを開いて以下のようにプロジェクトを開いて焼き込む(Arduino側の設定はこれだけ、もしコンパイルが失敗したら、ポートの設定を確認すべき)
f:id:korechi:20160425120127j:plain
3. Unityを開いてUniduino/Prefab/Uniduinoをシーン上に配置(最初は、Window/UniduinoからInstall~を実行してUnityを再起動)
4. シーン内に適当なサンプル(ArduinoController)を配置し、適当なコード(ArduinoController.cs)を登録させる
f:id:korechi:20160425120530j:plain
5. コード内にArduinoと同じようなコードを記述する。以下参照

using UnityEngine;
using System.Collections;
using Uniduino;

public class ArduinoController : MonoBehaviour {

    private Arduino arduino;
    private int leg = 11;
    private int down = 12;
    private int up = 13;
    private int i = 0;

    void Start () {
        // インスタンスを取得
        arduino = Arduino.global;
        if (arduino == null) {
            Debug.Log ("arduino's instanse is null");
        }
        arduino.Setup (ConfigurePins);

        // コルーチンでループ
        StartCoroutine (Loop());
    }

    // Pinの設定
    void ConfigurePins()
    {
        arduino.pinMode(up, PinMode.OUTPUT);
        arduino.pinMode(down, PinMode.OUTPUT);
        arduino.pinMode (leg, PinMode.OUTPUT); 
    }

    private IEnumerator Loop()
    {
        while (i < 200) {
            arduino.digitalWrite(leg, Arduino.HIGH);
            yield return new WaitForSeconds(1);
            arduino.digitalWrite(leg, Arduino.LOW);
            arduino.digitalWrite(down, Arduino.HIGH);
            yield return new WaitForSeconds(1); 
            arduino.digitalWrite(down, Arduino.LOW);
            arduino.digitalWrite(up, Arduino.HIGH);
            yield return new WaitForSeconds(1);
            arduino.digitalWrite(up, Arduino.LOW);
            i++; 
        }
    }
}

このように、非常に簡単にArduinoをUnity上のスクリプトから動かすことができた。