Arduino中使用超声波测距实验

尽管网上已经有很多使用超声波测距的案例,但为了配合我们的前面用Processing写好的雷达扫描程序付诸实践,所以我们还是要把超声波的测距的完整步骤在这里列出来,以供初学者来参考,尤其是让前面看到了Processing雷达扫描程序而不知道如何实践硬件部分的小伙伴们有依样画葫的“葫芦”。

一、超声波传感器(Ultrasonic Sensor)
我们常用的超声波传感器有好几种,我这里有两种,一种是SR04、SR05 ,(US-100)Y401 US-015等,这些都是做好了电路集成的模块了。所以叫做超声波传感器模块。如下图:

在这里插入图片描述在这里插入图片描述
但真正的传感器没有模块的,就是一个发送一个接收(对应到我们上面的模块就是Trig和Echo两个脚了)
在这里插入图片描述

实物连接图

在这里插入图片描述

了解外形之后,我们还要来看看她是如何配合工作的。其实说到超声波,我们就会想到蝙蝠,是的,它的工作原理就是模仿蝙蝠的。先发出一个声音,然后在接收返回的声音,通过发出和返回的时间差来可以计算出距离,就这么简单。
所以,我们就要有一个机制,发出多长的声波信号(和发电报一样),回收采集的理论上应该是发出的同时就要采样收集了。
但我们的单片机或者这里说的arduino采用的是单线程的程序运行机制,故而发送的同时肯定不能收集,一般是等发送完毕后开始收集,所以这个模块中则有一个缓冲机制,将收到的信号暂时存储等待设备来读取。

那么发送多长的信号呢?一般是10个毫秒。所以这里必须有触发脚Trig拉高电平10毫秒的动作;我们从图中可以看到,一共有四个脚,分别为VC,Trig,Echo,GND,两边的两个为接电源的正负极,中间的两个一个发送一个接收,可以连接在任意信号端口是包括1到13口及A0~A5,当日在程序中也必须对应设置好。

二、代码实现
编写代码我们一如既往的要使用串口,这里不再赘述。使用超声波模块,我们要特别注意pluseIn函数的使用,它用于检测引脚输出的高低电平的脉冲宽度。
pulseIn(pin, value) //value为LOW或者HIGH
pulseIn(pin, value, timeout)
可以看出,这和我们之前使用到的digitalWrite基本相同,一般都是两个参数,一个参数是管脚一个是高低电平的设定。

好了,了解好这些了,我们可以看看代码:

int TrgPin = A0;
int EcoPin = A1;
float dist;
void setup()
{   
Serial.begin(9600);
//设置TrgPin为输出状态
pinMode(TrgPin, OUTPUT);
// 设置EcoPin为输入状态
pinMode(EcoPin, INPUT);
}
void loop()
{
digitalWrite(TrgPin, LOW);
delayMicroseconds(8);
digitalWrite(TrgPin, HIGH);
// 维持10毫秒高电平用来产生一个脉冲
delayMicroseconds(10);
digitalWrite(TrgPin, LOW);
// 读取脉冲的宽度并换算成距离
dist = pulseIn(EcoPin, HIGH) / 58.00;
Serial.print("Distance:");
Serial.print(dist);
Serial.println("cm");
delay(300);
}

关于距离中除以58的说明:
58也很好理解,声音在干燥、摄氏 20度的空气中的传播速度大约为343米/秒,合34,300厘米/秒。或者,我们作一下单位换算,34,300除以1,000,000厘米/微秒。即为:0.0343厘米/微秒,再换一个角度,1/(0.0343 厘米/微秒)即:29.15 微秒/厘米。这就意味着,每291.5微秒表示10CM的距离。1厘米就是29.15微秒。但是发送后到接收到回波,声音走过的是2倍的距离呀。
所以实际距离就是1厘米,对应58.3微秒。实际上整个测距过程是测的发出声波到收到回波的时间,你的程序里的第一个distance实际上是时间us。所以换成距离cm,要除以58。当然除以58.3可能更精确。所以程序中用 pulseIn(EcoPin, HIGH) / 58.00获取测得的距离。

运行效果如下:
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页