# 机器人基础--超声波传感器

我们一般要等到晚上,才会在天空看到蝙蝠,你知道蝙蝠是怎么在夜晚飞行的吗?
蝙蝠的视力非常差,它主要靠回声定位技术飞行,蝙蝠会发出尖锐的叫声,再用耳朵收集周围传来的回声,判断附近物体的大小和位置。

# 情景分析

  1. 超声波传感器有一个发生器,一个接收器。发生器发出声音,碰到东西后反弹回来,被接收器接收。声音的速度是大约1秒钟340米。如果1秒钟之后才接收到回音,声音就走了340米,如果是半秒种的话,声音就走了170米。所以只要知道过了多久才收到回音,就知道声音走了多少米,也就知道东西离我们有多远。声音是发出去,再反弹回来的,计算声音走了多远后还要减去一半才是距离哦。
  2. 超声波模块通常有两个端口:触发Trig,接收Echo。在触发端口上的电平由低电平转到高电平时,超声波模块发出声波,接收到回音后在Echo端口上输出低电平。为了节约端口,我们的超声波模块将两个端口合并成一个,操作还是一样的,只是要记住改变端口的输入输出状态。
  3. 测量时间的指令是pulseIn(pin,value,[timeout]),pin是要测量的端口,value是测量高电平或者低电平,timeout是最多等待多长时间,单位是微秒,1000微秒等于1毫秒,1000毫秒等于1秒。timeout是可以不填的,指令将一直等待。执行指令时,控制器等待端口上出现要测量的电平出现,开始记录,等到端口电平变化时,把记录到的时间作为指令的结果,指令执行完成。如果时间超了timeout,指令返回0,指令结束。对应积木
  4. 触发信号要持续10微秒左右,时间太短超声波模块可能会没注意到。暂停微秒的指令是delayMicroseconds(us),us是要暂停的时间(微秒,千分之一毫秒)对应积木
  5. 两次测量之间要间隔一段时间,因为声波是四处扩散的,近处的东西把声波反弹回来,超声波模块接收到了,测量结束。马上再次发送声波,进入探测模式。这个时候第一次发送的声波恰好被比较远的东西反弹回来。超声波模块探测到上一次发送的声波,得到错误的数据。
  6. OseppBlockIDE已经将这些操作集成为一个积木,直接使用积木就可以了。

# 流程解析

  1. 控制器开机后,配置串口速度为115200。
  2. 配置超声波模块连接的端口为输出模式并输出高电平,指示超声波模块开始测量。
  3. 通过delayMicroseconds(10)指令来暂停10微秒(1毫秒的千分之一),防止超声波模块没注意到高电平信号。
  4. 将端口配置为输入模式。输出低电平。
  5. 使用pulseIn(2, HIGH)指令来测量高电平的持续时间,先等待端口2变为高电平,开始计时。再等待端口2变为低电平的时候,结束计时,得到高电平的持续时间。这些操作是指令自动完成的。我们的程序将暂停在这条指令,直到它返回结果。
  6. 通过高电平持续时间,计算出距离。并用串口打印出来。
  7. 等待一段时间后,重复步骤2到步骤6。
uml diagram

# 参考程序

  • 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

# 运行结果

注意:让机器人悬空,马达有可能会意外转动(上传成功前,控制器会运行之前上传的程序)
接通电源,上传程序后,打开串口监视器。注意也要把串口监视器的速度设置成115200,显示超声波传感器探测到的距离。用东西阻挡超声波传感器看看它有没有测量到。

# 课程解读

  1. 超声波发出的声音是40000hz,我们能听到这个声音吗?不确定的话在前面的章节里找一找答案。
  2. 超声波测量一定要有间隔时间,通过试验,间隔时间至少要25毫秒。
  3. 超声波测距是有盲区的,如果障碍物太过靠近,声波是没办法反弹到接收器上的。试试吧。

# 拓展知识

  1. 由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移动机器人研制上也得到了广泛的应用。
  2. 声音的速度大约是340米/秒 ,我们测量到的时间是t微秒,声音走过的距离
    D=340/×t1000000=t×3401000000D=340/秒 \times \frac{t}{1000000}秒=t \times \frac{340}{1000000}米 ,
    因为t是来回的时间,所以距离应该减半,同时把单位换算成毫米
    d=t×340×10001000000×12=t×0.17=t10.17t5.8d=t \times \frac{340\times1000}{1000000} \times \frac{1}{2}=t \times 0.17=\frac{t}{\frac{1}{0.17}}\approx\frac{t}{5.8} 毫米。
    将测量到的时间乘以0.17,或者除以5.8就是障碍物距离,单位为毫米。
  3. 端口在芯片的内部连接着3个开关,一个接到电源负极(GND),一个接到电源正极(5V),第3个开关在电源正极和开关之间放置了一个电阻器。在输入模式中输出低电平时,所有的开关都断开,叫做浮空模式。输出高电平时,带电阻的开关接通,电源正极通过电阻给端口供电。在输出模式中,根据指令来打开接电源正极/负极的其中一个开关。端口还任何时候都连接着一个读取电路,使用digitalRead(pin)指令,在任何时候,任何模式下(并不是只有输入模式才能输入),都可以得到端口的当前电平。

    注意,开关承受电流的能力是有限的。如果两个端口用线连起来,都配置为输出模式,一个输出高电平,一个输出低电平。开关将有可能损坏(控制器也就损坏了)。所以测量端口外部的电路电平时,要切换到输入模式。

# oseppBlock操作视频

# ArduinoIDE操作视频