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

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

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

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

Q&A

解決済

1回答

1444閲覧

arduinoでセンサを複数使用し、閾値を時間間隔で設定しその閾値内でセンサが反応したらその閾値内のセンサ値をすべて反応したことにするプログラムが書きたい

777333555

総合スコア4

Arduino

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

0グッド

0クリップ

投稿2021/08/26 14:19

arduinoでデジタルセンサを複数使用し、閾値を時間間隔で設定しその閾値内でセンサが反応したらその閾値内のセンサ値をすべて反応したこと(HIGH)にするプログラムを書いてみたのですが、実行するとセンサ1(state1)が反応したらセンサ1だけでなくすべてのセンサがHIGHになってしまいます。センサは5つ使っているのですが、例えば、センサ1だけが反応したときにほかのセンサはHIGHにならずセンサ値を反応させるにはどのようにすればできるでしょうか。また、センサ5が動かないのも気になっています。よろしくお願いします。
例えば、センサ1だけが反応した時センサ1だけがHIGHを出力させたいですが、センサ1から5まですべてHIGHになってしまいます。また、センサ5は反応しない状況です…

出力例

7.8 0 0 0 0 0
8.0 0 0 0 0 0
8.1 0 0 0 0 0
8.2 0 0 0 0 0
8.3 0 0 0 0 0
8.4 0 0 0 0 0
8.5 0 0 0 0 0
8.6 0 0 0 0 0
8.7 0 0 0 0 0
8.8 0 0 0 0 0
8.9 0 0 0 0 0
9.0 0 0 0 0 0
9.1 1 1 1 1 1
9.2 1 1 1 1 1
9.3 1 1 1 1 1
9.4 1 1 1 1 1
9.5 1 1 1 1 1
9.6 1 1 1 1 1
9.7 1 1 1 1 1
9.8 1 1 1 1 1
9.9 1 1 1 1 1
10.0 1 1 1 1 1
10.1 1 0 0 0 0
10.2 1 1 1 1 1
10.3 1 1 1 1 1
10.4 1 1 1 1 1
10.5 1 1 1 1 1
10.6 1 1 1 1 1
10.7 1 1 1 1 1
10.8 1 1 1 1 1
10.9 1 1 1 1 1
11.0 1 1 1 1 1
11.1 1 1 1 1 1
11.2 1 0 0 0 0
11.3 1 1 1 1 1
11.4 1 1 1 1 1
11.5 1 1 1 1 1
11.6 1 1 1 1 1
11.7 1 1 1 1 1
11.8 1 1 1 1 1
11.9 1 1 1 1 1
12.0 1 1 1 1 1
12.1 1 1 1 1 1
12.2 1 1 1 1 1
12.3 1 0 0 0 0
12.4 1 1 1 1 1
12.5 1 1 1 1 1
12.6 1 1 1 1 1
12.7 1 1 1 1 1
12.8 1 1 1 1 1
12.9 1 1 1 1 1
13.0 1 1 1 1 1
13.1 1 1 1 1 1
13.2 1 1 1 1 1
13.3 1 1 1 1 1
13.4 1 0 0 0 0
13.5 0 0 0 0 0
13.6 0 0 0 0 0

arduino

1define PPR1 3 //センサpin番号 2define PPR2 4 3define PPR3 5 4define PPR4 6 5define PPR5 7 6define buza_Pin 13 //ブザー 7define LED_RED 12 //赤 8define LED_GERRN 11 //緑 9define LED_BLUE 10 //青 10float time; 11 12void setup() { 13pinMode(PPR1, INPUT); 14pinMode(PPR2, INPUT); 15pinMode(PPR3, INPUT); 16pinMode(PPR4, INPUT); 17pinMode(PPR5, INPUT); 18pinMode(13, OUTPUT); 19pinMode(12, OUTPUT); 20pinMode(11, OUTPUT); 21pinMode(10, OUTPUT); 22Serial.begin(9600); 23while (!Serial); 24Serial.println ("センサが安定するまで少々お待ちください(30s)");//センサ安定起動時間 25delay(30000); 26} 27 28void loop() { 29int state1 = digitalNoiselessRead1(PPR1, 100, 1000); //PPR1 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る 30int state2 = digitalNoiselessRead2(PPR2, 100, 1000); //PPR2 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る 31int state3 = digitalNoiselessRead3(PPR3, 100, 1000); //PPR3 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る 32int state4 = digitalNoiselessRead4(PPR4, 100, 1000); //PPR4 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る 33int state5 = digitalNoiselessRead5(PPR5, 100, 1000); //PPR5 ピンが 0.1秒間 HIGH になっていたら,その後 1秒間 HIGH が返る 34//表示 35float t = (millis() - 30000) * 0.001; //loop開始からの経過秒 36Serial.print(t,1); 37Serial.print(" "); 38Serial.print(state1); 39Serial.print(" "); 40Serial.print(state2); 41Serial.print(" "); 42Serial.print(state3); 43Serial.print(" "); 44Serial.print(state4); 45Serial.print(" "); 46Serial.println(state5); 47//LED 48if (state5 == HIGH){//センサ5起動時 49//tone(buza_Pin, 988); 50digitalWrite(12, HIGH); 51digitalWrite(11, LOW); 52digitalWrite(10, LOW); //LED白 53}else if(state1 == HIGH || state2 == HIGH){//センサ1か2起動時 54noTone(buza_Pin); 55digitalWrite(12, HIGH); 56digitalWrite(11, LOW); 57digitalWrite(10, HIGH); //LED黄 58}else if(state3 == HIGH || state4 == HIGH){//センサ3か4起動時 59// tone(buza_Pin, 988); 60digitalWrite(12, HIGH); 61digitalWrite(11, HIGH); 62digitalWrite(10, HIGH); //LED赤 63}else{//センサが反応しないとき 64noTone(buza_Pin); 65digitalWrite(12, LOW); 66digitalWrite(11, HIGH); 67digitalWrite(10, LOW); //LED青 68} 69delay(100);//0.1s待つ 70} 71 72int lastState = LOW; 73unsigned long risingEdgeTime = 0; 74int stage = 0; //0=初期, 1=監視期間, 2=HIGH期間 75 76// pin からの入力が, 立ち上がりから monitoringPeriod の間 HIGH になった場合のみ 77// highPeriod の間 強制的に HIGH を返す. 78// ( monitoringPeriod の間は LOW を返す. ) 79// パラメータ: 80// pin ピン番号 81// monitoringPeriod 監視期間[ms] 82// highPeriod HIGH期間[ms] 83// 返り値: 84// HIGH または LOW 85int digitalNoiselessRead1(int pin1, long monitoringPeriod, long highPeriod) { 86 87int state1 = digitalRead(pin1); 88unsigned long now = millis(); 89if(stage == 0 && lastState == LOW && state1 == HIGH) { //立ち上がり検出 90risingEdgeTime = now; 91stage = 1; //監視期間開始 92} 93lastState = state1; 94 95if(stage == 1) { //監視期間中 96if(state1 == LOW) { //ノイズだった 97stage = 0; 98} else if(now-risingEdgeTime >= monitoringPeriod) { 99stage = 2; //HIGH 期間へ移行 100} else { 101state1 = LOW; //監視期間中は LOW 102} 103} else if(stage == 2) { //HIGH期間中 104if(now-risingEdgeTime <= monitoringPeriod+highPeriod) { 105state1 = HIGH; //HIGH期間中は HIGH 106} else { 107stage = 0; //HIGH期間終了 108} 109} 110return state1; 111} 112 113int digitalNoiselessRead2(int pin, long monitoringPeriod, long highPeriod) { 114 115int state2 = digitalRead(pin); 116unsigned long now = millis(); 117if(stage == 0 && lastState == LOW && state2 == HIGH) { //立ち上がり検出 118risingEdgeTime = now; 119stage = 1; //監視期間開始 120} 121lastState = state2; 122 123if(stage == 1) { //監視期間中 124if(state2 == LOW) { //ノイズだった 125stage = 0; 126} else if(now-risingEdgeTime >= monitoringPeriod) { 127stage = 2; //HIGH 期間へ移行 128} else { 129state2 = LOW; //監視期間中は LOW 130} 131} else if(stage == 2) { //HIGH期間中 132if(now-risingEdgeTime <= monitoringPeriod+highPeriod) { 133state2 = HIGH; //HIGH期間中は HIGH 134} else { 135stage = 0; //HIGH期間終了 136} 137} 138return state2; 139} 140 141int digitalNoiselessRead3(int pin, long monitoringPeriod, long highPeriod) { 142 143int state3 = digitalRead(pin); 144unsigned long now = millis(); 145if(stage == 0 && lastState == LOW && state3 == HIGH) { //立ち上がり検出 146risingEdgeTime = now; 147stage = 1; //監視期間開始 148} 149lastState = state3; 150 151if(stage == 1) { //監視期間中 152if(state3 == LOW) { //ノイズだった 153stage = 0; 154} else if(now-risingEdgeTime >= monitoringPeriod) { 155stage = 2; //HIGH 期間へ移行 156} else { 157state3 = LOW; //監視期間中は LOW 158} 159} else if(stage == 2) { //HIGH期間中 160if(now-risingEdgeTime <= monitoringPeriod+highPeriod) { 161state3 = HIGH; //HIGH期間中は HIGH 162} else { 163stage = 0; //HIGH期間終了 164} 165} 166return state3; 167} 168 169int digitalNoiselessRead4(int pin, long monitoringPeriod, long highPeriod) { 170 171int state4 = digitalRead(pin); 172unsigned long now = millis(); 173if(stage == 0 && lastState == LOW && state4 == HIGH) { //立ち上がり検出 174risingEdgeTime = now; 175stage = 1; //監視期間開始 176} 177lastState = state4; 178 179if(stage == 1) { //監視期間中 180if(state4 == LOW) { //ノイズだった 181stage = 0; 182} else if(now-risingEdgeTime >= monitoringPeriod) { 183stage = 2; //HIGH 期間へ移行 184} else { 185state4 = LOW; //監視期間中は LOW 186} 187} else if(stage == 2) { //HIGH期間中 188if(now-risingEdgeTime <= monitoringPeriod+highPeriod) { 189state4 = HIGH; //HIGH期間中は HIGH 190} else { 191stage = 0; //HIGH期間終了 192} 193} 194return state4; 195} 196 197int digitalNoiselessRead5(int pin, long monitoringPeriod, long highPeriod) { 198 199int state5 = digitalRead(pin); 200unsigned long now = millis(); 201if(stage == 0 && lastState == LOW && state5 == HIGH) { //立ち上がり検出 202risingEdgeTime = now; 203stage = 1; //監視期間開始 204} 205lastState = state5; 206 207if(stage == 1) { //監視期間中 208if(state5 == LOW) { //ノイズだった 209stage = 0; 210} else if(now-risingEdgeTime >= monitoringPeriod) { 211stage = 2; //HIGH 期間へ移行 212} else { 213state5 = LOW; //監視期間中は LOW 214} 215} else if(stage == 2) { //HIGH期間中 216if(now-risingEdgeTime <= monitoringPeriod+highPeriod) { 217state5 = HIGH; //HIGH期間中は HIGH 218} else { 219stage = 0; //HIGH期間終了 220} 221} 222return state5; 223}

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

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

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

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

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

y_waiwai

2021/08/26 14:22

質問文は編集できます 無駄に質問建てないで、追記修正しよう
777333555

2021/08/26 14:23

ごめんなさい。 よろしくお願いいたします。
777333555

2021/08/26 14:57

出来ました。ありがとうございます。 もう一つ質問なのですが、デジタルセンサの回路でコンデンサと抵抗を片方の足をOUTに、片方の足をGNDにして接続しているのですが、こうすることでセンサの反応時間が遅くなることはありますか?もしそうであれば最も安定する回路について教えていただきたいです。よろしくお願いします。10m用のセンサと5m用のセンサを使用しているのですが、10m用のセンサの方が反応が悪く、10m用のセンサと5m用のセンサであまり反応時間の差が出ていない状況です。反応時間の差からヒトの歩行速度とかも最終的に求められるようになりたいと考えています。解決方法をもし知っていれば教えていただきたいです。よろしくお願いします。
guest

回答1

0

ベストアンサー

あんまし詳しく見てませんが、

if(stage == 0 && lastState == LOW && state1 == HIGH) { //立ち上がり検出

stage とlastState はグローバル変数で、すべてのセンサで共通となってしまってます。
これがまずいのでは

投稿2021/08/26 14:26

y_waiwai

総合スコア87774

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

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

777333555

2021/08/26 14:49

出来ました。ありがとうございます。 もう一つ質問なのですが、デジタルセンサの回路でコンデンサと抵抗を片方の足をOUTに、片方の足をGNDにして接続しているのですが、こうすることでセンサの反応時間が遅くなることはありますか?もしそうであれば最も安定する回路について教えていただきたいです。よろしくお願いします。10m用のセンサと5m用のセンサを使用しているのですが、10m用のセンサの方が反応が悪く、10m用のセンサと5m用のセンサであまり反応時間の差が出ていない状況です。反応時間の差からヒトの歩行速度とかも最終的に求められるようになりたいと考えています。解決方法をもし知っていれば教えていただきたいです。よろしくお願いします。
y_waiwai

2021/08/26 15:08

コンデンサを入れると反応は遅くなります ましかし、そのセンサの応答速度がそんなに必要なのかを検討したほうがいいかと思います このセンサでモータを動かす、としたら、 センサの応答速度をいかに早くしたところで、モータの回転変化に秒単位の時間がかかる、という状況では全く無意味になりますわな。
777333555

2021/08/26 15:22

やっぱりそうなんですね。人をセンサに向かって歩行させ、10m用のセンサ外ではLEDを青、5mから10mの間では黄色、5m以内では赤にするシステムを作っているのですが、どおりでなかなかLEDの色が変わらないと思いました。抵抗の大きさは関係ないのでしょうか。現在は100kΩの抵抗を使っているのですが、10kΩの方が反応がいいとかありますか?
777333555

2021/08/26 15:28

センサはAMN34111、AMN31111を使用しています
y_waiwai

2021/08/26 15:32

時定数、でぐぐればいいかと。 そういうのを本気で作るなら、オシロスコープを用意して実際の波形がどうなるか見てみればどうでしょうか。想像とか推測が入る状態では、まともなもんはできませんよ #そのはなしだと、もちっと根本的なところに間違いか勘違いがありそうなきが
777333555

2021/08/26 15:45

参考になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問