前提・実現したいこと
赤外線センサーを2つ利用し、片方が物体を検知した回数をwhitecountで記録する。もう片方は、物体を検知したらシリアルポートにwhitecountを出力するシステムを作っています。
2つの赤外センサーとも、物体を検知するシステムは同じです。
しかし、物体を検知したらシリアルポートに出力する赤外線センサーのanalogreadの位置を変えただけで、挙動がおかしくなります。
発生している問題・エラーメッセージ
該当のソースコードで書き込むと、ソースコードにおいて、"//もし1つ目のセンサが物体を検知したら、whitecountを増やし、過去20個分のデータを書き換える。"部分の Serial.println(whitecount);は正常に出力します。しかし、
thirdaverageが常に1000になり、whitecountが出力されません。
次に、fingerdetect= analogRead(A1);をソースコードの//abcに移動させると、whitecountが出力されるようになるのですが、Serial.println(whitecount)の値自体がおかしくなります。700前後を出してきます。
私は、serial.println(whitecount)をちゃんとカウントしてほしいですし、ちゃんとwhitecountも出力してほしいです。
該当のソースコード
//1つ目のセンサが物体を検知した回数を格納 int whitecount=0; //whitedetectには、1つ目のセンサによる出力値を得る。このセンサが物体を検知した回数はwhitecountに送られる。whitepredetect[20]は、過去20個分のwhitedetectを格納する。 int whitedetect; int whitepredetect[20]; //whitepredetectの前半の平均をfirstaverageに、後半の平均をsecondaverageに入れる int firstaverage=0; int secondaverage=0; //fingerdetectには、2つ目のセンサによる出力値を得る。このセンサが物体を検知することで、whitecountをシリアルモニタに出力する。fingerredetect[20]は、過去20個分のfingerdetectを格納する。 int fingerdetect; int fingerpredetect[20]; //fignerpredetectの前半の平均をthirdaverageに、後半の平均をfourthaverageに入れる int thirdaverage=0; int fourthaverage=0; //for文で用いる int i; //時間を代入する。 unsigned long t; //過去のwhitedetectとfingerdetectの情報をどれくらい保持し続けるかを決める定数 int detectnumber=20; void setup() { Serial.begin(38400); //初期化 for(i=0;i<detectnumber;i++) { whitepredetect[i]=1000; } //初期化 for(i=0;i<detectnumber;i++) { fingerpredetect[i]=1000; } } void loop() { //1つ目の赤外線センサの出力を読み込む whitedetect= analogRead(A0); //abc //firstaverage, secondaverageを計算 for(i=0;i<detectnumber/2;i++) { firstaverage=firstaverage+whitepredetect[i]; } firstaverage=firstaverage/(detectnumber/2); for(i=detectnumber/2;i<detectnumber;i++) { secondaverage=secondaverage+whitepredetect[i]; } secondaverage=secondaverage/(detectnumber/2); //もし1つ目のセンサが物体を検知したら、whitecountを増やし、過去20個分のデータを書き換える。 if(firstaverage<700&&secondaverage>=700) { whitecount=whitecount+1; Serial.print("whitecount increased"); Serial.println(whitecount); whitedetect=600; for(i=0;i<detectnumber;i++) { whitepredetect[i]=600; } } //平均の初期化 firstaverage=0; secondaverage=0; //過去20個分のデータの更新 for(i=0;i<detectnumber;i++) { whitepredetect[detectnumber-i]=whitepredetect[detectnumber-1-i]; } whitepredetect[0]=whitedetect; //2つめのセンサを読み込む fingerdetect= analogRead(A1); //thirdaverage,fourthaverageを計算 for(i=0;i<detectnumber/2;i++) { thirdaverage=thirdaverage+fingerpredetect[i]; } thirdaverage=thirdaverage/(detectnumber/2); for(i=detectnumber/2;i<detectnumber;i++) { fourthaverage=fourthaverage+fingerpredetect[i]; } fourthaverage=fourthaverage/(detectnumber/2); //もし2つ目のセンサが物体を検知したら、whitecountを出力し、過去20個分のデータを書き換える。 if(thirdaverage<700&&fourthaverage>=700) { Serial.print("count is "); Serial.println(whitecount); fingerdetect=600; for(i=0;i<detectnumber;i++) { fingerpredetect[i]=600; } } //平均の初期化 thirdaverage=0; fourthaverage=0; //過去20個分のデータの更新 for(i=0;i<detectnumber;i++) { fingerpredetect[detectnumber-i]=fingerpredetect[detectnumber-1-i]; } fingerpredetect[0]=fingerdetect; }
試したこと
・A1をA2に書き換える→変わらず
・ブレッドボードの配線が片方おかしいのでは?→A0とA1を逆に接続→結果は変わらず
・2つ目のセンサをdigitalreadに変更、A1を7にする→だめ。fingerdetectのreadの場所をソースコードと同じ場所にすると、常に1が出力される。両方の赤外線センサに手を近づけてみたが、ずっと1が出力される。
・様々なところで[20]の配列やaverageの値を出力し、確認してみた。いろいろ試してみたのでここには試した結果をかけない。しかし、私にわかったことは、なぜanalogreadの位置が違うだけで出力が変わるのかということが全くわからないことです。analogReadで何か私がわかっていないことがあるのかもしれません。
・今回2つ赤外線センサを検知しているが、これを1つにする。すると普通に問題なし。2つにするとなぜかおかしくなる。
・プログラムコードの構成の順番を変えてみたりしたが、それに対する変化が、私の知識では理解できませんでした。
補足情報(FW/ツールのバージョンなど)
ブレッドボードの写真です。小さい抵抗が220Ω、大きい抵抗が2.7kΩです。フォトセンサはLBR127-HLDです。
https://sites.google.com/view/esruigsje/%E3%83%9B%E3%83%BC%E3%83%A0
回答1件
あなたの回答
tips
プレビュー