打印
[UNO]

Arduino UNO超声波测距测试

[复制链接]
2071|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
        这次Arduino UNO开发板与US-100超声波测距模块实现测距,同时该模块自带温度测试功能。US-100超声波测距模块支持电平触发和串口触发两种模式。
【一】硬件连接:
US-100超声波测距模块:

硬件连接:


【二】电平触发模式:
原理:
       采用IO触发测距,给至少10us的高电平信号;模块自动发送8个40KHz的方波,自动检测是否有信号返回;有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间;测试距离=(高电平时间*声速(340m/s))/2。
程序:
/*
   Arduino UNO与US-100超声波模块测试
   电平触发模式
*/

const int TrigPin = 2;
const int EchoPin = 3;
float cm;
void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
void loop()
{
digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);

cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
cm = (int(cm * 100.0)) / 100.0; //保留两位小数
Serial.print("Distance:");
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(1000);
}

效果:


【三】串口触发模式:
原理:
       使用串口触发模式时,当插上跳线帽时为UART(串口)模式只需要在Trig/TX管脚输入0X55(波特率9600),系统便启动对当前距离进行测量,然后将距离值通过Echo/RX 管脚输出测量输出的距离值共两个字节,第一个字节是距离的高8位(HDate),第二个字节为距离的低8(LData),单位为毫米。即距离值为 (HData*256 +LData)mm。测温时只需要在Trig/TX管脚输入0X50,系统便启动温度测量,然后将温度值通过Echo/RX 管脚输出,返回一个字节的TData,实际的温度值为TData-45。
程序:
/*
   Arduino UNO与US-100超声波模块测试
   串口触发模式,需要插上模块背面的跳线
*/
#include <SoftwareSerial.h>

// 串口
#define _baudrate   9600
#define _rxpin      3
#define _txpin      2
#define DBG_UART    dbgSerial   //调试打印串口

SoftwareSerial dbgSerial( _rxpin, _txpin ); // 软串口,调试打印

void setup()
{
  DBG_UART.begin( _baudrate );
  Serial.begin( _baudrate );
}
void loop()
{
  unsigned int lenHigh = 0; // 高位
  unsigned int lenLow = 0;  // 低位
  unsigned int dist_mm = 0; // 距离
  unsigned int tdata = 0;  
  unsigned int temp = 0;  // 温度

  DBG_UART.flush();    // 清空串口接收缓冲区
  DBG_UART.write(0x55);   // 发送0x55,触发US-100 开始测距
  delay(500);         // 延时500 毫秒
  
  // 当串口接收缓冲区中数据大于2字节
  if(DBG_UART.available() >= 2)
  {
    lenHigh = DBG_UART.read();        // 距离的高字节
    lenLow = DBG_UART.read();         // 距离的低字节
    dist_mm = lenHigh*256 + lenLow; // 计算距离值
  }

  DBG_UART.flush();    // 清空串口接收缓冲区
  DBG_UART.write(0x50);   // 发送0x50,触发US-100 开始测温
  delay(500);         // 延时500 毫秒

  // 当串口接收缓冲区中数据大于1字节
  if(DBG_UART.available() >= 1)
  {
    tdata = DBG_UART.read();        // 温度字节
    temp = tdata-45; // 计算温度值
  }
  
  // 有效的测距的结果在1mm 到 10m 之间
  if((dist_mm > 1) && (dist_mm < 10000))
  {
    Serial.print("Distance is: ");// 输出结果至串口监视器
    Serial.print(dist_mm, DEC);   
    Serial.print("mm  ");
    Serial.print("Temperature is: ");// 输出结果至串口监视器
    Serial.print(temp, DEC);   
    Serial.println(".C");           
  }
  
  delay(500); // 等待500ms
}

效果:


相关帖子

沙发
cgd| | 2016-12-3 09:49 | 只看该作者
沙发

使用特权

评论回复
板凳
jinglixixi| | 2016-12-11 16:19 | 只看该作者
感谢分享。

使用特权

评论回复
地板
巧克力娃娃| | 2016-12-12 17:10 | 只看该作者
顶顶更健康~

使用特权

评论回复
5
巧克力娃娃| | 2016-12-12 17:10 | 只看该作者
顶顶更健康~

使用特权

评论回复
6
colin2135| | 2016-12-21 11:17 | 只看该作者
还有一种超声波模块,直接是AD输出的,所以直接读取模拟量换算成距离就可以了。

使用特权

评论回复
7
xinyipcb| | 2017-3-9 00:24 | 只看该作者
好东西。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎参与LabVIEW版块的讨论学习! 点我一键即达

157

主题

2338

帖子

40

粉丝