|
1、 HC-SR04:一款廉价的超声波传感器 HC-SR04是一种常用的超声波传感器,能够探测2-300厘米范围内的障碍物。 传感器看起来像一个小PCB,前面有两个金属圆柱,背面有一个小电路。
在本文中,我们将提供一个简单的演示来使用HC-SR04。 首先简单阅读一下传感器的用户手册:HC-SR04 User Manual
该传感器有4个引脚: ● VCC,该引脚需要连接到5V; ● Trig,输入引脚,触发测量; ● Echo,输出引脚,发出方波; ● GND,该引脚需要连接到地。
2、 工作原理 两个圆柱实际上是超声波接收器(R)和超声波发射器(T),由电路驱动。 工作原理很简单:当触发时,发射器发射一些脉冲。 当声音遇到障碍物时,其被反射回来并由接收器检测。
由于声速几乎恒定,距离的计算与从发射到接收的经过时间严格相关。 事实上,声音必须行进两倍的距离(往返)。 已知经过的时间,到障碍物的距离:
其中: ● d是障碍物和传感器之间的距离 ● v是声速(约340m / s) ● t是经过的时间
注意,在这里我们不讨论测量的精度,这会受到不同因素的影响: ● 声速不恒定:取决于材料介质、温度、压力和湿度。 ● 时间测量精度:测量由电路板上的电路执行,我们没有控制这方面。 ● 障碍物可能没有平坦表面,并且可能存在多个衍射或伪回波。
3、 使用方法 如果Trig设置为高电平并保持至少10us,传感器将发出8个脉冲的声波。 对于声波产生回声所需的整个时间内,Echo为高电平。
测量距离的逻辑步骤如下: ● 设置输入捕捉单元来测量Echo引脚上方波的高电平周期; ● 上拉Trig信号至少10 us; ● 使用上一公式将测量时间转换为距离。
4、 简单演示 在第一个演示中,我们将使用STM32 Nucleo-F401RE开发板和ChibiOS来检测障碍物,并在ST-Link虚拟串口上打印输出距离。 为此,我们将使用chprintf()和ICU驱动程序。
引脚连接如下: ● VCC连接到5V; ● Trig连接到PB10; ● Echo连接到PA8; ● GND连接到地。
通过查看main.c,我们可以看到这个演示是如何工作的。 经过一些初始化后,代码开始捕获PA8上的方波。 - #define ICU_TIM_FREQ 1000000
- #define SPEED_OF_SOUND 343.2f
-
- static float lastdistance = 0.0;
-
- static void icuwidthcb(ICUDriver *icup) {
-
- icucnt_t width = icuGetWidthX(icup);
- lastdistance = SPEED_OF_SOUND * width / 10000.0;
- }
-
-
- static ICUConfig icucfg = {
- ICU_INPUT_ACTIVE_HIGH,
- ICU_TIM_FREQ, /* 1MHz ICU clock frequency. */
- icuwidthcb,
- NULL,
- NULL,
- ICU_CHANNEL_1,
- 0
- };
复制代码
如上所述,距离体现在方波的宽度上:通过计算先前描述的公式,可以从宽度获得开始的距离。距离存储在main使用的变量中。 - while (true) {
- /* Triggering */
- palWriteLine(LINE_TRIGGER, PAL_HIGH);
- chThdSleepMicroseconds(10);
- palWriteLine(LINE_TRIGGER, PAL_LOW);
- #if ANSI_ESCAPE_CODE_ALLOWED
- chprintf(chp, "\033[2J\033[1;1H");
- #endif
- chprintf(chp, "Distance: %.2f cm\n\r", lastdistance);
- chThdSleepMilliseconds(100);
- }
复制代码
主循环通过在Trig上提供上升沿触发一次测量,并在STLink虚拟串口上打印输出上一个测量数据。
这些演示已经在ChibiOS 16.1.7进行过测试,并且可以与每个ChibiOS 16.1.x版本配合使用。代码下载地址:RT-STM32F401RE-NUCLEO-HC-SR04。 |