質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

1170閲覧

arduinoで複数のセンサの反応時間から歩行速度を求めたい

777333555

総合スコア4

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2021/10/13 04:44

編集2021/10/20 09:57

arduinoを使用しnapion10m用のセンサと5m用のセンサと7m用のセンサの反応時間の変化からヒトの歩行速度を求めるプログラムを書いていますがブザーが鳴っていない状況です。もし改善点などが分かる方がいましたらアドバイスください。よろしくお願いします。

arduino

1#include <fastio.h> 2#include <MsTimer2.h> 3fastIoPin<3>PPR1; 4fastIoPin<4>PPR2; 5fastIoPin<5>PPR3; 6fastIoPin<6>PPR4; 7fastIoPin<7>PPR5; 8fastIoPin<10>LED_BLUE; 9fastIoPin<11>LED_GREEN; 10fastIoPin<12>LED_RED; 11#define buza 13 12unsigned int state1 = 0; 13unsigned int state2 = 0; 14unsigned int state3 = 0; 15unsigned int state4 = 0; 16unsigned int state5 = 0; 17float time_data = 0.0; 18void time_count(void); 19unsigned int lastState1 = LOW; 20unsigned int lastState2 = LOW; 21unsigned int lastState3 = LOW; 22unsigned int lastState4 = LOW; 23unsigned int lastState5 = LOW; 24unsigned long risingEdgeTime1 = 0; 25unsigned long risingEdgeTime2 = 0; 26unsigned long risingEdgeTime3 = 0; 27unsigned long risingEdgeTime4 = 0; 28unsigned long risingEdgeTime5 = 0; 29unsigned int stage1 = 0; //0=初期, 1=監視期間, 2=HIGH期間 30unsigned int stage2 = 0; //0=初期, 1=監視期間, 2=HIGH期間 31unsigned int stage3 = 0; //0=初期, 1=監視期間, 2=HIGH期間 32unsigned int stage4 = 0; //0=初期, 1=監視期間, 2=HIGH期間 33unsigned int stage5 = 0; //0=初期, 1=監視期間, 2=HIGH期間 34 35void setup() { 36 MsTimer2::set(10, value_count);//10ミリ秒ごとにtime_count関数を呼出 37 PPR1.pinMode(INPUT); 38 PPR2.pinMode(INPUT); 39 PPR3.pinMode(INPUT); 40 PPR4.pinMode(INPUT); 41 PPR5.pinMode(INPUT); 42 LED_BLUE.pinMode(OUTPUT); 43 LED_GREEN.pinMode(OUTPUT); 44 LED_RED.pinMode(OUTPUT); 45 pinMode(buza,OUTPUT); 46 Serial.begin(9600); 47 while (!Serial); 48 Serial.println ("センサが安定するまで少々お待ちください(30s)");//センサ安定起動時間 49 delay(30000); 50 MsTimer2::start(); 51} 52 53void value_count(void) { 54 state1 = digitalNoiselessRead1(3, 10, 3000); //PPR1 ピンが 0.01秒間 HIGH になっていたら,その後 3秒間 HIGH が返る 55 state2 = digitalNoiselessRead2(4, 10, 3000); //PPR2 ピンが 0.01秒間 HIGH になっていたら,その後 3秒間 HIGH が返る 56 state3 = digitalNoiselessRead3(5, 20, 3000); //PPR3 ピンが 0.02秒間 HIGH になっていたら,その後 3秒間 HIGH が返る 57 state4 = digitalNoiselessRead4(6, 20, 3000); //PPR4 ピンが 0.02秒間 HIGH になっていたら,その後 3秒間 HIGH が返る 58 state5 = digitalNoiselessRead5(7, 20, 3000); //PPR5 ピンが 0.1秒間 HIGH になっていたら,その後 3秒間 HIGH が返る 59 float t = (millis() - 30000) * 0.001; //loop開始からの経過秒 60 Serial.print(t, 2); 61 Serial.print(" "); 62 Serial.print(state1); 63 Serial.print(" "); 64 Serial.print(state2); 65 Serial.print(" "); 66 Serial.print(state3); 67 Serial.print(" "); 68 Serial.print(state4); 69 Serial.print(" "); 70 Serial.println(state5); 71} 72 73unsigned int digitalNoiselessRead1(unsigned int pin1, long monitoringPeriod1, long highPeriod1) { 74 state1 = PPR1.digitalRead(); 75 unsigned long now = millis(); 76 if (stage1 == 0 && lastState1 == LOW && state1 == HIGH) { //立ち上がり検出 77 risingEdgeTime1 = now; 78 stage1 = 1; //監視期間開始 79 } 80 lastState1 = state1; 81 if (stage1 == 1) { //監視期間中 82 if (state1 == LOW) { //ノイズだった 83 stage1 = 0; 84 } else if (now - risingEdgeTime1 >= monitoringPeriod1) { 85 stage1 = 2; //HIGH 期間へ移行 86 } else { 87 state1 = LOW; //監視期間中は LOW 88 } 89 } else if (stage1 == 2) { //HIGH期間中 90 if (now - risingEdgeTime1 <= monitoringPeriod1 + highPeriod1) { 91 state1 = HIGH; //HIGH期間中は HIGH 92 } else { 93 stage1 = 0; //HIGH期間終了 94 } 95 } 96 return state1; 97} 98 99unsigned int digitalNoiselessRead2(unsigned int pin2, long monitoringPeriod2, long highPeriod2) { 100 state2 = PPR2.digitalRead(); 101 unsigned long now = millis(); 102 if (stage2 == 0 && lastState2 == LOW && state2 == HIGH) { //立ち上がり検出 103 risingEdgeTime2 = now; 104 stage2 = 1; //監視期間開始 105 } 106 lastState2 = state2; 107 108 if (stage2 == 1) { //監視期間中 109 if (state2 == LOW) { //ノイズだった 110 stage2 = 0; 111 } else if (now - risingEdgeTime2 >= monitoringPeriod2) { 112 stage2 = 2; //HIGH 期間へ移行 113 } else { 114 state2 = LOW; //監視期間中は LOW 115 } 116 } else if (stage2 == 2) { //HIGH期間中 117 if (now - risingEdgeTime2 <= monitoringPeriod2 + highPeriod2) { 118 state2 = HIGH; //HIGH期間中は HIGH 119 } else { 120 stage2 = 0; //HIGH期間終了 121 } 122 } 123 return state2; 124} 125 126unsigned int digitalNoiselessRead3(unsigned int pin3, long monitoringPeriod3, long highPeriod3) { 127 state3 = PPR3.digitalRead(); 128 unsigned long now = millis(); 129 if (stage3 == 0 && lastState3 == LOW && state3 == HIGH) { //立ち上がり検出 130 risingEdgeTime3 = now; 131 stage3 = 1; //監視期間開始 132 } 133 lastState3 = state3; 134 135 if (stage3 == 1) { //監視期間中 136 if (state3 == LOW) { //ノイズだった 137 stage3 = 0; 138 } else if (now - risingEdgeTime3 >= monitoringPeriod3) { 139 stage3 = 2; //HIGH 期間へ移行 140 } else { 141 state3 = LOW; //監視期間中は LOW 142 } 143 } else if (stage3 == 2) { //HIGH期間中 144 if (now - risingEdgeTime3 <= monitoringPeriod3 + highPeriod3) { 145 state3 = HIGH; //HIGH期間中は HIGH 146 } else { 147 stage3 = 0; //HIGH期間終了 148 } 149 } 150 return state3; 151} 152 153unsigned int digitalNoiselessRead4(unsigned int pin4, long monitoringPeriod4, long highPeriod4) { 154 state4 = PPR4.digitalRead(); 155 unsigned long now = millis(); 156 if (stage4 == 0 && lastState4 == LOW && state4 == HIGH) { //立ち上がり検出 157 risingEdgeTime4 = now; 158 stage4 = 1; //監視期間開始 159 } 160 lastState4 = state4; 161 162 if (stage4 == 1) { //監視期間中 163 if (state4 == LOW) { //ノイズだった 164 stage4 = 0; 165 } else if (now - risingEdgeTime4 >= monitoringPeriod4) { 166 stage4 = 2; //HIGH 期間へ移行 167 } else { 168 state4 = LOW; //監視期間中は LOW 169 } 170 } else if (stage4 == 2) { //HIGH期間中 171 if (now - risingEdgeTime4 <= monitoringPeriod4 + highPeriod4) { 172 state4 = HIGH; //HIGH期間中は HIGH 173 } else { 174 stage4 = 0; //HIGH期間終了 175 } 176 } 177 return state4; 178} 179 180unsigned int digitalNoiselessRead5(unsigned int pin5, long monitoringPeriod5, long highPeriod5) { 181 state5 = PPR5.digitalRead(); 182 unsigned long now = millis(); 183 if (stage5 == 0 && lastState5 == LOW && state5 == HIGH) { //立ち上がり検出 184 risingEdgeTime5 = now; 185 stage5 = 1; //監視期間開始 186 } 187 lastState5 = state5; 188 189 if (stage5 == 1) { //監視期間中 190 if (state5 == LOW) { //ノイズだった 191 stage5 = 0; 192 } else if (now - risingEdgeTime5 >= monitoringPeriod5) { 193 stage5 = 2; //HIGH 期間へ移行 194 } else { 195 state5 = LOW; //監視期間中は LOW 196 } 197 } else if (stage5 == 2) { //HIGH期間中 198 if (now - risingEdgeTime5 <= monitoringPeriod5 + highPeriod5) { 199 state5 = HIGH; //HIGH期間中は HIGH 200 } else { 201 stage5 = 0; //HIGH期間終了 202 } 203 } 204 return state5; 205} 206 207void loop() { 208 if (state1 == LOW && state2 == LOW && state3 == LOW && state4 == LOW && state5 == LOW) { //青 00000 209 LED_RED.digitalWrite(LOW); 210 LED_GREEN.digitalWrite(HIGH); 211 LED_BLUE.digitalWrite(LOW); //青 212 } 213 else if (state1 == HIGH && state2 == HIGH && state3 == LOW && state4 == LOW && state5 == LOW) {//5m~10m黄色11000 214 LED_RED.digitalWrite(HIGH); 215 LED_GREEN.digitalWrite(LOW); 216 LED_BLUE.digitalWrite(HIGH); //黄 217 } 218 else if (state1 == HIGH && state2 == LOW && state3 == LOW && state4 == LOW && state5 == LOW) {//5m~10m黄色 10000 219 LED_RED.digitalWrite(HIGH); 220 LED_GREEN.digitalWrite(LOW); 221 LED_BLUE.digitalWrite(HIGH); //黄 222 } 223 else if (state1 == LOW && state2 == HIGH && state3 == LOW && state4 == LOW && state5 == LOW) {//5m~10m黄色 01000 224 LED_RED.digitalWrite(HIGH); 225 LED_GREEN.digitalWrite(LOW); 226 LED_BLUE.digitalWrite(HIGH); //黄 227 } 228 else if (state1 == HIGH && state2 == HIGH && state3 == HIGH && state4 == HIGH && state5 == LOW) {//5m以内赤 11110 229 digitalWrite<13>(HIGH); 230 LED_RED.digitalWrite(HIGH); 231 LED_GREEN.digitalWrite(HIGH); 232 LED_BLUE.digitalWrite(HIGH); //赤 233 } 234 //その他点灯方法記載の省略 235} 236 237 238

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/10/20 23:33

あなた以外の人が同じシステムを組んで検証する可能性は殆どないのだから、あなたが現状の情報を提供しなきゃ。 ブザーが鳴らない それはわかったけど「何をした時に」鳴らない? そもそも単純にブザーを鳴らすプログラムなら鳴ることは確認されている? ほかには? LEDもつないでいるみたいだけどその点灯状況は? printなんかも仕込んでいるみたいだけれど、それらが「こういう入力の時に、こういう反応を示す」とかいう情報はないのかしら? 同じシステムを持っていない他人にデバッグさせようというのだから、持っている情報は全部出してください。
guest

回答2

0

napionって赤外線センサーなのですね。
恐らく10mと7mと5mの位置に反応するセンサを一か所に置いて、動く(近づく?)モノの速度を割り出したいのではと推測しています。
しかし「ブザーが鳴っていない状況です」のご質問について、ピン13にHiでブザーが鳴る仕組みと思いますが、
** #define buza 13
** pinMode(buza,OUTPUT);
loop() digitalWrite<13>(HIGH);

小生が気になるのはloopのif elase ifが込み入っているので、if文でdigitalWrite<13>(HIGH);に行かないのではと思います。
音が鳴るはずの最後のelse ifをif だけにして条件の場合、音が鳴るか調べてみてください。

void loop() {
if (state1 == HIGH && state2 == HIGH && state3 == HIGH && state4 == HIGH && state5 == LOW) {//5m以内赤 11110
digitalWrite<13>(HIGH);
LED_RED.digitalWrite(HIGH);
LED_GREEN.digitalWrite(HIGH);
LED_BLUE.digitalWrite(HIGH); //赤
}
//その他点灯方法記載の省略
}

投稿2021/10/21 14:09

nossu

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

いきなりプログラムを組んで「うまくいかない」じゃなくて、単独のデバイスとして十分な性能があることを確認して、なにか問題がありそうならそれへの対策がソフト的に可能かどうか先に考えてからシステムを組む...という手順を踏んでみてはいかがですか。
センサの物理特性として使えないならソフトでなにをやろうとダメ、というのは当然です。
ギリギリのところでなんとかならないか、そういうときはソフト側の対応やその他使いこなしという言葉で表すようなことで「なんとかなる」かも知れませんが、そのためには対象を熟知することが必要なことも多いです。

プログラム的には、「同じことを何度も書かない」とか、「変数名は適切に」「グローバル変数とローカル変数で同じ名前を使うようなことはしない」あたり。

投稿2021/10/16 00:05

thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問