1. 超声波测距
超声波测距的主要原理为发射装置发出超声波,根据接收器接到超声波时的时间差,与雷 达测距原理相似.
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时.
根据超声波在空气中的传递速度为 340m/s,在转换成距离
2. 超声波模块
在 Arduino 智能小车中,我们使用的超声波模块为 HC-SR04,具体如下图
在上述模块中共有4个引脚,具体解释如下:
VCC : 接 +5v 电 源
GND : 接 GND
Trig : 发出超声波引脚
Echo : 接收超声波引脚
3. Arduino 超声波编程
3.1 定义 Trig 与 Echo 引脚与初始化
将 Trig 与 Echo 引脚与 Arduino 引脚进行连接, 其中将 Echo 对应的 Arduino 引脚设置为 input,Trig 则设置为 output,具体编程如下:
3.2 超声波测距
在使用超声波模块时,具体的编程步骤如下: 设置 TRIG 引脚为低电平
设置 TRIG 引脚为高电平,维持10us
digitalWrite(PIN_TRIG,HIGH);//设置 TRIG 引脚为高电平
delayMicroseconds(10);//延时10us
设置 TRIG 引脚为低电平,准备下一次测距
digitalWrite(PIN_TRIG,LOW);//设置 TRIG 引脚为低电平
调用 pulseIn() 函数来计算从发出到接收的时间,在转换成距离
duration = float(pulseIn(PIN_ECHO,HIGH));
distance = (duration * 17)/1000;
在换算具体的过程如下:
340m/1s 换算成 34000cm / 1000000 us 经过约分之后,则表示成
34cm / 1000 us,表示 1us 对应的传输的距离(cm) 由于考虑传输包含发送的距离,故要除以2
3.3 超声波测距完整代码
以下代码可以进行超声波测距,并在串口终端显示距离,单位为 cm
void setup() { Serial.begin(115200); pinMode(PIN_TRIG,OUTPUT); pinMode(PIN_ECHO,INPUT);
}
void loop() {
float distance = ultrasonic_distance(); Serial.print(distance); Serial.println(" cm");
}
float ultrasonic_distance(void)
{
float distance; float duration;
digitalWrite(PIN_TRIG,LOW); delayMicroseconds(2); digitalWrite(PIN_TRIG,HIGH); delayMicroseconds(10); digitalWrite(PIN_TRIG,LOW);
//340m/1s ----> 34000cm / 1000000 us ----> 34 / 1000
// 1us = 34cm ,计算距离时需要除以2
duration = float(pulseIn(PIN_ECHO,HIGH)); distance = (duration * 17)/1000;
return distance;
}
4. 超声波避障
利用超声波模块可以进行避障与跟随,当遇到障碍物时可以选择停车或者改变小车运动方向.