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

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

新規登録して質問してみよう
ただいま回答率
85.35%
シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Arduino

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

Q&A

解決済

1回答

1691閲覧

analogreadの位置によって、arduinoの挙動が大きく変わる

yuga1223

総合スコア2

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Arduino

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

0グッド

0クリップ

投稿2021/08/16 16:05

編集2021/08/16 23:40

前提・実現したいこと

赤外線センサーを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

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

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

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

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

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

y_waiwai

2021/08/16 22:39

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答1

0

ベストアンサー

一番悪そうな所は

for(i=0;i<detectnumber;i++)
{
whitepredetect[detectnumber-i]=whitepredetect[detectnumber-1-i];
}

for(i=0;i<detectnumber;i++)
{
fingerpredetect[detectnumber-i]=fingerpredetect[detectnumber-1-i];
}

これだと、whitepredetect[19]の次に割り当てられた変数値が書き換えられてしまいます。

つまり、

for(i=1;//略

です。

そして、ちょっとやりたい事が判らないのだが、

if(thirdaverage<700&&fourthaverage>=700) {
Serial.print("count is ");
Serial.println(whitecount);

後半部はfinger_countをするのではないの?
何故、関係無いwhitecountを表示するのでしょうか?

これは

static int finger_count=0; if(thirdaverage<700&&fourthaverage>=700) { Serial.print("finger_count is "); Serial.println(++finger_count);

では?

投稿2021/08/16 21:16

nac_tnk

総合スコア494

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

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

yuga1223

2021/08/16 23:50

回答ありがとうございます! 後半はfingercountではなく、whitecountを出力したいです。 fingercountは数えていないです。
yuga1223

2021/08/17 00:09

forのところ、おかしいですね。 つい間違えていました。
yuga1223

2021/08/17 00:17

forのところを直したらいけました! 完全にforのところを見落としていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問