質問編集履歴

7

good

2022/12/10 02:03

投稿

SASKE
SASKE

スコア10

test CHANGED
File without changes
test CHANGED
@@ -8,40 +8,21 @@
8
8
  実現したいこと
9
9
  arduino IDEのソースコードの変数[servoAngle]をMATLABから値を送って実行したいです。(まずは一つの変数で)
10
10
 
11
- arduino IDEのライブラリを使たコードーーーーーーーーーーーー
11
+ arduino IDEの通信用コードーーーーーーーーーーーーーーーーーーーー
12
12
  ```arduino
13
13
  #include <VarSpeedServo.h> // ライブラリのインクルード
14
14
  VarSpeedServo myservo; // サーボオブジェクトの作成
15
- long servoAngle=170;
16
- int servoSpeed=40;
17
15
 
18
- void setup() {
19
- myservo.attach(6); // サーボ接続ピンをD6に
20
- }
21
-
22
- void loop() {
23
- myservo.write(100, 10, true);
24
- delay(1000);
25
- myservo.write(servoAngle, servoSpeed, true);
26
- myservo.write(140, 50, true);
27
- }
28
- //myservo.write(180, 255, true); // 180°まで速度255で動かし完了をまつ
29
- ```
30
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
31
- arduino IDEの通信用コード(実際に使いたいコード)ーーーーーーーーーーーーーーーーーーーー
32
- ```arduino
33
- #include <VarSpeedServo.h> // ライブラリのインクルード
34
- VarSpeedServo myservo; // サーボオブジェクトの作成
35
16
 
36
17
  // グローバル変数の宣言
37
18
  char input[4]; // 文字列格納用
38
19
  int i = 0; // 文字数のカウンタ
39
20
  int val = 0; // 受信した数値
40
- int servoAngle = 0; // サーボの角度
21
+ int deg = 100; // サーボの角度
41
22
 
42
23
  // 初期設定
43
24
  void setup() {
44
- Serial.begin(9600); // シリアルポートを9600 bps[ビット/秒]で初期化
25
+ Serial.begin(9600); // シリアルポートを9600 bps[ビット/秒]で初期化
45
26
  myservo.attach(9); // 制御信号を送る出力ピンの設定
46
27
  }
47
28
 
@@ -50,7 +31,7 @@
50
31
  // データ受信した場合の処理
51
32
  if (Serial.available()) {
52
33
  input[i] = Serial.read();
53
- // 文字数が3以上 or 末尾文字がある場合の処理
34
+ // 文字数が3以上 or 末尾文字がある場合の処理
54
35
  if (i > 2 || input[i] == '\0') {
55
36
  val = atoi(input); // 文字列を数値に変換
56
37
  Serial.write(input); // 文字列を送信
@@ -65,16 +46,36 @@
65
46
  // メインループ
66
47
  void loop() {
67
48
  deg = serialNumVal();
68
- myservo.write(servoAngle, 30, true); // deg度まで速度30で回転
49
+ myservo.write(deg, 30, true); // deg度まで速度30で回転
69
-
50
+ //myservo.write(180, 255, true); // 180°まで速度255で動かし完了をまつ
70
51
  }
71
52
 
53
+ ```
54
+ ```matlab
55
+ serialportlist("available")
56
+ arduinocom=serialport("COM9",9600);
57
+ configureTerminator(arduinocom,"CR/LF");
72
58
 
59
+ a=1;
60
+ while a==1
61
+
62
+ % 入力待機(回転させたい角度を入力)
63
+ deg = input("回転角度");
64
+ % eが入力されたら終了
65
+ if deg == 0
66
+ arduinocom.close()
67
+ break;
68
+ end
69
+
70
+ % 回転角と終端文字を送信
71
+ arduinocom.write(deg,"uint8")
72
+
73
+ end
73
74
  ```
74
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
75
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
76
75
 
76
+ エラーは出ていないのですがサーボが動いてくれません...どなたかアドバイスなど頂けると嬉しいです。
77
77
 
78
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-10/65f383b0-d74b-45e0-85b3-250a0a2e5c19.png)
78
79
 
79
80
  参考URL
80
81
  [シリアル通信](https://jp.mathworks.com/help//matlab/import_export/read-streaming-data-from-arduino.html)

6

誤字

2022/12/10 01:57

投稿

SASKE
SASKE

スコア10

test CHANGED
File without changes
test CHANGED
@@ -75,7 +75,6 @@
75
75
  ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
76
76
 
77
77
 
78
- どうすればうまく通信できるのでしょうか...アドバイスを頂けると嬉しいです!
79
78
 
80
79
  参考URL
81
80
  [シリアル通信](https://jp.mathworks.com/help//matlab/import_export/read-streaming-data-from-arduino.html)

5

誤字

2022/12/10 01:57

投稿

SASKE
SASKE

スコア10

test CHANGED
File without changes
test CHANGED
@@ -74,26 +74,7 @@
74
74
  ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
75
75
  ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
76
76
 
77
- arduino側は置いといてMATLAB側がエラーになります...
78
- MATLABコードーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
79
- ```matlab
80
- serialportlist("available") %Arduinoと競合しているから使えないのでしょうか..
81
- arduinocom=serialport("COM9",9600);
82
- ```
83
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
84
- エラーメッセージ
85
- ```txt
86
- エラー: serialport (行 116)
87
- ポート 'COM9' で serialport デバイスに接続できません。デバイスがポートに接続されていること、そのポートが使用中でないこと、すべての serialport 入力引数と
88
- パラメーター値がデバイスでサポートされていることを確認してください。
89
- トラブルシューティングの手順については、関連ドキュメンテーション を参照してください。
90
77
 
91
- エラー: com (行 3)
92
- arduinocom=serialport("COM9",9600);
93
- ```
94
-
95
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-10/8a36e1f3-6ae3-49c1-aaca-778b56442af8.png)
96
- arduino IDEで「com9」を使っているのですがおそらく競合してしまっています。
97
78
  どうすればうまく通信できるのでしょうか...アドバイスを頂けると嬉しいです!
98
79
 
99
80
  参考URL

4

よくした

2022/12/10 01:10

投稿

SASKE
SASKE

スコア10

test CHANGED
File without changes
test CHANGED
@@ -93,7 +93,7 @@
93
93
  ```
94
94
 
95
95
  ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-10/8a36e1f3-6ae3-49c1-aaca-778b56442af8.png)
96
-
96
+ arduino IDEで「com9」を使っているのですがおそらく競合してしまっています。
97
97
  どうすればうまく通信できるのでしょうか...アドバイスを頂けると嬉しいです!
98
98
 
99
99
  参考URL

3

みやすく

2022/12/10 01:07

投稿

SASKE
SASKE

スコア10

test CHANGED
File without changes
test CHANGED
@@ -9,6 +9,7 @@
9
9
  arduino IDEのソースコードの変数[servoAngle]をMATLABから値を送って実行したいです。(まずは一つの変数で)
10
10
 
11
11
  arduino IDEのライブラリを使たコードーーーーーーーーーーーー
12
+ ```arduino
12
13
  #include <VarSpeedServo.h> // ライブラリのインクルード
13
14
  VarSpeedServo myservo; // サーボオブジェクトの作成
14
15
  long servoAngle=170;
@@ -25,8 +26,10 @@
25
26
  myservo.write(140, 50, true);
26
27
  }
27
28
  //myservo.write(180, 255, true); // 180°まで速度255で動かし完了をまつ
29
+ ```
28
30
  ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
29
31
  arduino IDEの通信用コード(実際に使いたいコード)ーーーーーーーーーーーーーーーーーーーー
32
+ ```arduino
30
33
  #include <VarSpeedServo.h> // ライブラリのインクルード
31
34
  VarSpeedServo myservo; // サーボオブジェクトの作成
32
35
 
@@ -67,15 +70,19 @@
67
70
  }
68
71
 
69
72
 
73
+ ```
70
74
  ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
71
75
  ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
72
76
 
73
77
  arduino側は置いといてMATLAB側がエラーになります...
74
78
  MATLABコードーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
79
+ ```matlab
75
80
  serialportlist("available") %Arduinoと競合しているから使えないのでしょうか..
76
81
  arduinocom=serialport("COM9",9600);
82
+ ```
77
83
  ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
78
84
  エラーメッセージ
85
+ ```txt
79
86
  エラー: serialport (行 116)
80
87
  ポート 'COM9' で serialport デバイスに接続できません。デバイスがポートに接続されていること、そのポートが使用中でないこと、すべての serialport 入力引数と
81
88
  パラメーター値がデバイスでサポートされていることを確認してください。
@@ -83,6 +90,7 @@
83
90
 
84
91
  エラー: com (行 3)
85
92
  arduinocom=serialport("COM9",9600);
93
+ ```
86
94
 
87
95
  ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-10/8a36e1f3-6ae3-49c1-aaca-778b56442af8.png)
88
96
 

2

使用可能なポート

2022/12/10 01:01

投稿

SASKE
SASKE

スコア10

test CHANGED
File without changes
test CHANGED
@@ -72,7 +72,7 @@
72
72
 
73
73
  arduino側は置いといてMATLAB側がエラーになります...
74
74
  MATLABコードーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
75
- serialportlist("available") %ちゃんとcom9は使えると表示されてます。Arduinoと競合しているから使えないのでしょうか..
75
+ serialportlist("available") %Arduinoと競合しているから使えないのでしょうか..
76
76
  arduinocom=serialport("COM9",9600);
77
77
  ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
78
78
  エラーメッセージ

1

実現可能なことが分かったので実際に試してみました。

2022/12/10 00:45

投稿

SASKE
SASKE

スコア10

test CHANGED
File without changes
test CHANGED
@@ -6,62 +6,93 @@
6
6
  (MATLABだけでarduinoを制御することも可能ですがサーボの精度が落ちます..)
7
7
 
8
8
  実現したいこと
9
- arduino IDEのソースコードの変数[servoAngle],[servospeed]をMATLABから値を送って実行したいです。
9
+ arduino IDEのソースコードの変数[servoAngle]をMATLABから値を送って実行したいです。(まずは一つの変数で)
10
10
 
11
- arduino IDEのコードーーーーーーーーーーーー
11
+ arduino IDEのライブラリを使たコードーーーーーーーーーーーー
12
12
  #include <VarSpeedServo.h> // ライブラリのインクルード
13
13
  VarSpeedServo myservo; // サーボオブジェクトの作成
14
14
  long servoAngle=170;
15
15
  int servoSpeed=40;
16
-
16
+
17
17
  void setup() {
18
-
19
18
  myservo.attach(6); // サーボ接続ピンをD6に
20
-
21
19
  }
22
20
 
23
21
  void loop() {
24
-
25
22
  myservo.write(100, 10, true);
26
23
  delay(1000);
27
24
  myservo.write(servoAngle, servoSpeed, true);
28
25
  myservo.write(140, 50, true);
29
-
26
+ }
30
-
27
+ //myservo.write(180, 255, true); // 180°まで速度255で動かし完了をまつ
28
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
29
+ arduino IDEの通信用コード(実際に使いたいコード)ーーーーーーーーーーーーーーーーーーーー
30
+ #include <VarSpeedServo.h> // ライブラリのインクルード
31
+ VarSpeedServo myservo; // サーボオブジェクトの作成
32
+
33
+ // グローバル変数の宣言
34
+ char input[4]; // 文字列格納用
35
+ int i = 0; // 文字数のカウンタ
36
+ int val = 0; // 受信した数値
37
+ int servoAngle = 0; // サーボの角度
38
+
39
+ // 初期設定
40
+ void setup() {
41
+ Serial.begin(9600); // シリアルポートを9600 bps[ビット/秒]で初期化
42
+ myservo.attach(9); // 制御信号を送る出力ピンの設定
31
43
  }
32
44
 
45
+ // シリアル通信で受信したデータを数値に変換
46
+ int serialNumVal(){
47
+ // データ受信した場合の処理
48
+ if (Serial.available()) {
49
+ input[i] = Serial.read();
50
+ // 文字数が3以上 or 末尾文字がある場合の処理
51
+ if (i > 2 || input[i] == '\0') {
52
+ val = atoi(input); // 文字列を数値に変換
33
- //myservo.write(180, 255, true); // 180°まで速度255で動かし完了まつ
53
+ Serial.write(input); // 文字列送信
34
- ーーーーーーーーーーーーーーーーーーーーーー
54
+ Serial.write("\n");
55
+ i = 0; // カウンタの初期化
56
+ }
57
+ else { i++; }
58
+ }
59
+ return val;
60
+ }
35
61
 
62
+ // メインループ
63
+ void loop() {
36
- MATLABだけでarduinoを動かす場合のコードーーーーーー
64
+ deg = serialNumVal();
37
- if exist('arduino_connection',"var")==0
38
- arduino_connection = arduino('COM9', 'Uno', 'Libraries', 'Servo');% 約2.5秒
39
- end
40
- if exist('servo_attach','var')==0
65
+ myservo.write(servoAngle, 30, true); // deg度まで速度30で回転
41
- servo_attach = servo(arduino_connection, 'D6','MaxPulseDuration',25e-04,'MinPulseDuration',5e-04); %D6はピン番号、パルス幅はサーボの仕様書より
42
- end
43
66
 
44
- angle_start=155; %初期角度
67
+ }
45
- angle_end=160; %目標角度160
46
68
 
47
69
 
48
- for i=1:10
70
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
71
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
49
72
 
73
+ arduino側は置いといてMATLAB側がエラーになります...
50
- writePosition(servo_attach, angle_start/180);
74
+ MATLABコードーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
51
- pause(2)
75
+ serialportlist("available") %ちゃんとcom9は使えると表示されてます。Arduinoと競合しているから使えないのでしょうか..
52
-
53
- writePosition(servo_attach, angle_end/180);
76
+ arduinocom=serialport("COM9",9600);
77
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
78
+ エラーメッセージ
79
+ エラー: serialport (行 116)
80
+ ポート 'COM9' で serialport デバイスに接続できません。デバイスがポートに接続されていること、そのポートが使用中でないこと、すべての serialport 入力引数と
81
+ パラメーター値がデバイスでサポートされていることを確認してください。
82
+ トラブルシューティングの手順については、関連ドキュメンテーション を参照してください。
54
83
 
55
- pause(0.02)
84
+ エラー: com (行 3)
85
+ arduinocom=serialport("COM9",9600);
56
86
 
57
- writePosition(servo_attach, angle_start/180);
87
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-10/8a36e1f3-6ae3-49c1-aaca-778b56442af8.png)
58
88
 
89
+ どうすればうまく通信できるのでしょうか...アドバイスを頂けると嬉しいです!
90
+
59
- end
91
+ 参考URL
60
- ーーーーーーーーーーーーーーーーーー
61
- [シリアル通信]https://jp.mathworks.com/help//matlab/import_export/read-streaming-data-from-arduino.html
92
+ [シリアル通信](https://jp.mathworks.com/help//matlab/import_export/read-streaming-data-from-arduino.html)
62
93
 
63
94
  [Pythonで似た例](https://algorithm.joho.info/arduino/python-serial-servo-motor/)
64
95
 
65
96
  [MATLABとarduino通信](https://jp.mathworks.com/matlabcentral/answers/127373-arduino-serial-communication-with-matlab-daq-getting-maximum-sample-rate?s_tid=srchtitle)
66
97
 
67
- これらの例がありますが、今回の様な通信は初めてでアドバイスや参考コードを頂けると嬉しいです!(もしかしたら実現不可能なことを言ってるかも知れません..m(_ _)m
98
+