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

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

詳細はこちら
Unity3D

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

Arduino

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

Q&A

解決済

1回答

2170閲覧

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

akito0705

総合スコア23

Unity3D

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

Arduino

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

0グッド

0クリップ

投稿2019/10/31 09:21

開発環境
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}

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, 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 move(1,100); 40 _delay(2); 41 move(1,0); 42} 43 44void loop(){ 45 46 47 _loop(); 48} 49 50void _delay(float seconds){ 51 long endTime = millis() + seconds * 1000; 52 while(millis() < endTime)_loop(); 53} 54 55void _loop(){ 56 if(Serial.available()>0){ 57 order=Serial.readStringUntil(';'); 58 Serial.print(order); 59 } 60 if(order == "r"){ 61 Serial.print(order); 62 if((ultrasonic_3.distanceCm()) > (50)){ 63 Serial.print(order); 64 move(1,100); 65 timeC += 1; 66 }else{ 67 order = ""; 68 timeC = 0; 69 move(1,0); 70 Serial.print("f"); 71 } 72 if(timeC >= InByte){ 73 order = ""; 74 InByte = 0; 75 timeC = 0; 76 move(1,0); 77 Serial.print("f"); 78 } 79 }else if(order == "t"){ 80 move(4,100); 81 _delay(3); 82 order = ""; 83 Serial.print("f"); 84 }else if(order != ""){ 85 InByte = order.toInt(); 86 } 87} 88

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

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

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

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

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

guest

回答1

0

ベストアンサー

Arduino側でSerial.begin忘れてません?

投稿2019/10/31 09:24

ozwk

総合スコア13551

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

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

akito0705

2019/10/31 14:14

回答ありがとうございます! ほんとですね……begin忘れてました……
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問