Arduino Uno 超声波传感器HC-SR04测距

介绍

在本教程中,我们将学习Arduino和超声波传感器的基础知识,并探索如何用它们制作一个简单的障碍物检测器。

实现效果

在超声波前放置障碍物,串口输出距离数据。

元件说明

201909030654026858

HC-SR04 是一款常用的超声波传感器模块,它具有以下几个特点:

  1. 工作电压为 +5V,相对简单,易于使用。

  2. 测量距离范围为 2cm - 400cm,精度可以达到 3mm。

  3. 有效测量角度为 15度。

  4. 接口为TRIG触发脉冲输入、ECHO脉冲宽度输出。

  5. 接收到TRIG信号后会自动发送大于8 cycles的超声波,然后自动接受返回的ECHO信号。

  6. ECHO持续的高电平时间就是超声波从发射到返回的时间,通过这个时间可以计算出测量距离。

  7. 封装小巧,便于集成到各种设备和产品中。

  8. 支持5V和3.3V功率接口,易于微控制器或者Arduino控制。

  9. 噪声抗干扰能力强,精度高。

  10. 价格低廉,易于获取。

超声波在稳定性上还有以下缺点:

  1. 声波速度会受温度影响,所以有些超声波传感器带有温度补偿。
  2. 声波的反射面积有要求,例如面积过小的柱子,无法反射声波。
  3. 声波对反射的表面材料有要求,有一些衣物布料会吸收声波,无法反射。
  4. 多个超声波传感器一起工作,容易收到干扰。
  5. 精度不足,测量精度大约在3mm左右,对于要求高精度的应用可能还不够。
  6. 存在死区,最小只能测量2cm左右的距离,小于2cm的距离无法测量。

所以HC-SR04是一个性价比很高,使用方便,功能实用的超声波传感器模块。它的这些特点使其在距离测量、避障等领域有很广泛的应用。多应用于机器人避开障碍物,距离测量。

引脚说明

HC-SR04超声波模块一般有4个引脚,每个引脚的作用如下:

  1. VCC:电源正端,接5V电源

  2. Trig :输入触发信号,给这个脚发送一个>=10us的高电平信号来触发传感器,让它发出超声波

  3. Echo:输出回波信号,它会返回一个高电平,高电平维持的时间就是超声波从发射到返回的时间

  4. GND:电源地端

工作原理是:

  1. 用Trig脚发送一个>=10us的高电平信号,触发模块发出超声波。

  2. 模块会在Trig信号结束后自动发送8个40KHz的超声波脉冲,并接收Echo。

  3. 当接收到回波信号时,Echo会由低电平变高电平,并维持高电平时间就是超声波运行时间。

  4. 通过读取Echo高电平时间,就可以计算出距离。时间和距离公式为:Distance = (高电平时间*声速)/2

  5. 最后Echo会恢复低电平,等待下一次测距。

所以通过控制Trig触发信号,并读取Echo的回波时间,就可以实现HC-SR04的距离测量功能。

超声波传感器

BOM表

  • Arduino Uno板
  • 超声波传感器HC-SR04
  • 杜邦线(至少需要5根)
  • 面包板
  • 障碍物

接线图

20160514202140483

程序代码

//welcome to lingshunlab.com

#define Trig 2 //引脚Tring 连接 IO D2
#define Echo 3 //引脚Echo 连接 IO D3 

float cm; //距离变量
float temp; // 

void setup() {
  Serial.begin(115200);
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
}

void loop() {
  //给Trig发送一个低高低的短时间脉冲,触发测距
  digitalWrite(Trig, LOW); //给Trig发送一个低电平
  delayMicroseconds(2);    //等待 2微妙
  digitalWrite(Trig,HIGH); //给Trig发送一个高电平
  delayMicroseconds(10);    //等待 10微妙
  digitalWrite(Trig, LOW); //给Trig发送一个低电平

  temp = float(pulseIn(Echo, HIGH)); //存储回波等待时间,
  //pulseIn函数会等待引脚变为HIGH,开始计算时间,再等待变为LOW并停止计时
  //返回脉冲的长度

  //声速是:340m/1s 换算成 34000cm / 1000000μs => 34 / 1000
  //因为发送到接收,实际是相同距离走了2回,所以要除以2
  //距离(厘米)  =  (回波时间 * (34 / 1000)) / 2
  //简化后的计算公式为 (回波时间 * 17)/ 1000

  cm = (temp * 17 )/1000; //把回波时间换算成cm

  Serial.print("Echo =");
  Serial.print(temp);//串口输出等待时间的原始数据
  Serial.print(" | | Distance = ");
  Serial.print(cm);//串口输出距离换算成cm的结果
  Serial.println("cm");
  delay(100);
}

测试

将传感器朝向一个物体,您会看到串口监视器输出的数字会随着物体离传感器的距离而变化。

结论

Arduino和超声波传感器的组合使得制作一个障碍物检测器变得非常简单。在此基础上,您可以实现更复杂的项目,例如应用于智能机器人、车辆倒车雷达等。祝您好运!