Arduino基础入门之十四 超声波测距

一 硬件

         超声波传感器是HC-SR04,见下图

 

       一共4个引脚,VCC一般可以接3.3V-5V电源,GND接地,Trig是触发引脚,采用 IO 触发测距,给Trig引脚输入一个低高低的脉冲,高位至少保持 10us,模块会自动发送 8 个 40KHz 的方波,自动检测是否有信号返回;有信号返回, 通过 IO (具体来说就是Echo引脚)输出一高电平, 读取出高电平持续的时间就得到了超声波从发射到返回的时间。时序图如下【1】

 

        通过上面分析,测试距离=(高电平时间*声速(343m/s))/2

二 代码

1.功能:超声波测距,并把距离在LCD1602上面显示出来

2.具体代码:

#include //声明调用LCD的库
const int rs=12,en=11,d4=5,d5=4,d6=3,d7=2;//lcd占用引脚
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);//创建一个名为lcd的实例(对象)这里是4线法
int trig=7;//触发引脚
int echo=8;//回声引脚
float distance;//距离
void setup() {lcd.begin(16,2);//初始化LCD的宽度和高度,设置16列2行lcd.print("Hi,Emma!");//LCD初始欢迎词delay(500);pinMode(trig,OUTPUT);//设置触发端为输出模式pinMode(echo,INPUT);//设置回声端为输入模式
}void loop() {// 低高低电平发一个短时间脉冲去 TrigPin,产生触发信号digitalWrite(trig,LOW);delayMicroseconds(2);//延时2us, delay()是毫秒digitalWrite(trig,HIGH);delayMicroseconds(10);//延时构成10us的高电平信号digitalWrite(trig,LOW);//根据公式,得到距离值distance=pulseIn(echo,HIGH)/58.3;//将距离值显示出来lcd.clear();lcd.print("The distance is:");lcd.setCursor(0,1);//第2行开头lcd.print(distance);lcd.setCursor(9,1);//第2行第10列lcd.print("cm");delay(2000);//没有这句,屏幕显示会闪烁
}

 3. 知识点和讨论

(1)Trig和Echo都是接数字引脚,分别是输出和输入模式,即UNO输出脉冲从Trig进入SR04触发测距,SR04得到回声,从把信号从Echo返回到UNO,通过pulseIn()语句得到高电平保持的时长。结合上面的时序图,内部机制如下【2】

操作:初始化时将trig和echo端口都置低,首先向给 trig    发送至少10 us的高电平脉冲(模块自动向外发送8个40K的方波),然后等待,捕捉 echo 端输出上升沿,捕捉到上升沿的同时,打开定时器开始计时,再次等待捕捉echo的下降沿,当捕捉到下降沿,读出计时器的时间,这就是超声波在空气中运行的时间

         我好奇的是上面提到的“捕捉echo上升、下降沿,并读计时器”的这个设备是谁,是UNO还是传感器本身?也没有搜到结果,好在这个问题不影响结果的展示。

(2)  关于距离公式,我看了很多都是distance=pulseIn(echo,HIGH)/58,但如果按340m/s的声速算,应该是58.8us/cm,按343m/s的声速算,对应58.3us/cm ,所以我就按第二种来写了。

(3)一开始显示距离总是有闪烁的感觉,分析原因是loop循环会不断写入(lcd.print)操作,从而造成显示闪烁,后来在末尾加个delay(2000)就好了。这个问题之前两个LCD的实验没发现,是因为都是照搬其他人的代码,看了还是不扎实。

(4)自己拿尺子试了试,感觉应该是从大眼睛的前端开始算起,不过误差还是蛮大的,另外如果我把遮挡物贴着任一个眼睛,距离立刻变12m多,不知怎么回事?很好奇两个大眼睛的具体功能,从有限搜索的结果看,两个大眼睛是一个发一个收的【3】,也不知对不对?

p.s.又看了一下【3】,里面有我在上面第(1)点最后提问的答案,如下:

pulseIn(pin,stat,timeout),返回值是微秒数

其中pin是监听的端口号,stat可选LOW或HIGH,表示是低电平脉冲还是高电平脉冲,timeout为可选参数,单位是微秒,默认值是1000*1000us,用于指定脉冲等待时限

如pulseIn(12,HIGH,1000)表示从12号口计算高电平脉冲时间,最多等待1000us。这时候,Arduino会监听12号口变高电平,12号口变高后开始计时,变低后停止计时,并返回计算的微秒数。如果等待超过1000us,12号口都没变高,则等待超时返回0
————————————————
版权声明:本文为CSDN博主「FUNCO_小风」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_23937195/article/details/68947758

   也就是说收到回声,SR04就把echo引脚拉高,至于读取高电平时长的操作都是由Arhuino UNO来完成的。

【1】HC-SR04 超声波原理图讲解与时序分析与arduino使用_mworkfun的博客-CSDN博客_hcsr04超声波模块原理图

【2】超声波模块HC-SR04简介_dayou1024的博客-CSDN博客

【3】SR04声波传感器原理详解及其Arduino编程——人人都能玩硬件_FUNCO_小风-CSDN博客


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部