前提・実現したいこと
Unityで3Dオブジェクトを操作してy軸周りの回転量(横回転)を読み取り、動いた角度(現在は最終的な角度の値)をArduinoに送信してArduinoで制御するモータを回転させる、という動作を実現したいです。
UnityとArduinoの通信は現在シリアル通信で行っています。
Arduinoのシリアルモニタに直接整数値を入力するとその数値分回転することは確認しています。
この数値入力はString型で行っているため、Unityから角度を出力するときにもfloat→int→stringへと型の変換を行っています。
発生している問題・エラーメッセージ
キューブオブジェクトの回転量はDebug.Logで取得でき、この値をString型に変換することはできています。
しかし、このString型に変換した文字列を出力できていないのかArduino側が受け取れていないのかモータが回転していない現状です。
Unity側のUpdate関数でこの処理していることが原因なのかArduinoでの制御をString型で行っていることが原因なのかもわかっていない状況です。
該当のソースコード
Manager.cs(Unityのscript) using System.Collections; using System.Collections.Generic; using UnityEngine; public class Manager : MonoBehaviour { private SerialPortWrapper _serialPort; private string a,z; private float b; private int c; void Awake() { _serialPort = new SerialPortWrapper("COM4", 9600); } cubescript script; // Start is called before the first frame update void Start() { script = GameObject.Find("Cube").GetComponent<cubescript>(); //CubeScriptの変数にアクセスする Debug.Log(script.sample_text); } // Update is called once per frame void Update() { //CubeScriptのメソッドにアクセスする script.Move(); Debug.Log(transform.rotation); //Debug.Log(100 * transform.rotation.y); b = 100 * transform.rotation.y; //Debug.Log(b); c = (int)b; Debug.Log(c); z = b.ToString("000"); //bをstring型に変換する Debug.Log("z=" + z); _serialPort.Write(z); } }
Arduinoのコード int PUL=13; //Pin para la señal de pulso int DIR=12; //define Direction pin int EN=11; //define Enable Pin void setup() { Serial.begin(9600); pinMode (PUL, OUTPUT); pinMode (DIR, OUTPUT); pinMode (EN, OUTPUT); digitalWrite(EN,HIGH); } int i; double angle = i * 0.225; //現在角度 String input; int val = 0; void loop() { // put your main code here, to run repeatedly: if (Serial.available() > 0) { // シリアル通信でデータが送られてくるまで待つ。 String line; // 受信文字列 int line_len; // 受信文字列の長さ int led_duty; // LEDのPWM制御のデューティ比 line = Serial.readStringUntil('\n'); line_len = line.length(); if ((line_len >= 1) && (line_len <= 3)) { val = line.toInt(); //Serial.print("LED Duty: "); } //input = Serial.read(); Serial.println(val); //角度表示 //val = input.toInt(); if(val >= 0) { digitalWrite(DIR,LOW); //回転方向決定 }else{ digitalWrite(DIR,HIGH); //回転方向決定 val = val * -1; } for (int i=0; i<int(val/0.225); i++) { digitalWrite(PUL,HIGH); //パルス送信on delayMicroseconds(400); //0.4秒待機 digitalWrite(PUL,LOW); //パルス送信off delayMicroseconds(400); //0.4秒待機 double angle = i * 0.225; Serial.print("angle:"); Serial.println(angle); } }else { digitalWrite(PUL,LOW); } }
試したこと
Update関数で出力の値が更新されるペースとArduinoの処理速度が合っていないかと思い、if文で特定の角度になったときにその値を出力するというプログラムを入れてみましたがうまくいきませんでした。
また、String型以外で出力しようとも思いましたがそうした場合String型に変換するようUnityでエラーが出ました。
補足情報(FW/ツールのバージョンなど)
UnityのバージョンはUnity2019.4.15f.1、Arduino UnoはArduinoIDEで制御しています。
回答2件
あなたの回答
tips
プレビュー