回答編集履歴

1

追記

2021/11/10 13:33

投稿

thkana
thkana

スコア7703

test CHANGED
@@ -33,3 +33,231 @@
33
33
  はまともに変換できないケースがでてくるでしょう。なぜだめかは「符号拡張」という言葉について調べてみるとよろしいかと思います。
34
34
 
35
35
  (ところでなぜセミコロンが2つ?)
36
+
37
+
38
+
39
+ ---
40
+
41
+ 若干意地になって...「本当に質問のままのArduinoプログラム」でもデータを切り出して取得するProcessing側プログラム
42
+
43
+ ```Processing
44
+
45
+ import processing.serial.*;
46
+
47
+
48
+
49
+ final int SENSOR_NUM = 8; //センサー数 Arduino側と同じであること
50
+
51
+ final char START_TRIG = 's'; //送信リクエスト文字 Arduino側と同じであること
52
+
53
+ final char START_CHAR = 's'; //データヘッダ Arduino側と同じであること
54
+
55
+ final char END_CHAR = 'e'; //データ終端 Arduino側と同じであること
56
+
57
+
58
+
59
+ final int REQ_PERIOD = 50; //データリクエスト周期
60
+
61
+
62
+
63
+ //この通信方法では浮動小数点数データは転送できない..,
64
+
65
+ //こともないけれど普通やらないのでデータを取る変数はint
66
+
67
+ int[] P = new int[SENSOR_NUM];
68
+
69
+ int serialTimer;
70
+
71
+ Serial myPort;
72
+
73
+
74
+
75
+ int count;
76
+
77
+ byte[] inBuf = new byte[SENSOR_NUM*2+2];
78
+
79
+
80
+
81
+ void setup() {
82
+
83
+ size(500, 500);
84
+
85
+ myPort=new Serial(this, "COM13", 57600);//こちらの環境にあわせて
86
+
87
+ delay(3000); //Arduinoの起動を待つ
88
+
89
+ serialTimer=millis();
90
+
91
+ myPort.write(START_TRIG); //リクエスト送信
92
+
93
+ }
94
+
95
+
96
+
97
+ void draw() {
98
+
99
+ if (millis()-serialTimer > REQ_PERIOD) { //送信リクエスト周期?
100
+
101
+ if (count==0) { //前回データ受信がなかった
102
+
103
+ println("NO DATA.");
104
+
105
+ } else if (count<SENSOR_NUM*2+2) {
106
+
107
+ println("TIMEOUT."); //リクエスト周期内に通信が完了しなかった
108
+
109
+ } else if (count>SENSOR_NUM*2+2) {
110
+
111
+ println("OVERRUN."); //余計な文字受信があった
112
+
113
+ }
114
+
115
+ myPort.write(START_TRIG); //リクエスト送信
116
+
117
+ serialTimer=millis();//時刻記録
118
+
119
+ count=0;//データ蓄積開始
120
+
121
+ }
122
+
123
+ while (myPort.available()!=0) { //受信済文字がある間ループ
124
+
125
+ int data=myPort.read();
126
+
127
+ if (count<SENSOR_NUM*2+2) {
128
+
129
+ //規定文字数未受信なのでデータを溜める
130
+
131
+ inBuf[count]=(byte)data;
132
+
133
+ } else {
134
+
135
+ //既に受信完了しているので表示だけ
136
+
137
+ print((char)data);
138
+
139
+ }
140
+
141
+ count++;
142
+
143
+ if (count==SENSOR_NUM*2+2) {//規定のバイト数を受信した
144
+
145
+ if (inBuf[0]!=START_CHAR || inBuf[SENSOR_NUM*2+1]!=END_CHAR) {
146
+
147
+ //正しいフォーマットでなかったので一文字捨ててやり直し
148
+
149
+ print((char)inBuf[0]);//捨てられる一文字を表示しておく
150
+
151
+ for (int i=0; i<SENSOR_NUM*2+1; i++) {
152
+
153
+ inBuf[i]=inBuf[i+1];
154
+
155
+ }
156
+
157
+ count--;
158
+
159
+ } else {
160
+
161
+ //正しいフォーマットだったので値取り込み
162
+
163
+ for (int i=0; i<SENSOR_NUM; i++) {
164
+
165
+ P[i]=((inBuf[i*2+1]<<8)&0xff00) + (inBuf[i*2+2]&0xff);
166
+
167
+ }
168
+
169
+ count++;
170
+
171
+ }
172
+
173
+ }
174
+
175
+ }
176
+
177
+
178
+
179
+ background(0);
180
+
181
+ fill(240);
182
+
183
+ textSize(24);
184
+
185
+ for (int i=0; i<SENSOR_NUM; i++) {
186
+
187
+ text(P[i], 50, 50+30*i);
188
+
189
+ }
190
+
191
+ }
192
+
193
+ ```
194
+
195
+ そして、できればこのくらいに書きたいな、というArduino側プログラム
196
+
197
+ ```Arduino
198
+
199
+ const int SENSOR_NUM = 8; //センサー数 Processing側と同じであること
200
+
201
+ const char START_TRIG = 's'; //送信リクエスト文字 Processing側と同じであること
202
+
203
+ const char START_CHAR ='s'; //データヘッダ Processing側と同じであること
204
+
205
+ const char END_CHAR ='e'; //データ終端 Processing側と同じであること
206
+
207
+
208
+
209
+ const int INTERNAL_AD = 6; //内蔵AD数 INTERNAL_AD<=SENSOR_NUMであること
210
+
211
+ const int SENSOR_PIN[INTERNAL_AD] = {A0, A1, A2, A3, A4, A5}; // 内蔵ADピンアサイン
212
+
213
+
214
+
215
+ void setup() {
216
+
217
+ Serial.begin(57600);
218
+
219
+ }
220
+
221
+
222
+
223
+ void loop() {
224
+
225
+ uint16_t ads[SENSOR_NUM];
226
+
227
+ //データ取得 (内蔵ADC)
228
+
229
+ for ( int i = 0; i < INTERNAL_AD; i++) {
230
+
231
+ ads[i] = analogRead(SENSOR_PIN[i]);
232
+
233
+ }
234
+
235
+ // 内蔵AD以外のデータ。質問に情報がないので乱数
236
+
237
+ for( int i=INTERNAL_AD;i<SENSOR_NUM; i++){
238
+
239
+ ads[i]=random(1024);
240
+
241
+ }
242
+
243
+
244
+
245
+ if (Serial.read() == START_TRIG) {//送信リクエストを受信したら
246
+
247
+ Serial.print(START_CHAR);//開始文字送信
248
+
249
+ for(int i=0;i<SENSOR_NUM;i++){//各データ送信
250
+
251
+ Serial.write(ads[i]/256);
252
+
253
+ Serial.write(ads[i]);
254
+
255
+ }
256
+
257
+ Serial.print(END_CHAR);//終端文字送信
258
+
259
+ }
260
+
261
+ }
262
+
263
+ ```