硬件搭设
超声波
HC-SRO4超声波模块的一些基本资料大家可以在某度上随便输入几个字就能找到好多,在这里我就不啰嗦了,接下来我们重点来研究一下它的原理图,以便于我们对对射有更好的了解。下面就是我找到的我们的超声波的原理图
在这里我要先简单介绍下对射的原理:两个超声波,通过一些特定的设置,让一个只发送,一个只接收,这样两个超声波就形成了对射关系。进而进行一个实时单向的测距工作。
超声波的原理大家应该略知一二,它是依据声音的物理反射的来测距的,声波从一端传出,开始计时,当另一端接收到传出的信号时停止计时利用公式推算出距离。
在这里,负责发送的模块不需要做任何处理,不明白为什么不需要做处理的同学在你们实际操作的时候会明白。负责接收的模块我们需要对他做一些特定的处理,处理的目的是让它不接受自己发射的超声波而是接受发射端发射的超声波。接收端对超声波的处理有两种方式:
软处理
所谓软处理就是通过程序来更改内部的设置,如关闭发射端。这种方法是最容易想到也是大家最接受的,但是理想是丰满的现实很骨感。个大家看一下超声波的发射接收程序
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模块
- 主函数