Arduino学习(2)——HC-SR04超声波测距模块原理及代码实现
(1)超声波传感器原理
本项目使用的是HC-SR04超声波测距模块,如下图所示:

-
VCC:供电电源引脚
-
Trig:触发信号引脚
-
Echo:回声信号引脚
-
GND:电源地引脚
模块主要参数如下:
- 工作电压范围:3~5.5V宽电压供电
- 工作电流:<20mA
- 测量距离:2cm~450cm
- 测量精度:0.5cm
- 通信接口:IO数字接口
工作原理如下描述:
- 超声波的Trig引脚负责发送声波,触碰到物体后声波返回被Echo引脚接收,根据接收的时间长短以及声音在空气中的传播速度为340m/s,可以计算出所测得的距离。
- 给Trig引脚输入一个长为10us的高电平方波,输入方波后,模块会自动发射8个40kHz的声波,在同一时刻,Echo引脚电平会从0变为1。程序设计中,在Echo引脚电平翻转时,启动定时器进行计时。
- 当超声波触碰到物体并返回被模块接收到后,Echo引脚电平会由1变为0。程序设计中,在Echo引脚电平再次翻转时,停止定时器计时。
- 根据定时器定时时长,即可得到所测距离。
HC-SR04超声波传感器模块工作时序图如下所示:

(2)Arduino代码解析
/*
介绍:利用Arduino Uno板的Pin9和Pin10分别作为Trig引脚和Echo引脚
分别设置为输出和输入模式,根据Echo电平翻转的时长计算距离
最后用串口将所得到的距离打印到串口监视器上
*/
#define TRIG_PIN 9
#define ECHO_PIN 10
// 串口、Trig引脚、Echo引脚定义
void setup()
{
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop()
{
long duration, distance;
// 发送10微妙的高电平脉冲给Trig引脚
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(2);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.0344 / 2;
// 打印所测得的距离
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// 间隔0.5秒采集一次数据
delay(500);
}
实验结果如下:

特殊函数说明:
pulseIn()是Arduino中的一个内建函数,用来测量一个数字引脚上脉冲的宽度(高电平或低电平的持续时间)。该函数通常用于捕捉输入信号的时间长度,并将其以微秒为单位返回。
函数原型如下:
long pulseIn(uint8_t pin, uint8_t value);
long pulseIn(uint8_t pin, uint8_t value, unsigned long timeout);
- pin:数字引脚的编号,连接到需要测量脉冲的输入信号。
- Value:要测量的脉冲类型,通常为HIGH或LOW:
- HIGH:测量信号为高电平的持续时间
- LOW:测量信号为低电平的持续时间
- timeout(可选):最大等待时间,单位为毫秒。如果在这个时间内没有检测到脉冲,函数返回0。

浙公网安备 33010602011771号