質問編集履歴
2
修正しました.あとは13pinがうまく作動しないです…
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
arduinoを使用しnapion10m用のセンサと5m用のセンサと7m用のセンサの反応時間の変化からヒトの歩行速度を求めるプログラムを書いていますが
|
1
|
+
arduinoを使用しnapion10m用のセンサと5m用のセンサと7m用のセンサの反応時間の変化からヒトの歩行速度を求めるプログラムを書いていますがブザーが鳴っていない状況です。もし改善点などが分かる方がいましたらアドバイスください。よろしくお願いします。
|
2
2
|
|
3
3
|
```arduino
|
4
4
|
#include <fastio.h>
|
1
修正しました.あとは13pinがうまく作動しないです…
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,18 +1,17 @@
|
|
1
1
|
arduinoを使用しnapion10m用のセンサと5m用のセンサと7m用のセンサの反応時間の変化からヒトの歩行速度を求めるプログラムを書いていますが10m用のセンサの反応速度が遅く実験がうまくいっていない状況です。もし改善点などが分かる方がいましたらアドバイスください。よろしくお願いします。
|
2
2
|
|
3
3
|
```arduino
|
4
|
-
#include
|
4
|
+
#include <fastio.h>
|
5
|
-
#include
|
5
|
+
#include <MsTimer2.h>
|
6
|
-
|
6
|
+
fastIoPin<3>PPR1;
|
7
|
-
const int PPR2 = 4; //センサpin番号
|
8
|
-
const int PPR3 = 5; //センサpin番号
|
9
|
-
const int PPR4 = 6; //センサpin番号
|
10
|
-
const int PPR5 = 7; //センサpin番号
|
11
|
-
|
7
|
+
fastIoPin<4>PPR2;
|
8
|
+
fastIoPin<5>PPR3;
|
9
|
+
fastIoPin<6>PPR4;
|
10
|
+
fastIoPin<7>PPR5;
|
11
|
+
fastIoPin<10>LED_BLUE;
|
12
|
+
fastIoPin<11>LED_GREEN;
|
12
|
-
|
13
|
+
fastIoPin<12>LED_RED;
|
13
|
-
const int LED_GERRN = 11;//緑
|
14
|
-
const int LED_BLUE = 10; //青
|
15
|
-
|
14
|
+
#define buza 13
|
16
15
|
unsigned int state1 = 0;
|
17
16
|
unsigned int state2 = 0;
|
18
17
|
unsigned int state3 = 0;
|
@@ -28,7 +27,7 @@
|
|
28
27
|
unsigned long risingEdgeTime1 = 0;
|
29
28
|
unsigned long risingEdgeTime2 = 0;
|
30
29
|
unsigned long risingEdgeTime3 = 0;
|
31
|
-
unsigned long risingEdgeTime4 = 0;
|
30
|
+
unsigned long risingEdgeTime4 = 0;
|
32
31
|
unsigned long risingEdgeTime5 = 0;
|
33
32
|
unsigned int stage1 = 0; //0=初期, 1=監視期間, 2=HIGH期間
|
34
33
|
unsigned int stage2 = 0; //0=初期, 1=監視期間, 2=HIGH期間
|
@@ -37,9 +36,16 @@
|
|
37
36
|
unsigned int stage5 = 0; //0=初期, 1=監視期間, 2=HIGH期間
|
38
37
|
|
39
38
|
void setup() {
|
40
|
-
MsTimer2::set(
|
39
|
+
MsTimer2::set(10, value_count);//10ミリ秒ごとにtime_count関数を呼出
|
40
|
+
PPR1.pinMode(INPUT);
|
41
|
+
PPR2.pinMode(INPUT);
|
42
|
+
PPR3.pinMode(INPUT);
|
43
|
+
PPR4.pinMode(INPUT);
|
44
|
+
PPR5.pinMode(INPUT);
|
41
|
-
|
45
|
+
LED_BLUE.pinMode(OUTPUT);
|
42
|
-
|
46
|
+
LED_GREEN.pinMode(OUTPUT);
|
47
|
+
LED_RED.pinMode(OUTPUT);
|
48
|
+
pinMode(buza,OUTPUT);
|
43
49
|
Serial.begin(9600);
|
44
50
|
while (!Serial);
|
45
51
|
Serial.println ("センサが安定するまで少々お待ちください(30s)");//センサ安定起動時間
|
@@ -48,13 +54,13 @@
|
|
48
54
|
}
|
49
55
|
|
50
56
|
void value_count(void) {
|
51
|
-
|
57
|
+
state1 = digitalNoiselessRead1(3, 10, 3000); //PPR1 ピンが 0.01秒間 HIGH になっていたら,その後 3秒間 HIGH が返る
|
52
|
-
|
58
|
+
state2 = digitalNoiselessRead2(4, 10, 3000); //PPR2 ピンが 0.01秒間 HIGH になっていたら,その後 3秒間 HIGH が返る
|
53
|
-
|
59
|
+
state3 = digitalNoiselessRead3(5, 20, 3000); //PPR3 ピンが 0.02秒間 HIGH になっていたら,その後 3秒間 HIGH が返る
|
54
|
-
|
60
|
+
state4 = digitalNoiselessRead4(6, 20, 3000); //PPR4 ピンが 0.02秒間 HIGH になっていたら,その後 3秒間 HIGH が返る
|
55
|
-
|
61
|
+
state5 = digitalNoiselessRead5(7, 20, 3000); //PPR5 ピンが 0.1秒間 HIGH になっていたら,その後 3秒間 HIGH が返る
|
56
62
|
float t = (millis() - 30000) * 0.001; //loop開始からの経過秒
|
57
|
-
Serial.print(t,
|
63
|
+
Serial.print(t, 2);
|
58
64
|
Serial.print(" ");
|
59
65
|
Serial.print(state1);
|
60
66
|
Serial.print(" ");
|
@@ -67,18 +73,14 @@
|
|
67
73
|
Serial.println(state5);
|
68
74
|
}
|
69
75
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
76
|
unsigned int digitalNoiselessRead1(unsigned int pin1, long monitoringPeriod1, long highPeriod1) {
|
74
|
-
state1 = digitalRead
|
77
|
+
state1 = PPR1.digitalRead();
|
75
78
|
unsigned long now = millis();
|
76
79
|
if (stage1 == 0 && lastState1 == LOW && state1 == HIGH) { //立ち上がり検出
|
77
80
|
risingEdgeTime1 = now;
|
78
81
|
stage1 = 1; //監視期間開始
|
79
82
|
}
|
80
83
|
lastState1 = state1;
|
81
|
-
|
82
84
|
if (stage1 == 1) { //監視期間中
|
83
85
|
if (state1 == LOW) { //ノイズだった
|
84
86
|
stage1 = 0;
|
@@ -98,7 +100,7 @@
|
|
98
100
|
}
|
99
101
|
|
100
102
|
unsigned int digitalNoiselessRead2(unsigned int pin2, long monitoringPeriod2, long highPeriod2) {
|
101
|
-
state2 = digitalRead
|
103
|
+
state2 = PPR2.digitalRead();
|
102
104
|
unsigned long now = millis();
|
103
105
|
if (stage2 == 0 && lastState2 == LOW && state2 == HIGH) { //立ち上がり検出
|
104
106
|
risingEdgeTime2 = now;
|
@@ -124,24 +126,117 @@
|
|
124
126
|
return state2;
|
125
127
|
}
|
126
128
|
|
129
|
+
unsigned int digitalNoiselessRead3(unsigned int pin3, long monitoringPeriod3, long highPeriod3) {
|
130
|
+
state3 = PPR3.digitalRead();
|
131
|
+
unsigned long now = millis();
|
132
|
+
if (stage3 == 0 && lastState3 == LOW && state3 == HIGH) { //立ち上がり検出
|
133
|
+
risingEdgeTime3 = now;
|
127
|
-
//
|
134
|
+
stage3 = 1; //監視期間開始
|
135
|
+
}
|
136
|
+
lastState3 = state3;
|
128
137
|
|
138
|
+
if (stage3 == 1) { //監視期間中
|
129
|
-
|
139
|
+
if (state3 == LOW) { //ノイズだった
|
130
|
-
|
140
|
+
stage3 = 0;
|
141
|
+
} else if (now - risingEdgeTime3 >= monitoringPeriod3) {
|
131
|
-
|
142
|
+
stage3 = 2; //HIGH 期間へ移行
|
132
|
-
if (state1 == LOW && state2 == LOW && state3 == LOW && state4 == LOW && state5 == LOW) {
|
133
|
-
|
143
|
+
} else {
|
134
|
-
|
144
|
+
state3 = LOW; //監視期間中は LOW
|
135
|
-
digitalWrite<11>(HIGH);
|
136
|
-
digitalWrite<10>(LOW);
|
137
145
|
}
|
146
|
+
} else if (stage3 == 2) { //HIGH期間中
|
138
|
-
|
147
|
+
if (now - risingEdgeTime3 <= monitoringPeriod3 + highPeriod3) {
|
148
|
+
state3 = HIGH; //HIGH期間中は HIGH
|
139
|
-
|
149
|
+
} else {
|
140
|
-
|
150
|
+
stage3 = 0; //HIGH期間終了
|
141
|
-
digitalWrite<11>(LOW);
|
142
|
-
digitalWrite<10>(HIGH);
|
143
151
|
}
|
144
|
-
//その他LEDの点滅方法を30通り記載
|
145
152
|
}
|
153
|
+
return state3;
|
146
154
|
}
|
155
|
+
|
156
|
+
unsigned int digitalNoiselessRead4(unsigned int pin4, long monitoringPeriod4, long highPeriod4) {
|
157
|
+
state4 = PPR4.digitalRead();
|
158
|
+
unsigned long now = millis();
|
159
|
+
if (stage4 == 0 && lastState4 == LOW && state4 == HIGH) { //立ち上がり検出
|
160
|
+
risingEdgeTime4 = now;
|
161
|
+
stage4 = 1; //監視期間開始
|
162
|
+
}
|
163
|
+
lastState4 = state4;
|
164
|
+
|
165
|
+
if (stage4 == 1) { //監視期間中
|
166
|
+
if (state4 == LOW) { //ノイズだった
|
167
|
+
stage4 = 0;
|
168
|
+
} else if (now - risingEdgeTime4 >= monitoringPeriod4) {
|
169
|
+
stage4 = 2; //HIGH 期間へ移行
|
170
|
+
} else {
|
171
|
+
state4 = LOW; //監視期間中は LOW
|
172
|
+
}
|
173
|
+
} else if (stage4 == 2) { //HIGH期間中
|
174
|
+
if (now - risingEdgeTime4 <= monitoringPeriod4 + highPeriod4) {
|
175
|
+
state4 = HIGH; //HIGH期間中は HIGH
|
176
|
+
} else {
|
177
|
+
stage4 = 0; //HIGH期間終了
|
178
|
+
}
|
179
|
+
}
|
180
|
+
return state4;
|
181
|
+
}
|
182
|
+
|
183
|
+
unsigned int digitalNoiselessRead5(unsigned int pin5, long monitoringPeriod5, long highPeriod5) {
|
184
|
+
state5 = PPR5.digitalRead();
|
185
|
+
unsigned long now = millis();
|
186
|
+
if (stage5 == 0 && lastState5 == LOW && state5 == HIGH) { //立ち上がり検出
|
187
|
+
risingEdgeTime5 = now;
|
188
|
+
stage5 = 1; //監視期間開始
|
189
|
+
}
|
190
|
+
lastState5 = state5;
|
191
|
+
|
192
|
+
if (stage5 == 1) { //監視期間中
|
193
|
+
if (state5 == LOW) { //ノイズだった
|
194
|
+
stage5 = 0;
|
195
|
+
} else if (now - risingEdgeTime5 >= monitoringPeriod5) {
|
196
|
+
stage5 = 2; //HIGH 期間へ移行
|
197
|
+
} else {
|
198
|
+
state5 = LOW; //監視期間中は LOW
|
199
|
+
}
|
200
|
+
} else if (stage5 == 2) { //HIGH期間中
|
201
|
+
if (now - risingEdgeTime5 <= monitoringPeriod5 + highPeriod5) {
|
202
|
+
state5 = HIGH; //HIGH期間中は HIGH
|
203
|
+
} else {
|
204
|
+
stage5 = 0; //HIGH期間終了
|
205
|
+
}
|
206
|
+
}
|
207
|
+
return state5;
|
208
|
+
}
|
209
|
+
|
210
|
+
void loop() {
|
211
|
+
if (state1 == LOW && state2 == LOW && state3 == LOW && state4 == LOW && state5 == LOW) { //青 00000
|
212
|
+
LED_RED.digitalWrite(LOW);
|
213
|
+
LED_GREEN.digitalWrite(HIGH);
|
214
|
+
LED_BLUE.digitalWrite(LOW); //青
|
215
|
+
}
|
216
|
+
else if (state1 == HIGH && state2 == HIGH && state3 == LOW && state4 == LOW && state5 == LOW) {//5m~10m黄色11000
|
217
|
+
LED_RED.digitalWrite(HIGH);
|
218
|
+
LED_GREEN.digitalWrite(LOW);
|
219
|
+
LED_BLUE.digitalWrite(HIGH); //黄
|
220
|
+
}
|
221
|
+
else if (state1 == HIGH && state2 == LOW && state3 == LOW && state4 == LOW && state5 == LOW) {//5m~10m黄色 10000
|
222
|
+
LED_RED.digitalWrite(HIGH);
|
223
|
+
LED_GREEN.digitalWrite(LOW);
|
224
|
+
LED_BLUE.digitalWrite(HIGH); //黄
|
225
|
+
}
|
226
|
+
else if (state1 == LOW && state2 == HIGH && state3 == LOW && state4 == LOW && state5 == LOW) {//5m~10m黄色 01000
|
227
|
+
LED_RED.digitalWrite(HIGH);
|
228
|
+
LED_GREEN.digitalWrite(LOW);
|
229
|
+
LED_BLUE.digitalWrite(HIGH); //黄
|
230
|
+
}
|
231
|
+
else if (state1 == HIGH && state2 == HIGH && state3 == HIGH && state4 == HIGH && state5 == LOW) {//5m以内赤 11110
|
232
|
+
digitalWrite<13>(HIGH);
|
233
|
+
LED_RED.digitalWrite(HIGH);
|
234
|
+
LED_GREEN.digitalWrite(HIGH);
|
235
|
+
LED_BLUE.digitalWrite(HIGH); //赤
|
236
|
+
}
|
237
|
+
//その他点灯方法記載の省略
|
238
|
+
}
|
239
|
+
|
240
|
+
|
241
|
+
|
147
242
|
```
|