0

美好的一天,我有以下代码用于我正在使用的超声波传感器,但结果不准确,我想以厘米为单位显示与目标的距离。

    #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


  }  

我将不胜感激。

4

3 回答 3

2

您在每次迭代中执行大量浮点计算loop。您可以预先计算一个乘数,而不是执行这些计算,它将转换为pingTime以厘米为单位的距离。

首先,我们需要根据您的 776.5 mph 计算音速。

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_us2 来预先计算乘数,因为声音必须传播到反射表面并再次返回。

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函数就会变得简单得多。只需将 乘以pingTime即可pingTime_multiplier得到以厘米为单位的距离。

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

这显着减少了 Arduino 每次循环执行的工作量。

于 2016-05-27T08:27:46.977 回答
1

我想以厘米为单位显示与目标的距离。

谷歌说一英寸是 2.54 厘米,所以只需将你的结果乘以这个。

结果不准确

要获得更准确的结果,请取多个样本(3 个或更多)的平均值,并且您可以实施一些启发式方法,这些方法会严重丢弃超出/低于范围的结果。

假设三个读数相距约 0-5 厘米,那么距离 40 厘米的第四个读数很可能是错误的。因此,只需对三个相似结果进行平均即可。

于 2016-05-27T06:03:48.380 回答
1

通过乘以 2.54 将英寸转换为厘米

float targetDistanceCentimeters = targetDistance*2.54;

您的代码看起来是正确的,所以我猜这是硬件问题。以我的经验,超声波传感器通常在测量到任何物体的距离方面非常糟糕,这些物体不是墙壁或其他具有相对平坦表面的大型物体。因此,如果您想测试系统的准确性,请针对此类对象(例如墙壁或书籍)进行测试。如果您的传感器在进行测量时正在移动,请确保它没有移动得太快。如果您要测量到小物体或薄物体的距离,则需要过滤并取测量值的平均值。这完全取决于您想要多准确,我会说平均 20 次左右的过滤测量将为您提供适当的结果。

要考虑的另一件事是您的电源电压正确,并且传感器没有以某个角度直接对着地板,因为这可能会产生不必要的反射。

于 2016-05-27T07:22:35.597 回答