基于HC-SRO4与nrf24l01的超声波对射实时测距系统

硬件搭设

  • 超声波

      HC-SRO4超声波模块的一些基本资料大家可以在某度上随便输入几个字就能找到好多,在这里我就不啰嗦了,接下来我们重点来研究一下它的原理图,以便于我们对对射有更好的了解。下面就是我找到的我们的超声波的原理图
    HC-SR04超声波模块原理图

      在这里我要先简单介绍下对射的原理:两个超声波,通过一些特定的设置,让一个只发送,一个只接收,这样两个超声波就形成了对射关系。进而进行一个实时单向的测距工作。
      超声波的原理大家应该略知一二,它是依据声音的物理反射的来测距的,声波从一端传出,开始计时,当另一端接收到传出的信号时停止计时利用公式推算出距离。
      在这里,负责发送的模块不需要做任何处理,不明白为什么不需要做处理的同学在你们实际操作的时候会明白。负责接收的模块我们需要对他做一些特定的处理,处理的目的是让它不接受自己发射的超声波而是接受发射端发射的超声波。接收端对超声波的处理有两种方式:
      软处理
       所谓软处理就是通过程序来更改内部的设置,如关闭发射端。这种方法是最容易想到也是大家最接受的,但是理想是丰满的现实很骨感。个大家看一下超声波的发射接收程序
      


void EXTI9_5_IRQHandler(void)
{
    delay_us(10);                             //延时10us
     if(EXTI_GetITStatus(EXTI_Line7) != RESET)
    {
            TIM_SetCounter(TIM2,0);
            TIM_Cmd(TIM2, ENABLE);                                             //开启时钟

            while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN));                    //等待低电平

            TIM_Cmd(TIM2, DISABLE);                                          //定时器2失能
            UltrasonicWave_Distance=TIM_GetCounter(TIM2)*5*34/200.0;                                     //计算距离

    if(UltrasonicWave_Distance>0)
    {
        printf("distance:%f cm",UltrasonicWave_Distance);
    }



    EXTI_ClearITPendingBit(EXTI_Line7);  //清楚EXTI7线路挂起位
}

}


----------


/*
 * 开始测距,发送一个>10us的脉冲,然后测量返回的高电平的时间
 */
void UltrasonicWave_StartMeasure(void)
{
  GPIO_SetBits(TRIG_PORT,TRIG_PIN);           //送>10us的高电平RIG_PORT,TRIG_PIG这两个在define中有定义
  delay_us(20);                           //延时20US
  GPIO_ResetBits(TRIG_PORT,TRIG_PIN);

}

  分析程序不难看出,定时器的开启是由超声波的发射端控制的,而失能却是由接收端控制,一旦关闭了发射端,定时器就无法工作。当然也有人提议说修改定时器的失能不就行了吗,可以是可以,但是太麻烦,我不想弄。。。至于程序的如何修改本人目前还没有过多的如研究,还需要膜拜大神,以后或许会有补充。见谅。
  硬处理
  所谓硬处理,毫无疑问是直接从硬件下手,能拆就拆,咳咳,保证拆了也能用的条件上。还记得上面让大家找的原理图吗?现在派上用场了在这里我们不需要看太多东西,对于原理图只需要找到接收和发射端就好。
这里写图片描述

  从上图可以看到,发射端是由两个引脚控制,分别是TIOUT和T2OUT。我们上面想的阻止发射端发射的想法行不通,那我们就让超声波来个“自欺欺人”,所谓自欺欺人就是让超声波认为自己已经发送了超声波,其实没有发送出去。最好的方法就是直接切断发送端的线路,直白点就是切断7、14号两个引脚。方法有很多,建议大家直接用破坏的方法去完成。下图为本人的“成果”。

这里写图片描述

  • 24L01
      无线收发模块我在这里选用的是正点原子家的,不建议大家图便宜去买一些小厂家的元器件,真心有风险。
  • 开发板
      stm32mini板,这里不过多解释。
      

相关程序

  - 超声波模块
(未完待续)

  - nrf2401模块

  - 主函数

注意事项

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
一、测试距离 0.软件为Keil5,不知道是否支持Keil4(如不行请手动新建Keil4工程) 1.单片机为STM32F103C8,采用硬件SPI 2.nRF24L01+采用3.3V供电,接线如下:       24L01+       STM32 CE   ——   PA3 CS   ——   PA4 SCK  ——   PA5 MISO ——   PA6 MOSI ——   PA7   IRQ未接(采用查询方式,如须用自加外部中断程序) 3.led灯为PC13控制,低电平亮(在User\led.c中修改GPIO);按键为PA0,按下后(接地)才开始发送,默认注释了,如需要可在程序中加上 4.My24L01_Tx为发送端程序,My24L01_Rx为接收端程序; 5.发送端约100ms发送一次,不要ACK;接收端每接收到一次led反转;将程序下载到单片机后可看到接收端led快速闪动,可将接收端的24L01在一定范围内走动,若led闪动变慢,则说明有丢包;led不闪,说明没有收到数据;因此大致可测得发送距离 6.24L01采用0频道,2Mbps, 0dBm, Address 3Bytes,实测距离大于10米(在不同的房间) 二、测试速率 0.软件为Keil5,不知道是否支持Keil4(如不行请手动新建Keil4工程) 
1.单片机为STM32F103C8,采用硬件SPI
 2.nRF24L01+采用3.3V供电,接线如下:
      24L01+       STM32
 CE   ——   PA3
 CS   ——   PA4
 SCK  ——   PA5
 MISO ——   PA6
 MOSI ——   PA7  
 IRQ未接(采用查询方式,如须用自加外部中断程序) 

3.led灯为PC13控制,低电平亮(在User\led.c中修改GPIO);按键为PA0,按下后(接地)才开始发送!!! 

4.My24L01_Tx为发送端程序,My24L01_Rx为接收端程序;

 5.接收端先上电,发送端上电后按下按键后才发送50KB(32B一帧 共32*50帧 32*32=1024=1K),发送端收到ACK后才发下一帧,发完后进入死循环,如须再发要先复位或重新上电;接收端每收到一次led反转;(如未反转说明未成功发送,发送端接收端重新复位后再试)时间可看在接收程序中tim3Count(单位ms 16进制,定时器1ms中断)在Watch1中

 6.发送端我用的是延时等待查询STATUS寄存器,用外部中断IRQ应该会更好(未测试) 

7.24L01采用0频道,2Mbps, 0dBm, Address 3Bytes,实测速率约为50KB/s
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值