質問編集履歴
16
解決案の検討
title
CHANGED
File without changes
|
body
CHANGED
@@ -257,4 +257,117 @@
|
|
257
257
|
```
|
258
258
|
|
259
259
|
|
260
|
-
---
|
260
|
+
---
|
261
|
+
|
262
|
+
カンマ区切りでの通信
|
263
|
+
---
|
264
|
+
|
265
|
+
どうしても場当たり的な例外の処理が多く、無駄にコンピューターリソースを使っています。
|
266
|
+
このような処理の要らないシリアル通信での送受信方法を知ることが最優先事項です。
|
267
|
+
|
268
|
+
```Java
|
269
|
+
|
270
|
+
//前回以降の残りのデータを入れる文字列型の変数
|
271
|
+
String leftover = "";
|
272
|
+
|
273
|
+
|
274
|
+
//カンマ区切りを分離して、表示する関数
|
275
|
+
public void DataSplit(String msgStr){
|
276
|
+
|
277
|
+
boolean StartFlag = false;
|
278
|
+
boolean EndFlag = false;
|
279
|
+
|
280
|
+
//配列の添字用にセンサ番号をカウントする
|
281
|
+
int counter = 0;
|
282
|
+
|
283
|
+
//前回以降の残りのデータと、今回のデータを繋げる
|
284
|
+
msgStr = leftover + msgStr;
|
285
|
+
|
286
|
+
//シリアル通信から送られてくるデータを分割する
|
287
|
+
String[] SplitData = msgStr.split(",", 0);
|
288
|
+
|
289
|
+
|
290
|
+
//取得したデータの数だけ繰り返す
|
291
|
+
for (int i=0; i<SplitData.length; i++){
|
292
|
+
|
293
|
+
//終了フラグが立っていなければ
|
294
|
+
if (!EndFlag){
|
295
|
+
|
296
|
+
//前回までにスタートがあれば
|
297
|
+
if (StartFlag){
|
298
|
+
|
299
|
+
//スタート以降にエンドがあるなら
|
300
|
+
if (SplitData[i].equals("E")){
|
301
|
+
|
302
|
+
EndFlag = true;
|
303
|
+
|
304
|
+
//Eがあれば一度空にして、残ったものだけを引き次ぐ
|
305
|
+
leftover = "";
|
306
|
+
|
307
|
+
}else{
|
308
|
+
|
309
|
+
// 「null以外」 かつ 「空欄ではない」 なら (,区切りが先頭または最後に来ていると、残りデータとの結合時に,,となってしまう可能性があるため)
|
310
|
+
if(SplitData[i].trim() != null && !SplitData[i].trim().equals("")){
|
311
|
+
//センサーデータの配列に入れる
|
312
|
+
SensorData[counter] = SplitData[i]; //スタートの次からデータ配列に入れ始める
|
313
|
+
counter++;//カウンターを増やす
|
314
|
+
}
|
315
|
+
|
316
|
+
}
|
317
|
+
|
318
|
+
//今がスタートであれば
|
319
|
+
}else if (SplitData[i].equals("S")){
|
320
|
+
|
321
|
+
StartFlag = true;
|
322
|
+
|
323
|
+
}
|
324
|
+
|
325
|
+
}else{
|
326
|
+
|
327
|
+
//カンマ区切りの最後の数値 かつ 文字の一番最後にカンマがない
|
328
|
+
if (i == SplitData.length - 1 && msgStr.charAt(msgStr.length()-1) !=',' ){
|
329
|
+
|
330
|
+
//最後なら、一番最後に,を入れない!
|
331
|
+
|
332
|
+
//終了フラグが立っていれば、一つずつ残りデータに入れていく
|
333
|
+
leftover = leftover + "," +SplitData[i]; //前後にカンマを入れる。カンマは連続しても問題ない(カンマ区切りで抽出したものが空白になるため除外できる)が、カンマ無しで数値が繋がると問題なため。
|
334
|
+
|
335
|
+
}else{
|
336
|
+
|
337
|
+
//終了フラグが立っていれば、一つずつ残りデータに入れていく
|
338
|
+
leftover = leftover + "," +SplitData[i] + ","; //前後にカンマを入れる。カンマは連続しても問題ない(カンマ区切りで抽出したものが空白になるため除外できる)が、カンマ無しで数値が繋がると問題なため。
|
339
|
+
|
340
|
+
}
|
341
|
+
|
342
|
+
}
|
343
|
+
|
344
|
+
}
|
345
|
+
|
346
|
+
|
347
|
+
//エンドがあれば、センサのデータ配列に入れ、あまりを繰り越す
|
348
|
+
if (EndFlag){
|
349
|
+
|
350
|
+
//出力文字を定義
|
351
|
+
String OutputString = "";
|
352
|
+
|
353
|
+
//出力用にセンサーの文字を結合する
|
354
|
+
for (int i=0; i<12; i++){
|
355
|
+
OutputString = OutputString +"センサ " + String.valueOf(i) + " = " + SensorData[i] + "\n";
|
356
|
+
}
|
357
|
+
|
358
|
+
//画面に出力する
|
359
|
+
Message valueMsg = new Message();
|
360
|
+
valueMsg.what = VIEW_INPUT; //メッセージがシリアル通信のINPUTである とする
|
361
|
+
valueMsg.obj = OutputString; //Arduinoから取得したメッセージを代入
|
362
|
+
mHandler.sendMessage(valueMsg); //テキスト書き換え関数を実行する
|
363
|
+
|
364
|
+
|
365
|
+
}else{//エンドがなければ、何もせずにシリアル通信のデータを繰り越す
|
366
|
+
|
367
|
+
//Eがない場合はそのまま引き継ぐため代入。
|
368
|
+
leftover = msgStr;
|
369
|
+
|
370
|
+
}
|
371
|
+
|
372
|
+
}
|
373
|
+
```
|
15
編集22
title
CHANGED
File without changes
|
body
CHANGED
@@ -15,27 +15,31 @@
|
|
15
15
|
そこで次に、Arduinoから**複数のセンサの値**をシリアル通信で送り、Androidで受信してセンサごとの変数へ代入を行いたいです。
|
16
16
|
|
17
17
|
●問題
|
18
|
-
ただし、調べたところシリアル通信は「データを1ビットずつ連続的に送受信する通信方式」のようで
|
18
|
+
ただし、調べたところシリアル通信は「データを1ビットずつ連続的に送受信する通信方式」のようです。
|
19
|
+
そのためAndroidでデータを受け取り画面に表示すると、センサの値の途中で途切れた中途半端な状態で表示されてしまいます。
|
20
|
+
(Arduinoから1ビットずつ値を送っているため、Arduinoが送られてきたシリアル通信を読み込むタイミングによってセンサの値の途中で表示してしまっているものと考えています)
|
19
21
|
|
20
22
|
|
21
23
|
・例 センサ12個の場合
|
24
|
+
1. Arduinoから12個の値をシリアル通信で送り続ける。
|
25
|
+
(送る値を、「ランダム,0,0,0,0,0,0,0,0,0,0,0¥n」にした場合)
|
22
|
-
|
26
|
+
(一番最初をランダムな値、それ以外は0で、すべてカンマ区切り。最後に¥n)
|
27
|
+
|
23
28
|
2. Androidに表示される値は次のようになります。
|
24
29
|

|
25
30
|

|
26
31
|

|
27
32
|

|
28
33
|
|
34
|
+
(上の写真の順番は時系列に添っていませんが、更新される度に前の値の続きから表示されるので、データの欠損などはなさそうです。)
|
35
|
+
対処療法としてAndroid側にてカンマ区切りで分離しようと考えていますが、処理が複雑になってしまいうまく実装できていない状態です。(カンマ区切りに分割した後、必要な箇所は変数に代入して、¥nより後の値は次のデータ取得時に持ち越す。 といった処理がうまくできていないです。)
|
29
36
|
|
37
|
+
そもそも、USBホストケーブルで行っていたとき(下にまとめました)には、センサごとにArduinoからデータを送ってもらい、Androidでセンサごとの変数へ代入できていました。(シリアル通信ではない?)
|
30
|
-
|
38
|
+
そういった処理を最初からできたら根本から解決できるかと考え調べていますが、なかなか良い方法が分からずに困っています。
|
31
|
-
(上の写真の順番は時系列に添っていませんが、更新される度に前の画面の続きからデータが表示されるので、データの欠損などはなさそうです。)
|
32
39
|
|
33
|
-
そもそも、USBホストケーブルで行っていたとき(下にまとめました)には、センサごとにArduinoからデータを送ってもらい、Androidでセンサごとの変数へ代入できていました。
|
34
|
-
そういった処理を最初からできると思い調べていますが、なかなか良い方法が分からずに困っています。
|
35
40
|
|
36
|
-
|
37
41
|
●質問内容
|
38
|
-
**Bluetoothの
|
42
|
+
**Bluetoothの通信時に、Arduinoで読み取ったセンサの値(アナログ値の0~1024)を複数個まとめて、Androidに送る適切な方法をお教えいただけますと幸いです。**
|
39
43
|
|
40
44
|
●考え
|
41
45
|
Bluetooth時にも、USBホストケーブルと同様の「Arduinoからの送信処理」を行えば実現できそうと考えていました。
|
@@ -49,6 +53,7 @@
|
|
49
53
|
「1回のSerial.write()で送れるデータは1バイト、すなわち数値として表現できる範囲は0~255です。」
|
50
54
|
とあることから、センサごとに値を送るのは難しいのかもしれません。
|
51
55
|
|
56
|
+
現在試行錯誤の真っ最中です。
|
52
57
|
|
53
58
|
|
54
59
|
回路
|
14
変更2
title
CHANGED
File without changes
|
body
CHANGED
@@ -251,5 +251,5 @@
|
|
251
251
|
|
252
252
|
```
|
253
253
|
|
254
|
-
|
254
|
+
|
255
255
|
---
|
13
変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -55,7 +55,7 @@
|
|
55
55
|

|
56
56
|
|
57
57
|
|
58
|
-
■Bluetooth接続時のコード(簡略化のため、センサを2つ
|
58
|
+
■Bluetooth接続時のコード(簡略化のため、センサを2つだけに減らしたコードを載せました。)
|
59
59
|
|
60
60
|
Arduinoの送信部分
|
61
61
|
```C
|
12
画像の訂正
title
CHANGED
File without changes
|
body
CHANGED
@@ -45,8 +45,12 @@
|
|
45
45
|
しかし、Arduinoのacc.writeコマンドはUSBホストケーブルでの接続時でしか実行できないようでした。
|
46
46
|
そのため、シリアル通信で同様の送信方法がないかと探しております。
|
47
47
|
|
48
|
+
[このサイトより](http://d.hatena.ne.jp/kougaku-navi/20140501/p1)
|
49
|
+
「1回のSerial.write()で送れるデータは1バイト、すなわち数値として表現できる範囲は0~255です。」
|
50
|
+
とあることから、センサごとに値を送るのは難しいのかもしれません。
|
48
51
|
|
49
52
|
|
53
|
+
|
50
54
|
回路
|
51
55
|

|
52
56
|
|
@@ -248,8 +252,4 @@
|
|
248
252
|
```
|
249
253
|
|
250
254
|
---
|
251
|
-
---
|
255
|
+
---
|
252
|
-
|
253
|
-
現在、
|
254
|
-
Serial.write(buf, len)
|
255
|
-
で実行できないか試しております。
|
11
title
CHANGED
File without changes
|
body
CHANGED
@@ -245,4 +245,11 @@
|
|
245
245
|
SensorVal[0] = byteBuffer.getInt(); // 4バイト
|
246
246
|
SensorVal[1] = byteBuffer.getInt(); // 4バイト
|
247
247
|
|
248
|
-
```
|
248
|
+
```
|
249
|
+
|
250
|
+
---
|
251
|
+
---
|
252
|
+
|
253
|
+
現在、
|
254
|
+
Serial.write(buf, len)
|
255
|
+
で実行できないか試しております。
|
10
タイトルの変更
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
シリアル通信で複数のセンサの値を送るには? Arduino→Android Bluetooth接続時
|
body
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
--
|
3
3
|
|
4
4
|
●目的
|
5
|
-
ArduinoからAndroidにBluetooth接続で複数センサ
|
5
|
+
ArduinoからAndroidにBluetooth接続で複数センサの値を送りたいと考えております。
|
6
6
|
|
7
7
|
イメージ
|
8
8
|

|
@@ -12,13 +12,13 @@
|
|
12
12
|
●手段
|
13
13
|
ArduinoとAndroidのBluetooth接続は[参考サイト](https://sites.google.com/a/gclue.jp/fab-zang-docs/sumafo-lian-xie/02-arduino-android)を見て、全く同じコードで問題なく動作させることができました。
|
14
14
|
|
15
|
-
そこで次に、Arduinoから**複数のセンサ
|
15
|
+
そこで次に、Arduinoから**複数のセンサの値**をシリアル通信で送り、Androidで受信してセンサごとの変数へ代入を行いたいです。
|
16
16
|
|
17
17
|
●問題
|
18
|
-
ただし、調べたところシリアル通信は「データを1ビットずつ連続的に送受信する通信方式」のようで、Androidでデータを受け取るとセンサ
|
18
|
+
ただし、調べたところシリアル通信は「データを1ビットずつ連続的に送受信する通信方式」のようで、Androidでデータを受け取るとセンサの値の中途半端なタイミングで受け取ってしまいます。
|
19
19
|
|
20
20
|
|
21
|
-
・例 センサ
|
21
|
+
・例 センサ12個の場合
|
22
22
|
1. Arduinoから12個の値をシリアル通信で送り続ける(送る値を、一番「500±ランダム,0,0,0,~,0,0¥n」にした場合) ←(一番最初をランダムな値、それ以外は0の","区切りで計12個、最後に¥n)
|
23
23
|
2. Androidに表示される値は次のようになります。
|
24
24
|

|
@@ -30,7 +30,7 @@
|
|
30
30
|
このように、取得のタイミングがずれてしまうため、”,”区切りで分離しようとしても処理が上手く行えていない状態です。
|
31
31
|
(上の写真の順番は時系列に添っていませんが、更新される度に前の画面の続きからデータが表示されるので、データの欠損などはなさそうです。)
|
32
32
|
|
33
|
-
そもそも、USBホストケーブルで行っていたとき(下にまとめました)には、センサ
|
33
|
+
そもそも、USBホストケーブルで行っていたとき(下にまとめました)には、センサごとにArduinoからデータを送ってもらい、Androidでセンサごとの変数へ代入できていました。
|
34
34
|
そういった処理を最初からできると思い調べていますが、なかなか良い方法が分からずに困っています。
|
35
35
|
|
36
36
|
|
9
解説の追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -154,7 +154,8 @@
|
|
154
154
|
|
155
155
|
■USBホストケーブルでの通信
|
156
156
|
--
|
157
|
-
Bluetoothで無線化をする前は、USBホストケーブルでセンサ
|
157
|
+
Bluetoothで無線化をする前は、USBホストケーブルでセンサの値を送っていました。
|
158
|
+
処理は問題なく、Androidでセンサごとにデータを受け取ることができておりました。
|
158
159
|
|
159
160
|

|
160
161
|
|
8
段落
title
CHANGED
File without changes
|
body
CHANGED
@@ -51,7 +51,7 @@
|
|
51
51
|

|
52
52
|
|
53
53
|
|
54
|
-
コード(簡略化のため、センサを2つとしてまとめたものを載せました。)
|
54
|
+
■Bluetooth接続時のコード(簡略化のため、センサを2つとしてまとめたものを載せました。)
|
55
55
|
|
56
56
|
Arduinoの送信部分
|
57
57
|
```C
|
@@ -161,9 +161,8 @@
|
|
161
161
|
|
162
162
|
|
163
163
|
|
164
|
-
|
164
|
+
■USBホストケーブル接続時のコード
|
165
165
|
|
166
|
-
|
167
166
|
Arduinoの送信部分
|
168
167
|
```C
|
169
168
|
//AndroidのUSBアクセサリ接続
|
7
誤字
title
CHANGED
File without changes
|
body
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
```Arduino
|
43
43
|
acc.write(&pack, sizeof(Pack));
|
44
44
|
```
|
45
|
-
しかし、Arduinoの
|
45
|
+
しかし、Arduinoのacc.writeコマンドはUSBホストケーブルでの接続時でしか実行できないようでした。
|
46
46
|
そのため、シリアル通信で同様の送信方法がないかと探しております。
|
47
47
|
|
48
48
|
|
6
疑問点の更新
title
CHANGED
File without changes
|
body
CHANGED
@@ -37,7 +37,16 @@
|
|
37
37
|
●質問内容
|
38
38
|
**Bluetoothのシリアル通信時に、複数センサの値を送る適切な方法をお教えいただけますと幸いです。**
|
39
39
|
|
40
|
+
●考え
|
41
|
+
Bluetooth時にも、USBホストケーブルと同様の「Arduinoからの送信処理」を行えば実現できそうと考えていました。
|
42
|
+
```Arduino
|
43
|
+
acc.write(&pack, sizeof(Pack));
|
44
|
+
```
|
45
|
+
しかし、Arduinoの上のコマンドUSBホストケーブルでの接続時でしか実行できないようでした。
|
46
|
+
そのため、シリアル通信で同様の送信方法がないかと探しております。
|
40
47
|
|
48
|
+
|
49
|
+
|
41
50
|
回路
|
42
51
|

|
43
52
|
|
@@ -149,13 +158,9 @@
|
|
149
158
|
|
150
159
|

|
151
160
|
|
152
|
-
その際には次のコードで上手く動作していたのですが、
|
153
|
-
Arduinoの次のコマンドは実行できず、USBホストケーブル接続時にしか使用できないようでした。
|
154
|
-
```Arduino
|
155
|
-
acc.write(&pack, sizeof(Pack));
|
156
|
-
```
|
157
161
|
|
158
162
|
|
163
|
+
|
159
164
|
以下にコードを記載します。
|
160
165
|
|
161
166
|
|
5
段落の変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -9,10 +9,12 @@
|
|
9
9
|
|
10
10
|
|
11
11
|
|
12
|
-
●
|
12
|
+
●手段
|
13
13
|
ArduinoとAndroidのBluetooth接続は[参考サイト](https://sites.google.com/a/gclue.jp/fab-zang-docs/sumafo-lian-xie/02-arduino-android)を見て、全く同じコードで問題なく動作させることができました。
|
14
14
|
|
15
15
|
そこで次に、Arduinoから**複数のセンサーの値**をシリアル通信で送り、Androidで受信してセンサごとの変数へ代入を行いたいです。
|
16
|
+
|
17
|
+
●問題
|
16
18
|
ただし、調べたところシリアル通信は「データを1ビットずつ連続的に送受信する通信方式」のようで、Androidでデータを受け取るとセンサーの値の中途半端なタイミングで受け取ってしまいます。
|
17
19
|
|
18
20
|
|
@@ -31,6 +33,8 @@
|
|
31
33
|
そもそも、USBホストケーブルで行っていたとき(下にまとめました)には、センサーごとにArduinoからデータを送ってもらい、Androidでセンサーごとの変数へ代入できていました。
|
32
34
|
そういった処理を最初からできると思い調べていますが、なかなか良い方法が分からずに困っています。
|
33
35
|
|
36
|
+
|
37
|
+
●質問内容
|
34
38
|
**Bluetoothのシリアル通信時に、複数センサの値を送る適切な方法をお教えいただけますと幸いです。**
|
35
39
|
|
36
40
|
|
4
文章の修正m
title
CHANGED
File without changes
|
body
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
|
18
18
|
|
19
19
|
・例 センサー12個の場合
|
20
|
-
1. Arduinoから12個の値をシリアル通信で送り続ける(送る値を「500±ランダム,0,0,0,~,0,0¥n」にした場合)
|
20
|
+
1. Arduinoから12個の値をシリアル通信で送り続ける(送る値を、一番「500±ランダム,0,0,0,~,0,0¥n」にした場合) ←(一番最初をランダムな値、それ以外は0の","区切りで計12個、最後に¥n)
|
21
21
|
2. Androidに表示される値は次のようになります。
|
22
22
|

|
23
23
|

|
3
文章の修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
●問題・質問内容
|
13
13
|
ArduinoとAndroidのBluetooth接続は[参考サイト](https://sites.google.com/a/gclue.jp/fab-zang-docs/sumafo-lian-xie/02-arduino-android)を見て、全く同じコードで問題なく動作させることができました。
|
14
14
|
|
15
|
-
そこで次に、Arduinoから複数のセンサーの値をシリアル通信で送り、Androidで受信してセンサごとの変数へ代入を行いたいです。
|
15
|
+
そこで次に、Arduinoから**複数のセンサーの値**をシリアル通信で送り、Androidで受信してセンサごとの変数へ代入を行いたいです。
|
16
16
|
ただし、調べたところシリアル通信は「データを1ビットずつ連続的に送受信する通信方式」のようで、Androidでデータを受け取るとセンサーの値の中途半端なタイミングで受け取ってしまいます。
|
17
17
|
|
18
18
|
|
2
更新 文字
title
CHANGED
File without changes
|
body
CHANGED
@@ -10,10 +10,10 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
●問題・質問内容
|
13
|
-
ArduinoとAndroidのBluetooth接続は[参考サイト](https://sites.google.com/a/gclue.jp/fab-zang-docs/sumafo-lian-xie/02-arduino-android)を見て問題なく
|
13
|
+
ArduinoとAndroidのBluetooth接続は[参考サイト](https://sites.google.com/a/gclue.jp/fab-zang-docs/sumafo-lian-xie/02-arduino-android)を見て、全く同じコードで問題なく動作させることができました。
|
14
14
|
|
15
|
-
複数のセンサーの値をシリアル通信で送り、Androidでセンサごと
|
15
|
+
そこで次に、Arduinoから複数のセンサーの値をシリアル通信で送り、Androidで受信してセンサごとの変数へ代入を行いたいです。
|
16
|
-
ただし、調べたところシリアル通信は「データを1ビットずつ連続的に送受信する通信方式」のようで、Androidでデータを受け取るとセンサーの値の中途半端なタイミングで受け取ってしま
|
16
|
+
ただし、調べたところシリアル通信は「データを1ビットずつ連続的に送受信する通信方式」のようで、Androidでデータを受け取るとセンサーの値の中途半端なタイミングで受け取ってしまいます。
|
17
17
|
|
18
18
|
|
19
19
|
・例 センサー12個の場合
|
@@ -25,9 +25,10 @@
|
|
25
25
|

|
26
26
|
|
27
27
|
|
28
|
+
このように、取得のタイミングがずれてしまうため、”,”区切りで分離しようとしても処理が上手く行えていない状態です。
|
28
|
-
|
29
|
+
(上の写真の順番は時系列に添っていませんが、更新される度に前の画面の続きからデータが表示されるので、データの欠損などはなさそうです。)
|
29
30
|
|
30
|
-
USBホストケーブルで行っていたとき(下にまとめました)には、センサーごとにArduinoからデータを送ってもらい、Androidでセンサーごとの変数へ代入できていました。
|
31
|
+
そもそも、USBホストケーブルで行っていたとき(下にまとめました)には、センサーごとにArduinoからデータを送ってもらい、Androidでセンサーごとの変数へ代入できていました。
|
31
32
|
そういった処理を最初からできると思い調べていますが、なかなか良い方法が分からずに困っています。
|
32
33
|
|
33
34
|
**Bluetoothのシリアル通信時に、複数センサの値を送る適切な方法をお教えいただけますと幸いです。**
|
1
更新
title
CHANGED
File without changes
|
body
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
--
|
3
3
|
|
4
4
|
●目的
|
5
|
-
ArduinoからAndroidに複数センサーの値を送りたいと考えております。
|
5
|
+
ArduinoからAndroidにBluetooth接続で複数センサーの値を送りたいと考えております。
|
6
6
|
|
7
7
|
イメージ
|
8
8
|

|