Arduino学习(2)——HC-SR04超声波测距模块原理及代码实现

(1)超声波传感器原理

本项目使用的是HC-SR04超声波测距模块,如下图所示:

该模块管脚功能定义如下:
  • VCC:供电电源引脚

  • Trig:触发信号引脚

  • Echo:回声信号引脚

  • GND:电源地引脚

模块主要参数如下:

  • 工作电压范围:3~5.5V宽电压供电
  • 工作电流:<20mA
  • 测量距离:2cm~450cm
  • 测量精度:0.5cm
  • 通信接口:IO数字接口

工作原理如下描述:

  1. 超声波的Trig引脚负责发送声波,触碰到物体后声波返回被Echo引脚接收,根据接收的时间长短以及声音在空气中的传播速度为340m/s,可以计算出所测得的距离。
  2. 给Trig引脚输入一个长为10us的高电平方波,输入方波后,模块会自动发射8个40kHz的声波,在同一时刻,Echo引脚电平会从0变为1。程序设计中,在Echo引脚电平翻转时,启动定时器进行计时。
  3. 当超声波触碰到物体并返回被模块接收到后,Echo引脚电平会由1变为0。程序设计中,在Echo引脚电平再次翻转时,停止定时器计时。
  4. 根据定时器定时时长,即可得到所测距离。

HC-SR04超声波传感器模块工作时序图如下所示:

image

(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);
}

实验结果如下:

image

特殊函数说明:

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。
posted @   儒隐  阅读(40)  评论(0编辑  收藏  举报
编辑推荐:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
点击右上角即可分享
微信分享提示