# 机器人基础--超声波传感器
我们一般要等到晚上,才会在天空看到蝙蝠,你知道蝙蝠是怎么在夜晚飞行的吗?
蝙蝠的视力非常差,它主要靠回声定位技术飞行,蝙蝠会发出尖锐的叫声,再用耳朵收集周围传来的回声,判断附近物体的大小和位置。
# 情景分析
- 超声波传感器有一个发生器,一个接收器。发生器发出声音,碰到东西后反弹回来,被接收器接收。声音的速度是大约1秒钟340米。如果1秒钟之后才接收到回音,声音就走了340米,如果是半秒种的话,声音就走了170米。所以只要知道过了多久才收到回音,就知道声音走了多少米,也就知道东西离我们有多远。声音是发出去,再反弹回来的,计算声音走了多远后还要减去一半才是距离哦。
- 超声波模块通常有两个端口:触发Trig,接收Echo。在触发端口上的电平由低电平转到高电平时,超声波模块发出声波,接收到回音后在Echo端口上输出低电平。为了节约端口,我们的超声波模块将两个端口合并成一个,操作还是一样的,只是要记住改变端口的输入输出状态。
- 测量时间的指令是
pulseIn(pin,value,[timeout])
,pin是要测量的端口,value是测量高电平或者低电平,timeout是最多等待多长时间,单位是微秒,1000微秒等于1毫秒,1000毫秒等于1秒。timeout是可以不填的,指令将一直等待。执行指令时,控制器等待端口上出现要测量的电平出现,开始记录,等到端口电平变化时,把记录到的时间作为指令的结果,指令执行完成。如果时间超了timeout,指令返回0,指令结束。对应积木 - 触发信号要持续10微秒左右,时间太短超声波模块可能会没注意到。暂停微秒的指令是
delayMicroseconds(us)
,us是要暂停的时间(微秒,千分之一毫秒)对应积木 - 两次测量之间要间隔一段时间,因为声波是四处扩散的,近处的东西把声波反弹回来,超声波模块接收到了,测量结束。马上再次发送声波,进入探测模式。这个时候第一次发送的声波恰好被比较远的东西反弹回来。超声波模块探测到上一次发送的声波,得到错误的数据。
- OseppBlockIDE已经将这些操作集成为一个积木,直接使用积木就可以了。
# 流程解析
- 控制器开机后,配置串口速度为115200。
- 配置超声波模块连接的端口为输出模式并输出高电平,指示超声波模块开始测量。
- 通过
delayMicroseconds(10)
指令来暂停10微秒(1毫秒的千分之一),防止超声波模块没注意到高电平信号。 - 将端口配置为输入模式。输出低电平。
- 使用
pulseIn(2, HIGH)
指令来测量高电平的持续时间,先等待端口2变为高电平,开始计时。再等待端口2变为低电平的时候,结束计时,得到高电平的持续时间。这些操作是指令自动完成的。我们的程序将暂停在这条指令,直到它返回结果。 - 通过高电平持续时间,计算出距离。并用串口打印出来。
- 等待一段时间后,重复步骤2到步骤6。
# 参考程序
- oseppBlock IDE 程序
- Arduino IDE 程序
void setup() {
Serial.begin(115200); //配置串口速度为115200
}
void loop() {
pinMode(2, OUTPUT); //配置端口为输出模式
digitalWrite(2, HIGH); //端口输出高电平
delayMicroseconds(10); //等待10微秒
digitalWrite(2, LOW); //配置端口为输入模式
pinMode(2, INPUT); //端口输出低电平,等待超声波模块将它变成高电平
//开始测量端口高电平持续时间,计算并通过串口打印距离
Serial.println(pulseIn(2, HIGH) / 5.8);
delay(500); //暂停半秒钟
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 运行结果
注意:让机器人悬空,马达有可能会意外转动(上传成功前,控制器会运行之前上传的程序)
接通电源,上传程序后,打开串口监视器。注意也要把串口监视器的速度设置成115200,显示超声波传感器探测到的距离。用东西阻挡超声波传感器看看它有没有测量到。
# 课程解读
- 超声波发出的声音是40000hz,我们能听到这个声音吗?不确定的话在前面的章节里找一找答案。
- 超声波测量一定要有间隔时间,通过试验,间隔时间至少要25毫秒。
- 超声波测距是有盲区的,如果障碍物太过靠近,声波是没办法反弹到接收器上的。试试吧。
# 拓展知识
- 由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移动机器人研制上也得到了广泛的应用。
- 声音的速度大约是340米/秒 ,我们测量到的时间是t微秒,声音走过的距离
,
因为t是来回的时间,所以距离应该减半,同时把单位换算成毫米
毫米。
将测量到的时间乘以0.17,或者除以5.8就是障碍物距离,单位为毫米。 - 端口在芯片的内部连接着3个开关,一个接到电源负极(GND),一个接到电源正极(5V),第3个开关在电源正极和开关之间放置了一个电阻器。在输入模式中输出低电平时,所有的开关都断开,叫做浮空模式。输出高电平时,带电阻的开关接通,电源正极通过电阻给端口供电。在输出模式中,根据指令来打开接电源正极/负极的其中一个开关。端口还任何时候都连接着一个读取电路,使用
digitalRead(pin)
指令,在任何时候,任何模式下(并不是只有输入模式才能输入),都可以得到端口的当前电平。注意,开关承受电流的能力是有限的。如果两个端口用线连起来,都配置为输出模式,一个输出高电平,一个输出低电平。开关将有可能损坏(控制器也就损坏了)。所以测量端口外部的电路电平时,要切换到输入模式。