teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

修正しました.あとは13pinがうまく作動しないです…

2021/10/20 09:57

投稿

777333555
777333555

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- arduinoを使用しnapion10m用のセンサと5m用のセンサと7m用のセンサの反応時間の変化からヒトの歩行速度を求めるプログラムを書いていますが10m用のセンサの反応速度遅く実験がうまくいっていない状況です。もし改善点などが分かる方がいましたらアドバイスください。よろしくお願いします。
1
+ arduinoを使用しnapion10m用のセンサと5m用のセンサと7m用のセンサの反応時間の変化からヒトの歩行速度を求めるプログラムを書いていますがブザーっていない状況です。もし改善点などが分かる方がいましたらアドバイスください。よろしくお願いします。
2
2
 
3
3
  ```arduino
4
4
  #include <fastio.h>

1

修正しました.あとは13pinがうまく作動しないです…

2021/10/20 09:57

投稿

777333555
777333555

スコア4

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 "fastio.h"
4
+ #include <fastio.h>
5
- #include "MsTimer2.h"
5
+ #include <MsTimer2.h>
6
- const int PPR1 = 3; //センサpin番号
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
- const int buza_Pin = 13; //ブザー
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
- const int LED_RED = 12; //赤
13
+ fastIoPin<12>LED_RED;
13
- const int LED_GERRN = 11;//緑
14
- const int LED_BLUE = 10; //青
15
- float time;
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(100, value_count);//100ミリ秒ごとにtime_count関数を呼出
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
- DDRD = B00000111; //センサ
45
+ LED_BLUE.pinMode(OUTPUT);
42
- DDRB = 0b00111100; //ブザー、LED
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
- unsigned int state1 = digitalNoiselessRead1(3, 100, 3000); //PPR1 ピンが 0.1秒間 HIGH になっていたら,その後 2秒間 HIGH が返る
57
+ state1 = digitalNoiselessRead1(3, 10, 3000); //PPR1 ピンが 0.01秒間 HIGH になっていたら,その後 3秒間 HIGH が返る
52
- unsigned int state2 = digitalNoiselessRead2(4, 100, 3000); //PPR2 ピンが 0.1秒間 HIGH になっていたら,その後 2秒間 HIGH が返る
58
+ state2 = digitalNoiselessRead2(4, 10, 3000); //PPR2 ピンが 0.01秒間 HIGH になっていたら,その後 3秒間 HIGH が返る
53
- unsigned int state3 = digitalNoiselessRead3(5, 100, 3000); //PPR3 ピンが 0.1秒間 HIGH になっていたら,その後 2秒間 HIGH が返る
59
+ state3 = digitalNoiselessRead3(5, 20, 3000); //PPR3 ピンが 0.02秒間 HIGH になっていたら,その後 3秒間 HIGH が返る
54
- unsigned int state4 = digitalNoiselessRead4(6, 100, 3000); //PPR4 ピンが 0.1秒間 HIGH になっていたら,その後 2秒間 HIGH が返る
60
+ state4 = digitalNoiselessRead4(6, 20, 3000); //PPR4 ピンが 0.02秒間 HIGH になっていたら,その後 3秒間 HIGH が返る
55
- unsigned int state5 = digitalNoiselessRead5(7, 100, 3000); //PPR5 ピンが 0.1秒間 HIGH になっていたら,その後 2秒間 HIGH が返る
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, 1);
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<3>();
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<4>();
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
- //3-5は省略
134
+ stage3 = 1; //監視期間開始
135
+ }
136
+ lastState3 = state3;
128
137
 
138
+ if (stage3 == 1) { //監視期間中
129
- void loop() {
139
+ if (state3 == LOW) { //ノイズだった
130
- while (1) {
140
+ stage3 = 0;
141
+ } else if (now - risingEdgeTime3 >= monitoringPeriod3) {
131
- //LED//
142
+ stage3 = 2; //HIGH 期間へ移行
132
- if (state1 == LOW && state2 == LOW && state3 == LOW && state4 == LOW && state5 == LOW) {
133
- noTone(buza_Pin);
143
+ } else {
134
- digitalWrite<12>(LOW);
144
+ state3 = LOW; //監視期間中は LOW
135
- digitalWrite<11>(HIGH);
136
- digitalWrite<10>(LOW);
137
145
  }
146
+ } else if (stage3 == 2) { //HIGH期間中
138
- else if (state1 == HIGH && state2 == HIGH && state3 == LOW && state4 == LOW && state5 == LOW) {//5m~10m黄色
147
+ if (now - risingEdgeTime3 <= monitoringPeriod3 + highPeriod3) {
148
+ state3 = HIGH; //HIGH期間中は HIGH
139
- noTone(buza_Pin);
149
+ } else {
140
- digitalWrite<12>(HIGH);
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
  ```