🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

1797閲覧

unityからarduinoに文字を送信したい

akito0705

総合スコア23

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/11/01 06:13

すみません、解決してないのに解決済みにしてしまったので同じ質問をもう一度させていただきます。

開発環境
oculus quest,arduino
ALVRを用いてPCビルドしながら開発しています。
現在UnityからArduinoにserial.write()を用いて文字を送信しようとしているのですが、arduino側が受信してくれずに困っています。

とりあえず今は"r;"という文字列を送信したいと考えています。
シリアルポートのopenはしっかりできています。
write関数の"送信中"、"送信したよ"というデバックは意図した通りの文字列がコンソールに表示されています。
予定としては文字列が送信されたらモーターが動き出してくれれば成功です。
しかしarduino側が反応してくれません。

デバックのためにread関数も使おうとしていたのですが、コンソールには"受信中"しか表示してくれません。

よろしくおねがいします。

unity

1using UnityEngine; 2using System.Collections; 3using System.IO.Ports; 4using System.Threading; 5 6public class SerialHandler : MonoBehaviour 7{ 8 public delegate void SerialDataReceivedEventHandler(string message); 9 public event SerialDataReceivedEventHandler OnDataReceived = delegate { }; 10 11 public string portName = "COM8"; //各自のマイコンのCOMポート 12 public int baudRate = 9600; 13 14 private SerialPort serialPort_; 15 private Thread thread_; 16 private bool isRunning_ = false; 17 18 private string message_; 19 private bool isNewMessageReceived_ = false; 20 21 void Awake() 22 { 23 Open(); 24 } 25 26 void Update() 27 { 28 if (isNewMessageReceived_) 29 { 30 OnDataReceived(message_); 31 Debug.Log(message_); //受信したデータの確認表示用 32 } 33 } 34 35 void OnDestroy() 36 { 37 Close(); 38 } 39 40 private void Open() 41 { 42 serialPort_ = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One); 43 serialPort_.ReadTimeout = 20; 44 serialPort_.Open(); 45 46 isRunning_ = true; 47 48 thread_ = new Thread(Read); 49 thread_.Start(); 50 } 51 52 private void Close() 53 { 54 isRunning_ = false; 55 56 if (thread_ != null && thread_.IsAlive) 57 { 58 thread_.Join(); 59 } 60 61 if (serialPort_ != null && serialPort_.IsOpen) 62 { 63 serialPort_.Close(); 64 serialPort_.Dispose(); 65 } 66 } 67 68 private void Read() 69 { 70 while (isRunning_ && serialPort_ != null && serialPort_.IsOpen) 71 { 72 Debug.Log("受信中"); 73 try 74 { 75 message_ = serialPort_.ReadLine(); 76 isNewMessageReceived_ = true; 77 Debug.Log("受信したよ"); 78 } 79 catch (System.Exception e) 80 { 81 Debug.LogWarning(e.Message); 82 } 83 } 84 } 85 86 public void Write(string message) 87 { 88 try 89 { 90 Debug.Log(message + " を送信中"); 91 serialPort_.Write(message); 92 Debug.Log(message + " を送信したよ"); 93 } 94 catch (System.Exception e) 95 { 96 Debug.LogWarning(e.Message); 97 } 98 } 99} 100

arduino

1#include <Arduino.h> 2#include <Wire.h> 3#include <SoftwareSerial.h> 4 5#include <MeMCore.h> 6 7MeDCMotor motor_9(9); 8MeDCMotor motor_10(10); 9MeUltrasonicSensor ultrasonic_3(3); 10String order="",InByte_strings; 11int InByte = 10, timeC = 0; 12 13void move(int direction, int speed) 14{ 15 int leftSpeed = 0; 16 int rightSpeed = 0; 17 if(direction == 1){ 18 leftSpeed = speed; 19 rightSpeed = speed; 20 }else if(direction == 2){ 21 leftSpeed = -speed; 22 rightSpeed = -speed; 23 }else if(direction == 3){ 24 leftSpeed = -speed; 25 rightSpeed = speed; 26 }else if(direction == 4){ 27 leftSpeed = speed; 28 rightSpeed = -speed; 29 } 30 motor_9.run((9)==M1?-(leftSpeed):(leftSpeed)); 31 motor_10.run((10)==M1?-(rightSpeed):(rightSpeed)); 32} 33 34double angle_rad = PI/180.0; 35double angle_deg = 180.0/PI; 36 37 38void setup(){ 39 Serial.begin(9600); 40 move(1,100); 41 _delay(2); 42 move(1,0); 43} 44 45void loop(){ 46 47 48 Catch(); 49} 50 51void _delay(float seconds){ 52 long endTime = millis() + seconds * 1000; 53 while(millis() < endTime)_loop(); 54} 55 56void _loop(){ 57 58} 59 60void Catch(){ 61 if(Serial.available()>0){ 62 order=Serial.readStringUntil(';'); 63 Serial.print(order); 64 } 65 if(order == "r"){ 66 Serial.print(order); 67 if((ultrasonic_3.distanceCm()) > (50)){ 68 Serial.print(order); 69 move(1,100); 70 timeC += 1; 71 }else{ 72 order = ""; 73 timeC = 0; 74 move(1,0); 75 Serial.print("f"); 76 } 77 if(timeC >= InByte){ 78 order = ""; 79 InByte = 0; 80 timeC = 0; 81 move(1,0); 82 Serial.print("f"); 83 } 84 }else if(order == "t"){ 85 move(4,100); 86 _delay(3); 87 move(4,0); 88 order = ""; 89 Serial.print("f"); 90 }else if(order != ""){ 91 InByte = order.toInt(); 92 } 93} 94

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、loop関数を以下に修正しておいて、

arduino

1void loop(){ 2 int i=Serial.read(); 3 if(i>=0) Serial.write(i); 4 5 // Catch(); 6} 7

PC側ではArduinoIDEのシリアルターミナルを動かしておいて、キー入力したものがそのままターミナル上で表示されるのを確認しましょう

はなしはそれから。


コードを修正

投稿2019/11/01 06:21

編集2019/11/01 06:58
y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akito0705

2019/11/01 06:27

いつも回答ありがとうございます。 シリアルモニタを開いて修正、実行したところ何も押してなくても”?”の左右逆のようなマークがひたすら表示され続けました これはどういうことなのでしょうか?
y_waiwai

2019/11/01 06:30

Arduino側のコードが間違っている、あるいは、配線が間違っている、ということですね も一度チェックしてみては
akito0705

2019/11/01 06:43

Serial.read()の部分を"1"に変更したら1が表示されるようになりました。
akito0705

2019/11/01 06:50

すみません、これで正常に動いてるということだったのですね、勘違いしてしまいました。 配線はコード1本でPCとArduinoを繋いでるだけなので、コードの方を検証してみます。
y_waiwai

2019/11/01 06:59

コードが間違ってたので修正しました。 これで確認してください。 スミマセン
y_waiwai

2019/11/01 06:59

で、配線はコード一本ってことですが、USBのコード、ということかな?
akito0705

2019/11/01 07:01

修正していただいたコードて試したところ、シリアルモニタで入力したものが正常に出力されました
akito0705

2019/11/01 07:05

そうです、USBコード1本で繋いでます。
y_waiwai

2019/11/01 07:12

なら、コードをもとに戻して、 ArduinoIDEのシリアルモニタから r; といれて,表示が想定通りに出るのか、モータが回るかを見てみよう。 動作がおかしいなら、コードの各所に動作確認用にSerial.printをいれて、想定通りにコードが動いているか確認します
y_waiwai

2019/11/01 07:15

まずは、モータを繋がないで、表示がきちんとなるかを見てみよう #モータの電源をArduinoと同じにしてるとまずいかもw
akito0705

2019/11/01 07:48

デバックを取ってみた結果、タイムカウントに用いていたtimeCが自分の想定より早すぎたせいでモーターが動く前に終了していました。 質問の内容は解決しました!!ありがとうございます!
akito0705

2019/11/01 07:49

モータは電池、コードはarduino用に繋いでおりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問