スケッチを書き換えました。初期値を決定するのに,10回計測して,最大値と最小値を除いたものの平均を
とる関数を作成しました。
//初期値設定用 平均
float sokutei_heikin(int m){
float Value[10];
float Max;
float Min;
float Sum;
for(int Ct=0;Ct<m;Ct++){
Value[Ct]=measureDistance_1();//距離の測定関数を呼び出す。
Serial.print(Ct);
Serial.print(" =");
Serial.println(Value[Ct]);
if(Ct == 0) {//最初の測定値を最大・最小値として保存
Max=Value[0];
Min=Value[0];
}
else {
if(Value[Ct] > Max){//取得したデータを最大値と比較して,大きければ,新たに保存
Max=Value[Ct];
}
if(Value[Ct] < Min){////取得したデータを最小値と比較して,小さければ,新たに保存
Min=Value[Ct];
}
}
Sum+=Value[Ct];/*測定値を加算*///測定値を加算していく
}
Sum=(Sum-(Max+Min))/(m-2);//最大値と最小値を除いて,平均をとる。
Serial.print("AVE");
Serial.print(" =");
Serial.println(Sum);
return Sum;/*最大値・最小値を除いた平均値を返す*/
}
sokutei_heikin(10)ということで,10回の測定の平均をとる(最大・最小を除くので実際は8回)
設定で,動かして見ましたが,一回目の測定値が,きちんと測定されてないようなので,測定に入る
一回ダミーの測定をいれsて,実際は,11回の測定でやってみました。大きな変動もなく結果は良好
でした。
今回,最大・最小値を除いた平均を計算するのに,ちょっとなやみました。測定値を全部保存したうえ
ソートして,最大値と最小値を除こうかとも思いましたが,測定値をその都度一時保存の最大値と最小
値と比較するやり方が,よかったようです。
下記が,超音波センサーから,距離を測定するための関数です。
float measureDistance_1() {
char m[50];
Serial2.write("S");//RX端子をHIGHにするのに一文字書き込む。
if (Serial2.available()){
hdr = (byte)Serial2.read();
if (hdr == 255){
data_h = (byte)Serial2.read();
data_l = (byte)Serial2.read();
chksum = (byte)Serial2.read();
if (chksum == ((hdr + data_h + data_l)&0x00FF)){
distance = data_h * 256 + data_l;//距離計算
}
}
}
delay(100);
return distance;
}
distance = data_h * 256 + data_l の部分が,距離を計算する部分です。計算するといっても,HIGHの
データとLOWのデータが,1バイトずつ送られてくるので,桁数を合わせる計算をしているだけです。
マニュアルには,下記のような記述がありました。
計測が開始されるとその結果が下記のように,4バイトのデータでおくられてきます。
0XFF 0X07 0XA1 0XA7
各データは,
0XFF はヘッダーデータ
0X07 は上位データ
0XA1 は下位データ
0XA7 はチェックサム
のようになってますので,
上位のデータと下位のデータを合わせると,
07A1
という16進数が得られますので,これを10進数に直すと,1953mmというデータが得られるようです。