[UNO] Arduino UNO超声波测距测试

[复制链接]
2820|6
 楼主| hbzjt2011 发表于 2016-12-2 15:04 | 显示全部楼层 |阅读模式
        这次Arduino UNO开发板与US-100超声波测距模块实现测距,同时该模块自带温度测试功能。US-100超声波测距模块支持电平触发和串口触发两种模式。
【一】硬件连接:
US-100超声波测距模块:
385885207822874335_旋转_编辑.jpg
硬件连接:
160248491137388770_编辑.jpg
012930bu230wfvkzf23ogv.gif
【二】电平触发模式:
原理:
       采用IO触发测距,给至少10us的高电平信号;模块自动发送8个40KHz的方波,自动检测是否有信号返回;有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间;测试距离=(高电平时间*声速(340m/s))/2。
程序:
  1. /*
  2.    Arduino UNO与US-100超声波模块测试
  3.    电平触发模式
  4. */

  5. const int TrigPin = 2;
  6. const int EchoPin = 3;
  7. float cm;
  8. void setup()
  9. {
  10. Serial.begin(9600);
  11. pinMode(TrigPin, OUTPUT);
  12. pinMode(EchoPin, INPUT);
  13. }
  14. void loop()
  15. {
  16. digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
  17. delayMicroseconds(2);
  18. digitalWrite(TrigPin, HIGH);
  19. delayMicroseconds(10);
  20. digitalWrite(TrigPin, LOW);

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

效果:
Screenshot_1.png

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

  6. // 串口
  7. #define _baudrate   9600
  8. #define _rxpin      3
  9. #define _txpin      2
  10. #define DBG_UART    dbgSerial   //调试打印串口

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

  12. void setup()
  13. {
  14.   DBG_UART.begin( _baudrate );
  15.   Serial.begin( _baudrate );
  16. }
  17. void loop()
  18. {
  19.   unsigned int lenHigh = 0; // 高位
  20.   unsigned int lenLow = 0;  // 低位
  21.   unsigned int dist_mm = 0; // 距离
  22.   unsigned int tdata = 0;  
  23.   unsigned int temp = 0;  // 温度

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

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

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

效果:

Screenshot_2.png
cgd 发表于 2016-12-3 09:49 | 显示全部楼层
jinglixixi 发表于 2016-12-11 16:19 | 显示全部楼层
感谢分享。
巧克力娃娃 发表于 2016-12-12 17:10 | 显示全部楼层
顶顶更健康~
巧克力娃娃 发表于 2016-12-12 17:10 | 显示全部楼层
顶顶更健康~
colin2135 发表于 2016-12-21 11:17 | 显示全部楼层
还有一种超声波模块,直接是AD输出的,所以直接读取模拟量换算成距离就可以了。
xinyipcb 发表于 2017-3-9 00:24 | 显示全部楼层
好东西。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

345

主题

2950

帖子

45

粉丝
快速回复 在线客服 返回列表 返回顶部