HC-SR04超声波测距 - 树莓派3B

本文介绍使用STC89C52RC单片机配合HC-SR04模块实现超声波测距的方法。通过树莓派3B开发环境,利用IO口触发测距并计算回波时间,最终换算成距离值。文章详细解释了测距原理及具体实现步骤。

一、前期准备

单片机:STC89C52RC
开发环境:树莓派3B
HC-SR04模块:淘宝有售
在这里插入图片描述

基本工作原理:

(1)采用 IO 口 TRIG 触发测距,给至少 10us 的高电平信号;
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

2.实现思路:

  • 给Trig一个持续10us的高电平,然后读取ECHO引脚是否为高电平,若为高电平,则开获取此时时间(start),然后继续检测等待其为低电平的时候,获取此时时间值(stop),然后带入公式进行计算距离:

    distance=(stop-start)/1000000/34000/2;

3.获取时间:

学会用 man !

//头文件 
<sys/time.h>
 
//结构
timeval
{
    time_t tv_sec;  //秒 [long int]
    suseconds_t tv_usec;  //微秒 [long int]
};

//获取时间函数
 int gettimeofday(struct timeval *restrict tp, void *restrict tzp);
// RETURN VALUE
The gettimeofday() function shall  return  0  and  no  value  shall  be
reserved to indicate an error.

#include<wiringPi.h>
#include<stdio.h>
#include<sys/time.h>
#define Trig 0
#define Echo 2
void CSBinit()
{
    pinMode(Trig,OUTPUT);
    pinMode(Echo,INPUT);
}
float distance()
{
    struct timeval t1;
    struct timeval t2;

    long start;
    long stop;
    float dis;

    digitalWrite(Trig,LOW);
    delayMicroseconds(2);

    digitalWrite(Trig,HIGH);
    delayMicroseconds(10);
    digitalWrite(Trig,LOW);

    while(digitalRead(Echo)==0);
    gettimeofday(&t1,NULL);

    while(digitalRead(Echo)==1);
    gettimeofday(&t2,NULL);

    start=t1.tv_sec*1000000+t1.tv_usec;
    stop=t2.tv_sec*1000000+t2.tv_usec;

    dis=(float)(stop-start)/1000000*34000/2;

    return dis;
}
int main()
{
    float dis;

    if(wiringPiSetup()==-1)
    {
        printf("wiringPiSetup failed\n");
        return 1;
    }

    CSBinit();

    while(1)
    {
        dis=distance();
        printf("distance=%0.2fcm\n",dis);
        delay(1000);
    }

    return 0;
}
HC-SR04 超声波测距模块是一种常用的非接触式距离测量设备,其硬件连接方法简单且通用,适用于多种微控制器系统,例如 Arduino、STM32、树莓派等。 ### 硬件引脚定义 HC-SR04 模块共有四个引脚,其功能如下: - **VCC**:模块的电源引脚,可接 3.3V 或 5V 直流电源。 - **Trig**:触发信号输入引脚,用于启动超声波发送,可连接到微控制器的任意一个通用 IO 引脚。 - **Echo**:回波信号输出引脚,用于接收超声波返回信号,可连接到微控制器的任意一个通用 IO 引脚。 - **GND**:接地引脚,需与微控制器的 GND 引脚连接,确保共地。 ### 硬件接线方式 在实际连接中,需按照以下方式完成接线: - **VCC 引脚**连接到微控制器的 3.3V 或 5V 输出端,为模块提供电源。 - **Trig 引脚**连接到微控制器的一个数字 IO 引脚,用于发送触发信号。 - **Echo 引脚**连接到微控制器的另一个数字 IO 引脚,用于读取回波信号。 - **GND 引脚**连接到微控制器的 GND 引脚,确保电路共地。 以 Arduino 为例,典型接线如下: - **VCC → 5V** - **GND → GND** - **Trig → D9** - **Echo → D8** 这种接线方式可确保模块正常工作,并通过 Arduino 的数字引脚发送触发信号和读取回波时间。 ### 注意事项 1. **电压匹配**:虽然 HC-SR04 可以在 3.3V 和 5V 下工作,但在使用 5V 供电时需确保微控制器的 IO 引脚支持 5V 输入,否则需使用电平转换器。 2. **信号完整性**:为了减少干扰,建议将模块与微控制器之间的连接线尽量缩短,并避免与其他高频信号线并行布线。 3. **触发信号要求**:每次测距需发送一个持续时间大于 10 微秒的高电平信号至 Trig 引脚,以启动模块发送超声波[^1]。 ### 示例代码(Arduino) 以下是一个基于 Arduino 的简单示例代码,用于读取 HC-SR04 的距离测量值: ```cpp int trigPin = 9; // Trig 引脚连接到 Arduino 的 D9 int echoPin = 8; // Echo 引脚连接到 Arduino 的 D8 long duration_us, distance_cm; void setup() { pinMode(trigPin, OUTPUT); // 设置 Trig 引脚为输出模式 pinMode(echoPin, INPUT); // 设置 Echo 引脚为输入模式 Serial.begin(9600); // 初始化串口通信 } void loop() { // 发送 10 微秒的高电平触发信号 digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // 读取 Echo 引脚的高电平持续时间 duration_us = pulseIn(echoPin, HIGH); // 计算距离(假设声速为 343 m/s) distance_cm = (duration_us / 2.0) * 0.0343; // 输出距离到串口监视器 Serial.print("Distance: "); Serial.print(distance_cm); Serial.println(" cm"); delay(500); // 每 500 毫秒测量一次 } ``` 此代码通过发送触发信号并测量回波时间,最终计算出目标距离,并通过串口打印结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值