2016-05-26 15 views
0

良い日、私は使用している超音波センサーのコードがありますが、結果は正確ではなく、ターゲットからの距離をセンチメートルで表示したいと思います。arduino unoと超音波センサーの結果が不正確

#include <LiquidCrystal.h> //Load Liquid Crystal Library 
LiquidCrystal LCD(10, 9, 5, 4, 3, 2); //Create Liquid Crystal Object called LCD 

int trigPin=13; //Sensor Trip pin connected to Arduino pin 13 
int echoPin=11; //Sensor Echo pin connected to Arduino pin 11 
int myCounter=0; //declare your variable myCounter and set to 0 
int servoControlPin=6; //Servo control line is connected to pin 6 
float pingTime; //time for ping to travel from sensor to target and return 
float targetDistance; //Distance to Target in inches 
float speedOfSound=776.5; //Speed of sound in miles per hour when temp is 77 degrees. 

void setup() { 

Serial.begin(9600); 
pinMode(trigPin, OUTPUT); 
pinMode(echoPin, INPUT); 

LCD.begin(16,2); //Tell Arduino to start your 16 column 2 row LCD 
LCD.setCursor(0,0); //Set LCD cursor to upper left corner, column 0, row 0 
LCD.print("Target Distance:"); //Print Message on First Row 
} 

void loop() { 

    digitalWrite(trigPin, LOW); //Set trigger pin low 
    delayMicroseconds(2000); //Let signal settle 
    digitalWrite(trigPin, HIGH); //Set trigPin high 
    delayMicroseconds(15); //Delay in high state 
    digitalWrite(trigPin, LOW); //ping has now been sent 
    delayMicroseconds(10); //Delay in high state 

    pingTime = pulseIn(echoPin, HIGH); //pingTime is presented in microceconds 
    pingTime=pingTime/1000000; //convert pingTime to seconds by dividing by 1000000 (microseconds in a second) 
    pingTime=pingTime/3600; //convert pingtime to hourse by dividing by 3600 (seconds in an hour) 
    targetDistance= speedOfSound * pingTime; //This will be in miles, since speed of sound was miles per hour 
    targetDistance=targetDistance/2; //Remember ping travels to target and back from target, so you must divide by 2 for actual target distance. 
    targetDistance= targetDistance*63360; //Convert miles to inches by multipling by 63360 (inches per mile) 

    LCD.setCursor(0,1); //Set cursor to first column of second row 
    LCD.print("    "); //Print blanks to clear the row 
    LCD.setCursor(0,1); //Set Cursor again to first column of second row 
    LCD.print(targetDistance); //Print measured distance 
    LCD.print(" inches"); //Print your units. 
    delay(250); //pause to let things settle 


    } 

私は助けていただきありがとうございます。

答えて

1

あなたのコードが正しいようなので、私の推測では、これはハードウェアの問題であるということである2.54

float targetDistanceCentimeters = targetDistance*2.54; 

を乗じセンチメートルにインチに変換します。私の経験では、超音波センサーは、比較的平坦な表面を有する壁や他の大きな物体ではない物体までの距離を測定するのには一般にかなり悪い。したがって、システムの精度をテストする場合は、そのようなオブジェクト、すなわち壁または本に対してテストしてください。 測定中にセンサーが動いている場合は、動きが速すぎないことを確認してください。 距離が小さいか薄いオブジェクトを測定する場合は、フィルタリングして測定値の平均値を取る必要があります。どのくらい正確になりたいのかはあなた次第ですが、20回程度のフィルタリングされた測定結果が適切な結果をもたらすと言います。

考慮すべきもう1つのことは、正しい電源電圧があり、センサがある角度で床に向いていないことです。これは、望ましくない反射をもたらす可能性があるからです。

1

ターゲットからの距離をセンチメートルで表示したいとします。

Googleでは、インチが2.54cmだと言っているので、結果をこれだけ増やしてください。

結果はより正確な結果を得るため

正確ではないが、サンプル(3以上)の数の平均を取り、あなたは範囲の下/上に肉眼廃棄いくつかのヒューリスティックを実装することができ結果。

3つの読みが0-5cm離れているとすると、40cm離れた4番目の読みは誤りである可能性が高いとします。だから、3つの同様の結果の平均をしてください。

2

loopの繰り返しごとに浮動小数点計算を多く実行しています。これらの計算を実行するのではなく、pingTimeをセンチメートル単位の距離に変換する単一の乗数を事前に計算することができます。

まず、776.5マイルからの音のメトリック速度を計算する必要があります。

776.5マイル/時* 1609.34(マイルでメートル)= 1249652.51メートル/時間

1249652.51メートル/時間/ 3600 = 347。

第126メートル/次のように我々は、乗算器を事前に計算することができる:

float speedOfSound = 347.126; // metres per second 
float speedOfSound_cm_p_us = speedOfSound * 100/1000000; // speedOfSound in centimetres per microsecond 
明らか

が、これは単に減少させることができる。

float speedOfSound_cm_p_us = 0.0347126; // cm per microsecond 

次に我々は分割乗算器を事前に計算することができspeedOfSound_cm_p_usは、音が反射面に移動して再び戻らなければならないため、2だけ減少します。

float pingTime_multiplier = speedOfSound_cm_p_us/2; // The sound travels there and back so divide by 2. 

ここでも、我々は単純にして、このステップを置き換えることができます:

float pingTime_multiplier = 0.0173563; 

しかし、このマジック数は、よくあなたのコード内で文書化する必要があります。

pingTime_multiplierを計算すると、loop関数ははるかに簡単になります。 pingTimepingTime_multiplierを単に乗算すると、センチメートル単位の距離が得られます。

pingTime = pulseIn(echoPin, HIGH); // pingTime is presented in microseconds 
targetDistance = pingTime * pingTime_multiplier; 

これは、Arduinoがループを通過するたびに行う作業の量を大幅に削減します。

+0

私は、ハードウェアを再設定すると感謝します。 –

関連する問題