URM04简介:

  • URM04采用了RS485串行通信总线的架构,支持多传感器的并行工作,有着两个RS-485接口,最多支持32个超声波的并联,
  • 内置温度传感器辅助校正距离值,同时支持温度的测量
  • 应用场合:移动机器人,停车场,安全检测,超声波空间定位。

性能描述:

  • 工作电源:+5V
  • 接口方式:RS485  RS485总线通讯,
  • 超声波距离测量:
  • 最大距离4cm―500cm
  • 测量范围角度: 60度
  • 芯片型号:Atmel公司的ATmega8芯片  MAX202 MAX485 ST温度测量芯片

测量流程:

1触发超声波与温度测量指令

发送指令后,超声波开始测量,温度开始测量,无返回值

2延时30MS

超声波最大测距5米,反射路径10米,声速度331米/秒)  10/331=0.03021  //30MS

3超声波测距读取指令

测量完一次之后,数据会被存储在ATmega8芯片中,只有发送读取指令,才会有数据返回

返回值:

测量成功返回16位距离数据,两字节0XFF表示测量失败

4温度读取指令

与超声波只有命令字节不同

返回值:

调试经验:

1注意超声波要接的是5V,不是3.3V,使用下载器时一般都是3.3V供电,这就导致在线调试没有数据,应该给板子供上电,下载器不供电,超声波接到5V电源口,并且检测下是不是5V.

2.测距时不要距离太近,会导致数据不准确     PS:  太近超声波会有回波干扰 

3.超声波测距的性能与被测物表面材料有很大关系,如毛料、布料对超声波 的反射率很小,会严重影响测量结果。

4.测距等待一定的时间,如果超时后依然没有数据返回,就放弃,而进行下一次测量。

4.URM04 V2.0 如果与主板有数据交流,其上的LED灯会一闪一闪的

5.URM04 V2.0 的波特率为固定值19200。或115200

关于这个找了半天发现是在10年七月之后买的都是19200 之前买的都是115200,

6 UATR接收数据的中断要改!!可以自己根据返回的数据特征做相应处理,或者接受8个字节直接退出 

话不多说我们直接看代码:

超声波数据测量

/*!
*  @brief      超声波数据测量*  @since      v1.0*  @param  device   超声波地址*  @author     Z小旋*/
void MeasureDistance(u8 device) {int i = 0;u8 Scmd[6]={0x55,0xaa,0x00,0x00,0x01,0x00};  //触发超声波与温度测量指令u8 Tcmd[6]={0x55,0xaa,0x00,0x00,0x02,0x00};  //超声波测距读取指令//SUM效验和Scmd[2] = device;     Tcmd[2] = device;Scmd[5] = Scmd[0]+Scmd[1]+Scmd[2]+Scmd[3]+Scmd[4];  //SUM校验和Tcmd[5] = Tcmd[0]+Tcmd[1]+Tcmd[2]+Tcmd[3]+Tcmd[4];  //SUM校验和// 触发距离测量。for(i=0; i<6; i++) {USART_SendData(USART1, Scmd[i]);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}delay_ms(30);                  //延时30ms  //  发送命令读取测量距离for(i=0; i<6; i++) {USART_SendData(USART1, Tcmd[i]);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}  delay_ms(3);
}

发送温度就是将Tcmd[4]改为0x03   自行修改即可

超声波ID改变

/*!
*  @brief      超声地址改变*  @since      v1.0*  @param  device   超声波地址*  @return 1 表示成功 0表示失败*  @author     Z小旋*/
int ID_Change(u8 device) {int i = 0;u8 data[8];u8 Scmd[7]={0x55,0xaa,0xAB,0x01,0x55,0x11,0x00};  //触发超声波与温度测量指令Scmd[5] = device;  for(i=0; i<7; i++) {USART_SendData(USART1, Scmd[i]);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束Scmd[6] += Scmd[i];}delay_ms(20);    for(i=0; i<10; i++) //获取十位返回数据,检测是否含有0x01{if(USART_RX_BUF[i]==0x01) {return 1;}  }return 0;
}

超声波接收数据

/*!
*  @brief      URM04v2超声波传感器返回测量的距离或温度*  @since      v1.0*  @param  None*  @return     测量距离  -1表示上次测量超出范围或不成功*  @author     Z小旋*/int ReadDistance()
{u8 data[8];unsigned int temp;   int counter = 0;int result = -1;  int i = 0,j = 0;for(i=0;i<200;i++)   //数据缓存区最大为200 我们就循环200次{if(USART_RX_BUF[i]==0x55&&USART_RX_BUF[i+1]==0xAA)  //检测到回复的字头{                     for(j=0; j<8; j++) {data[j] = USART_RX_BUF[i];      //获取返回数据i++;}if(data[3] == 2 && data[4] == 2)    //如果为距离   桢长度为2 命令字为2{//  result = (((unsigned int)data[5])<<8))|data[6];   数据合并  如果需要测到255以上用这个result =  data[6];    //返回所测距离  最大255} if(data[3] == 2 && data[4] == 3)     //如果为温度    桢长度为2 命令字为3{if(data[5]>=0xf0)   //高四位都为1 温度为正{ // result= ((data[5]-0xf0)*256-data[6])/10;         //返回所测温度result= ((unsigned int)(data[5]-0xf0)+data[6])/10;  //返回所测温度  } else   温度为负{ //result= ((data[5])*256-data[6])/10;       //返回所测温度result= ((unsigned int)(data[5]<<4))|data[6];  //返回所测温度}}USART_RX_STA=0;return result;}else {delay_us(250);counter++;if(counter==200) //如果50ms还没有数据返回,退出测量并返回-1{ return result;}}    }
}

这里只接收低八位,保证最大能到2.55米 ,如果需要测得远用注释的那行就行,还有很多事,本来想写一套完整库,但是没很多时间,就到这里吧,没有心情去继续完善这个了,万分抱歉,很您可以参考一下,希望能有一点用 ,不足的就是接收数据,需要修改UATR的接收中断的数据处理,我改的不满意,就不上传了

您可以自行修改,还有要注意检测不到数据需要及时退出,不要死等,单片机里最好不要有可能是死循环的存在

void distance()
{   int Distance=0;MeasureDistance(0x11);Distance = ReadDistance();delay_ms(1000);
}

直接调用即可

【STM32】 STM32驱动URM04超声波测距模块相关推荐

  1. STM32—驱动HC-SR04超声波测距模块

    文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...

  2. 【STM32】详解超声波测距模块工作原理

    一.产品介绍 超声波测距模块可提供2cm-400cm的非接触距离感测功能,测距精度3mm,模块包括超声波发射器,接收器与控制电路. 二.基本工作原理 (1)采用IO口trig出发测距,给Echo最少1 ...

  3. arduino与hcsr04_Arduino 驱动 HC-SR04 超声波测距模块

    /* Arduino Uno 驱动HC-SR04 超声波测距传感器模块 Created 2014 by 太极创客 http://www.taichi-maker.com 使用Arduino Uno驱动 ...

  4. 基于DE2 115开发板驱动HC_SR04超声波测距模块【附源码】

    目录 1. 实验平台与目的 2. 实验要求 3. 实验原理 3.1. 理论原理 3.2. 硬件模块时序图 4. 系统架构设计 5. 模块说明 5.1. hc_sr_driver端口信号列表 5.2. ...

  5. stm32蓝牙模块和超声波测距模块

    蓝牙 蓝牙概念 蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接. [1] 蓝牙使当前的一些便携移动设备和计算 ...

  6. STM32用超声波测距模块实现测距

    STM32用超声波测距模块实现测距 通过超声波测距模块可以实现超声波反射型距离测试.市面上的超声波测距模块主要有两种.一种是分体式模块(HC-SR04等),由超生波发射头和接收头组成,一种是一体式模块 ...

  7. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)

    参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...

  8. HC-SR04超声波测距模块使用方法和例程(STM32)

    基于STM32和HC-SR04模块实现超声波测距功能 最近在学STM32做个简单的应用实践一下,顺便水一篇文章. 本文用的单片机是STM32F103C8T6,超声波测距模块是HC-SR04,显示测距结 ...

  9. 学习并使用HC-SR04超声波测距模块+STM32

    ** 超声波测距原理 ** 参考博客: https://blog.csdn.net/qq_40734815/article/details/105992801 https://blog.csdn.ne ...

最新文章

  1. “聚沙成塔”——用大数据思维理解生命的复杂体系,数据之眼看显微镜下的复杂生命【数据故事计划二等奖】...
  2. 第十七届第一场智能车竞速校内赛,比往年来的早一些
  3. Matlab生成Xilinx Rom IP CORE的初始化内容coe文件
  4. 线上CPU100%?看看这篇是怎么排查的。
  5. 今天写的一个makefile,备份下
  6. 1.1图像处理的概念
  7. ABAP和Java里的单例模式攻击
  8. DELL XPS 9350 无线网卡DW1820A WIN7驱动异常解决
  9. JS之Promise
  10. [Winodows Phone 7控件详解]控件拾遗
  11. ansible 配置文件优先级
  12. 数字轮廓投影仪行业调研报告 - 市场现状分析与发展前景预测
  13. VO、DTO、DO、PO的概念
  14. 如何删除 EMC存储认到的鬼盘LUNZ disk,在存储上出现initiators storage group ~management的情况...
  15. JZOJ 1714. 小x的三角形(triangles.pas/cpp)
  16. 语法分析:自下而上分析
  17. XML 转 JSON
  18. Java调用用户芝麻信用分
  19. 【Idea】Process finished with exit code 0 是什么意思?
  20. coding之外的3个日常:开会、提问和读书

热门文章

  1. linux服务器管理公司用户,Linux服务器用户账号如何管理
  2. 使用pyLDAvis可视化LDA结果,与解决FileNotFoundError: [Errno 2] No such file or directory: ‘https://cdn.jsdel....
  3. python pymysql执行插入操作到mysql
  4. python使用ray框架改进原有代码,实现多进程与分布式
  5. php sqlserver08001,PHP连接sqlserver2008,怎么连接指定ip地址上的数据库
  6. java override 用法_Java中@Override的作用
  7. oracle删除死锁进程
  8. ListView IllegalStateException
  9. 怎么样自己动手写OS
  10. 处理2D图像和纹理——投影纹理