美文网首页
超声波模块 AJ-SR04M

超声波模块 AJ-SR04M

作者: Mr_White | 来源:发表于2018-09-10 21:21 被阅读0次

    2018年9月10日

    image.png
            /*
            乱码记录
            01 00 CC 00 00 03 E3 
            7F 01 12 01 00 C7 00 00 03 DE
          原因是打印的时候出的%02X 问题,改成%03X 就好了
    

    根本原始是没有延时
    delay_ms(100); //超声波接受和处理字符需要延时
    */

    image.png

    实现功能:
    串口先发送一段数据过去,然后返回一串数据,对数据首先进行分割,核对帧头帧尾,然后计算和校验,如果相等,就提取距离进行判断,后续为了提高准确率,可能多次后取平均值。
    举例子:

    • 读取站号1距离信息:
      7F 01 12 00 00 00 00 00 03 16
    • 站号1返回距离信息:
      7F 01 12 01 01 04 00 00 03 1c
    /* 
    
    接受串口数据:
    1. 直接读数据data0 ~ data3;
    2. 校验帧头、和校验(帧尾参与计算), 再读数据data0 ~ data3;
    3. 校验帧头、帧尾、和校验, 再读数据data0 ~ data3.
    
    通讯在受到干扰的时候会乱码,本来是1接受方读到是0,或者本来是0接受方读到是1
    串口通讯硬件那一层就可以加上奇偶校验,可以解决一部分问题
    不过想可靠还是靠自己在协议上增加复杂的校验方式
    根据你的实际情况考虑校验方式
    一般来说就是一组数据之中加上校验位,要求越高校验位越长
    
    https://bbs.csdn.net/topics/392167834?page=1
    
    接受方收到数据后重新计算一下校验位,如果和发送方不一样就认为数据错误
    发请求要求发送方重新发送。
    
    串行协议为啥要校验?
    */
    
    #include "stdio.h"
    #include "string.h"
    
    int main()
    {//10个字节(起始+站号+命令+数字方向+data0+data1+data2+data3+结束码+和校验)
     //从“站号”即第二位加到结束码 0X03 为 BCC 值, 不包含启始位0X7F.
        int a[]={0X7F, 0X01, 0X12, 0X01, 0X01, 0X04, 0X00, 0X00, 0X03, 0X1C};
        int i, xor=0, data=0;
        if(a[0]==0x7F && a[8]==0X03) //校验帧头、帧尾
            for(i=1; i<9; i++) //和校验
                xor+=a[i];
        if(xor == a[9]) //校验完成
        {
            data = a[4]*0x100 + a[5]; //计算距离
            printf("距离=%dmm\n", data);
        }
        return 0;
    }
    

    串结束符null对应ASC码值0x00定义:“(字符串)” 在末尾自动添加 ,百度写的比较清楚:在ASCII码的第一个字符是NULL,它的数值是0,占用1字节;C语言把它作为字符串的最后一个字符,以表示字符串到此结束."\0"

    串行不加crc校验就是不负责任,校验不过就要求重发,串行协议。

    https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-15011569605.6.5f3c6518nnoDwr&id=566408829462
    https://item.taobao.com/item.htm?spm=a230r.1.14.23.e37d4716JVjbsx&id=574905987374&ns=1&abbucket=3#detail
    JSN-SR04T一体化超声波测距模块]倒车雷达防水型ARDUINO可定做-淘宝网 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.324f2e8d45giUW&id=40676752180&_u=bkn1qed09da

    https://item.taobao.com/item.htm?spm=a1z09.2.0.0.324f2e8d45giUW&id=40676752180&_u=bkn1qed09da

    https://item.taobao.com/item.htm?spm=a230r.1.14.34.618f3ee9sQxeGW&id=546597144185&ns=1&abbucket=3#detail

    相关资料下载: pan.baidu.com/s/1dF1XNqT

    • 型号:AJ-SR04M 超声波模块
      AJ-SR04M 是单头,AJ-SR04K 是双头。
    • 工作电压:DC 3.0 ~ 5.5V
    • 距离测量范围:20cm ~ 8m
    • 电位器:调节探头发散角度
      软件参数调节探头发散角度
    • 测量角度:75°

    五种工作模式:

    模式 R19阻值
    兼容 SR-04 模式 开路(默认)
    低功耗 SR-04 模式 300kΩ
    自动串口模式 120kΩ
    触发串口模式 47kΩ
    PC打印模式 0kΩ

    时序图:

    时序图

    模块接收到串口触发信号,每次输出一帧,含4个8位数据,帧格式为:OXFF+H_ DATA+L_ DATA+ SUM。

    各位解释如下:

    1. 0XFF:为一帧开始数据,用于判断;
    2. H_ DATA: 距离数据的高8位;
    3. L_ DATA: 距离数据的低8位;
    4. SUM: 数据和,用于效验.其0XFF为开始侦不参与校验, H_ DATA+L _DATA=SUM (仅低8位);
    5. H_DATA与L__DATA合成16位数据,即以毫米为单位的距离值。

    例如:
    产品应答:FF 07 A1 A7

    • 校验码SUM=A8=(0x07+0xA1)&0x00ff;(+代表或运算)
    • 0x07:为距离的高位数据;
    • 0xA1:为距离的低位数据;
    • 距离值为0x07A1,转换成十进制为1953,单位:毫米。

    通过R19选中模块的启动模式,选择好模式后模块收到有效触发信号后,内部将发出 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号或者对应串口讯号,回响信号的脉冲宽度与所测的距离成正比。

    由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者uS/148=英寸,或是:距离=高电平时间*声速(340M/S) /2。

    模式三、四:FF 01 56 57 (每串数字后有一个空格)
    模式五:Gap=0342mm
    模式五就是模式三、四转换后的结果,所以怎么处理都行。

    相关文章

      网友评论

          本文标题:超声波模块 AJ-SR04M

          本文链接:https://www.haomeiwen.com/subject/veeegftx.html