Arduino基础实验9,超声波测距的两种模式

超声波测距会应用到倒车雷达和智能模型车制作等多个场合,创客行文档【1】中介绍过超声波测距的工作原理,本文中,让我们来看看US-100的超声波测距模块是怎样和Arduino一起工作,来获得距离数据的。

US-100产品介绍

distance5图1 US-100型超声波测距模块

图2 US-100型超声波测距模块背面

US-100型超声波测距模块的产品说明书在文档【2】,它有两种工作模式,通过其背后的跳线来选择,插上跳线帽是UART工作模式,也就是串口模式,拔出跳线是电平触发工作模式。如图1所示,该模块有五个引脚,分别是:

  1. Vcc:电源正极,供电范围2.4V~5.5V。
  2. Trig/TX:电平触发模式中控制触发信号输入,串口模式中,作为TX端。
  3. Echo/RX:电平触发模式中回波信号输出,串口模式中,作为RX端。
  4. GND:电压负极。
  5. GND:电源负极。

它的其它产品参数请看文档【2】

 串口工作模式

让工作在串口模式的模块测距,只需要在Trig输入0X55这个十六进制数,稍等片刻后(100ms以上即可,这个时间是考虑测量10米的往返用时小于100ms),就可以在Echo引脚读出经过温度校正的测量距离值。根据文档【1】可知,超声波在大气中的速度经验公式为v=331.4+0.6t (m/s),t为摄氏温度,因此精确的测量模式需要考虑温度因素。

/*
 Distance1 experiment
 source by: www.i-makers.info
*/

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX,设置虚拟串口


unsigned int HighLen = 0;
unsigned int LowLen = 0;
unsigned int Len_mm = 0;

void setup() {
 //将Arduino的RX与TX(Digital IO 0和1)分别于US-100的Echo/Rx 和Trig/Tx 相连,
 //确保连接前已经使US-100处于串口模式。
 Serial.begin(9600); //设置连接PC的串口波特率为 9600bps.
 mySerial.begin(9600);//设置连接测距模块的虚拟串口
}

void loop() {
 mySerial.flush(); // 清空串口接收缓冲区
 mySerial.write(0X55); // 发送0X55,触发US-100开始测距
 delay(100); //延时,100毫秒
 Serial.println("starting.......");
 if(mySerial.available() >= 2) //当串口接收缓冲区中数据大于2字节
 {
   HighLen = mySerial.read(); //距离的高字节
   LowLen = mySerial.read(); //距离的低字节
   Len_mm = HighLen*256 + LowLen; //计算距离值
   if((Len_mm > 1) && (Len_mm < 10000)) //有效的测距的结果在1mm到10m之间
   {
     Serial.print("Present Length is: "); //输出结果至串口监视器
     Serial.print(Len_mm, DEC); 
     Serial.println("mm"); 
   }
 }
 
 delay(1000); 
}

 代码1 Arduino串口模式超声波测距代码

代码1定义了两个串口通信通道,Serial是Arduino的硬件串口,和PC连接传送调试数据。mySerial是数字引脚GPIO通过软件模拟的串口,它跟超声测距模块相连接,连接关系如图3:

  • Vcc连接Arduino5V引脚
  • GND连接ArduinoGND引脚,模块的两个GND只需要其中一个连接即可
  • RX连接D2
  • TX连接D3

Arduino测距实验电路图3 Arduino测距实验电路

电路搭建好之后,烧录并运行代码1,系统会在每间隔1秒钟测距一次,这时串口mySerial首先向串口发送0X55,模块接到这个命令代码后开始进行测量工作,这时Arduino不需要关系模块的工作过程,只需等待100毫秒,然后去读出串口中由测距模块返回的结果,结果分为高八位和低八位两部分,将它们分别读出并组合成Len_mm的值,这就是所测量得到的距离值,然后系统会将它送到Arduino IDE的串口监视器打印出来。

 电平触发模式

相对于串口模式,电平触发的测距方式需要更多的处理,参照文档【2】,我们了解到它的工作过程如图4,首先,需要在Trig引脚输入一个10微秒的高电平,引发发射探头输出探测信号,等接收到回波之后,Echo引脚输出高电平,这个高电平持续时间为探测波从发射到接收的时延。

US-100电平触发模式图4 US-100电平触发模式流程图

因此,电平触发模式的代码,需要在Echo引脚布置对高电平计时的逻辑,Arduino的pulseIn函数正好提供这个功能,它带有三个参数,通常使用前两个,参数1是设置绑定的引脚,参数2是设置计时的值是高电平还是低电平。下面就来看看实现它的代码。

/*
 Distance2 experiment
 source by: www.i-makers.info
*/

const int TrigPin = 3; 
const int EchoPin = 2; 
unsigned int Len_mm = 0;
void setup() 
{ // 初始化串口通信及连接SR04的引脚
 Serial.begin(9600); 
 pinMode(TrigPin, OUTPUT); 
 // 要检测引脚上输入的脉冲宽度,需要先设置为输入状态
 pinMode(EchoPin, INPUT); 
 Serial.println("Present Length is:");
} 
void loop() 
{ 
 // 产生一个10us的高脉冲去触发TrigPin 
 digitalWrite(TrigPin, LOW); 
 delayMicroseconds(2); 
 digitalWrite(TrigPin, HIGH); 
 delayMicroseconds(10);
 digitalWrite(TrigPin, LOW); 
 
 Len_mm = pulseIn(EchoPin, HIGH)*0.17; // 检测脉冲宽度,对高电平敏感,并计算出距离

 Serial.print(Len_mm); 
 Serial.print("mm"); 
 Serial.println(); 
 delay(1000); 
}

代码2 Arduino电平触发模式超声波测距代码

这段代码使用delayMicroseconds来控制触发电平的时间,保证其在10微秒的延时,然后使用pulseIn函数来捕获Echo引脚传回来的高电平脉冲并计时。

 Len_mm = pulseIn(EchoPin, HIGH)*0.17;

以上这段代码是将时延值和速度相乘来求出距离,这里选择声音速度是340米/秒。

Len_mm = V*t = pulseIn(EchoPin, HIGH)*340/2/1000  =pulseIn(EchoPin, HIGH)*0.17

以上计算中,除以2是因为时间包含来回距离,单程距离仅为其一半。除以1000是因为pulseIn函数获取的是微秒值,本来需要除以10^6来变成秒的单位,这里我们感兴趣的输出是毫米值,需要在米的基础上乘以1000,因此1000/10^6=1/1000.

经过这个代码,我们同样也取得了超声探测的距离值。请注意,实验代码2的电路和代码1相同,都如图3所示,不需要作改动。

总结

本文中分别对超声测距模块的串口和电平触发两种工作方式做了测距实验,提供了相应的两段测距代码,在实际设计中,可以根据自己的需求来使用。更多的精彩内容,请查看全站目录

 

优秀科技原创内容源,欢迎添加微信公众号。

创客行淘宝店提供本网站电子制作的全部套件

创客行淘宝店地址:https://shop125908459.taobao.com/

参考文档

  1. 大话传感器4-超声测距模块,倒车雷达的秘密
  2. US100产品介绍V2.01.pdf
  3. 全站目录

发表评论