wiringpi 库的应用 -- 超声波测距HC-SR04

树莓派(四)树莓派外设开发基础篇 阅读详情

HC-SR04

测距原理:

超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,
计算出模块到前方障碍物的距离


接线参考:

模块除了两个电源引脚外,还有TRIG,ECHO引脚

步骤:


怎么让它发波
 Trig,给Trig端口至少10us的高电平


怎么知道开始发了
Echo信号,由低电平跳转到高电平,表示开始发送波


怎么知道接收了返回波
Echo,由高电平跳转回低电平,表示波回来了


怎么算时间
Echo引脚维持高电平的时间!
波发出去的那一下,开始启动定时器
波回来的那一下,我们开始停止定时器,计算出中间经过多少时间


怎么算距离
距离=速度(340m/s)*时间/2

时间函数

我们需要先学会求时间,才能算出距离,先来了解一下时间函数


函数原型
#include<sys/time.h>
int gettimeofday(struct timeval *tv,struct timezone *tz )
gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中

对应的结构体:


struct timeval
{
  long tc_sec; //秒
  long tc_usec; //微秒

};

// 注意这里获得的时间是与1970年1月1日0时0分0秒的差值

1970年1月1日0时0分0秒是世界协调时间(UTC)的起始时间点,也被称为UNIX纪元(Unix Epoch)。UNIX操作系统及其衍生系统(如Linux)使用这个时间点作为计时的起点。

case1:简单使用


  1 #include<stdio.h>
  2 #include<sys/time.h>
  3 //int gettimeofday(struct timeval *tv,struct timezone *tz )
  4
  5
  6 int main()
  7 {
  8     struct timeval st;
  9     gettimeofday(&st,NULL);
 10
 11     printf("sec: %ld   usec: %ld\n",st.tv_sec,st.tv_usec);
 12
 13     return 0;
 14 }
 15


---------------------------------


 case2: 计算 数100000的耗时,单位毫秒


  1 #include<stdio.h>
  2 #include<sys/time.h>
  3 //int gettimeofday(struct timeval *tv,struct timezone *tz )
  4
  5 void cntTime()
  6 {
  7 int i,j;
  8 for(i=0;i<100;++i)
  9     for(j=0;j<1000;++j);
 10
 11 }
 12
 13 int main()
 14 {
 15     struct timeval st;
 16
 17     struct timeval ed;
 18     gettimeofday(&st,NULL);
 19     cntTime();
 20     gettimeofday(&ed,NULL);
 21
 22     long diffTime= (1000000*(ed.tv_sec-st.tv_sec))+(ed.tv_usec-st.tv_usec);
 23     printf("diffTime: %ld\n",diffTime);
 24
 25     return 0;
 26 }
 27

=======================================================

实现超声波测距:

 pinMode(TRIG,OUTPUT); --  对应   digitalWrite(TRIG,LOW);

 pinMode(ECHO,INPUT); --对应digitalRead() -- 读取电平,不需要传参

输出 --  写入 -->  这个管教输出信息,写入到板子中

输入 -- 读取 -->  这个管教输入信息,板子负责读取

分析时序图: 

Trig: 

A点前: 电平是从低开始

        A~B: 高电平 -- 10us持续

        B之后: 低电平  

对应实现: 

   digitalWrite(TRIG,LOW); // A点前
    usleep(5);

    digitalWrite(TRIG,HIGH); //A~B
    usleep(10); // 高电平持续10us
    digitalWrite(TRIG,LOW); //B之后

Echo:

  在超声波发出之前一直是低电平

  发出后开始计时 --st

  返回停止计时 -- ed

对应代码实现:

  while(!digitalRead(ECHO));  // st  之前一直读到低电平
    gettimeofday(&st,NULL);//开始计时 -- 记录开始时间
    while(digitalRead(ECHO)); //st~ed直接一直是高电平
    gettimeofday(&ed,NULL);//停止计时 -- 记录结束时间

计算时间和距离: 

   时间 long diffTime=1000000*(ed.tv_sec-st.tv_sec)+(ed.tv_usec-st.tv_usec);

    距离  dis=(double)diffTime/1000000 *34000/2;

   (        不强转double可能出不完1000000,得到0,干扰最终结果 

             单位 cm/s   /2 -- 得到的是来回距 离,实际距离   要/2     )

代码实现: 


#include<stdio.h>
#include<unistd.h>
#include<wiringPi.h>
#include<stdlib.h>
#include<sys/time.h>

#define TRIG 0
#define ECHO 1

double getDistance()
{

    double dis;
    struct timeval st;
    struct timeval ed;
    pinMode(TRIG,OUTPUT); // 设置模式为输出 --Trig
    pinMode(ECHO,INPUT);// 设置模式为输出 --Echo

    
    digitalWrite(TRIG,LOW); //给引脚设置电平
    usleep(5);

    digitalWrite(TRIG,HIGH);
    usleep(10);
    digitalWrite(TRIG,LOW);

    while(!digitalRead(ECHO));
    gettimeofday(&st,NULL);
    while(digitalRead(ECHO));
    gettimeofday(&ed,NULL);

    long diffTime=1000000*(ed.tv_sec-st.tv_sec)+(ed.tv_usec-st.tv_usec);

    dis=(double)diffTime/1000000 *34000/2;

    return dis;
}

int main()
{
    double dis;

    if(wiringPiSetup()==-1){// 初始化 wiringpi,失败返回-1
        fprintf(stderr,"%s","initwiringPi error");
        exit(-1);

    }

    while(1){
        dis =getDistance();
        printf("dis = %lf\n",dis);
        usleep(500000);


    }

    return 0;
}

树莓派驱动HC-SR04超声波测距模块的C语言实现 超声波测距是嵌入式开发中常用的距离测量技术,通过发射超声波并接收回波来计算物体距离。HC-SR04模块因其低成本、易用性广泛应用于机器人避障、液位检测等场景。树莓派作为流行的微型计算机平台,配合wiringPi库可以高效实现GPIO控制。本文以C语言为例,详细讲解如何通过树莓派GPIO触发HC-SR04模块,并精确计算回波时间差转换为距离值。内容涵盖硬件连接注意事项、时间微秒级测量原理以及工程实践中常见的误差处理方法,为物联网设备开发提供可靠的距离感知方案。 阅读详情

相关推荐

树莓派外设开发(快速上手)

树莓派外设开发wiringPi库的使用例子---接收指令让继电器工作跨平台文件传输FileZilla软件linux环境自带的scp命令串口交互HC-SR04超声波测距模块简单应用STC11L08XE单片机 + YS-LD3320语音识别模块简单应用 wiringPi库的使用 头文件:include <wiringPi.h> 查看树莓派引脚情况:在显示终端输入命令gpio readall 宏定义引脚:例如#define JDQ 3 wiringPi库初始化:wiringPiSetup()返回值等于

weixin_54194530的博客 347

树莓派——超声波模块(wiringPi)

输入10微秒以上的高电位,即可发射超声波,发射超 声波之后,与接收到传回的超声波之前,“响应”脚位(Echo)的高电位脉冲持续时间, 换算出 被测物体的距离。(1)超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接受。返回值:引脚上的电平,可以是LOW,HIGH之一。作用:将执行暂停的微秒数(1000微秒 = 1毫秒 = 0.001秒)测试距离 = (高电平时间 * 声速(340/s)) / 2。

douhou的博客 1262

H616基于官方外设开发----1

本文介绍了基于Orange Pi开发板的外设开发流程,包括:1. wiringPi库的安装与验证;2. 蜂鸣器控制开发,演示了IO口输出高低电平实现蜂鸣;3. 超声波测距模块HC-SR04的使用方法,详细说明了测距原理和时间函数计算距离的实现;4. SG90舵机控制,讲解了PWM信号控制原理,并提供了基于Linux定时器的软件PWM实现代码。文章涵盖了从基础IO操作到定时器、PWM等高级外设的开发方法,为嵌入式开发提供了实用参考。

H212202165的博客 987

树莓派之超声波模块之时间函数和digitalRead函数的使用

HC-SR004型号超声波 超声波传感器模块上面通常有两个超声波期间,一个发射,一个用于接收,电路板上有四个引脚,vcc,gnd,trig,echo. 主要参数: 工作电压和电流:5V,15mA 感测角度:不大于15° 被测物的面积不要小于50cm²并且要平整 具备温度补偿电路 2.接线方式 一共两个电源引脚和两个控制引脚。 Vcc 和 Gnd 接 5v DC 电源,但不推荐用独立电源给它供电,应使用树莓派或单片机的 GPIO 口输出 5v 和 Gnd 给它供电。不然会影响这个模块的运行。 Trig 引脚.

qq_56926420的博客 2539

SAP-ABAP:SAP中如何查看系统表之间的关联关系?

在业务逻辑开发或者ALV开发过程中,我们通常要从系统中找出几个标准表之间的关联关系,有的是head与item,通过外键进行关联的关系。那么怎么去找到呢?以上就是具体如何产看系统表之间的关联关系的步骤,对于不同代码的业务顾问,也是必须要掌握的。

LinkStar的博客 2430

在 Windows 上使用 Anaconda 创建 配置 YOLOv8虚拟环境,并更改 pip 源以及以 可编辑模式 安装ultralytics

前往 NVIDIA cuDNN 下载页面,下载与您安装的 CUDA 版本匹配的 cuDNN 版本。:根据您的系统和 CUDA 版本,选择适当的 whl 文件。如下12.7,表示最高可装12.7版本CUDA,与上图中的支持的最高cuda版本一致。,无需重新安装,从而大幅提升开发效率,适用于项目开发、调试或依赖本地未发布的版本时使用,但需确保当前目录包含。:访问 NVIDIA 官方网站,下载与您的显卡和操作系统兼容的 CUDA 版本。首先,确保NVIDIA 显卡支持 CUDA,并安装相应版本的驱动程序。

weixin_44115575的博客 1893

1.Adunio 瞎折腾记录

https://www.cnblogs.com/flyingjun/p/8954043.html 一直以来都想通过代码控制马达转动、LED闪烁奈何不具备电子方面的储备,只能工作闲暇之余整了个Arduino的小车来实现梦寐以求的东西。 目标: 1.实现四驱小车电机的转动 2.通过Android app 进行蓝牙通讯 协议:FF FF FF CMD SIZE [Data1,Data2,Data3,Data4] ...

Dy的专栏 881

Hermes 教程 03:Skills 系统

摘要:Hermes Skills是一种自我改进机制,可将解决问题的经验保存为可复用技能文档。v0.13.0版本遵循agentskills.io开放标准,与Claude Skills互通。技能创建流程包括发现问题、创建技能文件、加载使用和优化更新四个阶段。系统提供技能检索和自维护机制(Curator),支持技能媒体路由和多种管理命令。内置技能涵盖开发调试、创意头脑风暴等场景,通过积累技能使Hermes更适应用户需求。

程序猿_三产 730

基于wiringPi库写的一些代码(一)

•步骤• 如图,出现了这个,就说明安装成功。

luoyanglook的博客 426

Debezium报错处理系列之二十八: Expiring 1 record(s) for test-ts-0:120001 ms has passed since batch creation

Debezium报错处理系列之二十八: Expiring 1 record(s) for test-ts-0:120001 ms has passed since batch creation

zhengzaifeidelushang的博客 3290

(11)(2.2.2) BLHeli32,AM32, and BLHeli_S ESCs(一)

Ardupilot官网关于《Peripheral Hardware》的翻译 —《(2.2.2) BLHeli32,AM32, and BLHeli_S ESCs》。

无人机开发(开源Ardupilot) 2231

超声波测距

超声波测距

qq_59510647的博客 1157

Python数据可视化 Pyecharts 制作 Map 地图

大家好,我是Mr数据杨。想象一下,作为一名军师,如诸葛亮或郭嘉,'Map’就如同那战争的沙盘,兵马行动的轨迹,都需要准确的地图作为基础。‘基本设置’,就如同摆设这张战争沙盘,规定棋子的起始位置。‘数据配置选项’和’地图数据项’,就好比是军师们手中的情报,了解各路诸侯的兵力、粮草、地形等重要信息,以便于他们更好地布局。‘Demo’则代表着练兵之地,军师们可以在此基于已有数据,试验各种战术。

Mr数据杨 4万+

核桃派1B开发板与HC-SR04超声波测距实战

超声波测距是嵌入式开发中的基础传感器应用,通过发射40kHz超声波并测量回波时间差实现非接触式距离检测。其核心原理涉及GPIO控制、时间测量和声速计算,在智能家居、机器人避障等领域有广泛应用。本文以核桃派1B开发板与HC-SR04模块为例,详细解析硬件连接中的电平转换注意事项(如5V转3.3V分压电路),并提供Python和C语言两种实现方案。特别针对物联网开发场景,演示了如何结合MQTT协议实现远程监控,以及使用PyQt5构建可视化界面。通过滤波算法优化和温度补偿等工程实践技巧,可显著提升测量精度至±1c

weixin_30703911的博客 366

真正的工业级环形缓冲区(Circular Buffer)完整实现细节

永远不要永远不要ToArray()或AddRange()永远返回或两段Span永远用_head_tail% Capacity实现环形照着上面这套代码改,你的系统将彻底告别内存爆炸,从“实验室玩具”变成“产线战神”!需要我给你一个支持两段绘制的完整实现吗?

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 127

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

基于树莓派实现超声波测距

树莓派实现超声波测距 struct timeval结构体 struct timeval结构体在time.h中的定义为: struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds. */ }; 其中,`tv_sec` 为Epoch到创建struct timeval时的秒数,`tv_usec`为微秒数,即秒后面的零头。比如当前我写博文时的`tv_sec`为12447

weixin_48856218的博客 909

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OrangePi Zero2 全志H616开发学习文档、基础IO蜂鸣器、超声波测距、舵机PWM基础开发

OrangePi开发板不仅仅是一款消费品,同时也是给任何想用技术来进行创作创新的人设计的。它是一款简单、有趣、实用的工具,你可以用它去打造你身边的世界。

weixin_45650620的博客 1396

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Orangepi Zero2 全志H616】驱动超声波测距、时间函数(gettimeofday)API

一、HC-SR04超声波模块一、HC-SR04超声波模块型号:HC-SR04接线参考:模块除了两个电源引脚外,还有TRIG、ECHO引脚 / P0、P1超声波测距原理超声波PWM模拟的时序图二、时间函数API测试代码代码实现和验证。

咖喱年糕的博客 340

03-树莓派基本外设控制

树莓派作为一款受欢迎的微型计算机主板,凭借其丰富的外设接口、强大的处理能力和开源的生态系统,成为了学习嵌入式系统开发、物联网(IoT)应用的理想平台。本文通过介绍控制部分设备学习树莓派继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。

坏柠的博客 1160

全志H616开发(3)——基于官方外设开发(1)

vim的设置,修改/etc/vim/vimrc文件,需要用超级用户权限。shell脚本处理参数,可以通过$?来处理,这里的$1是要编译的文件。蜂鸣器响的原理:基本IO口的应用。蜂鸣器配合时间函数开发。shell脚本小插曲。

weixin_44999992的博客 485

智能垃圾桶 Linux和树莓派-网络编程(总结)

前期准备: 1.OLED液晶显示模块 2.L9110马达驱动模块 3.HC-SR04超声波模块 4.SG90舵机驱动模块 5.DS18B20温度检测模块 6.树莓派3B 模块原理: OLED液晶显示屏: 液晶显示是点阵显示,就是一个一个的点显示在屏幕上,靠这些点的亮灭组合来完成我们想要的目标。 1.那么我们 要想显示就得先创建一个用来初始化屏幕的数组。 2.我们创建一个能显示内容在屏幕上的数...

Addrews的博客 1106

全志之时间函数、定时器(蜂鸣器、超声波、SG90舵机)

如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等常见的有0-90°、0-180°、0-360°怎么控制转角向黄色信号线“灌入”PWM信号。PWM波的频率不能太高,50hz,即周期=1/频率=1/50=0.02s,20ms左右数据:不同的PWM波形对应不同的旋转角度,以20ms为周期,50hz为频率的PWM波。

weixin_49001476的博客 1137

【嵌入式Linux】基于OrangePi的官方外设开发

如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制。用处垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等常见的有0-90°、0-180°、0-360°怎么控制舵机向黄色信号线“灌入”PWM信号。PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右数据1.0ms------------45度;5.0%对应函数中占空比为5001.5ms------------90度;7.5%对应函数中占空比为750。...

qq_62361050的博客 819

树莓派3入门套件开箱组装与GPIO编程实战指南

单板计算机(SBC)作为嵌入式系统和物联网(IoT)开发的核心硬件平台,其核心原理在于将完整计算机功能集成于一块紧凑电路板上,通过通用输入输出(GPIO)引脚实现与物理世界的交互。这种设计极大降低了硬件开发门槛,为智能家居、环境监测等应用场景提供了灵活的技术基础。树莓派作为最流行的单板计算机之一,其入门套件组装与系统配置是掌握物联网开发的关键第一步。本文聚焦树莓派3 Model B+入门套件的开箱组装细节、操作系统部署流程,并深入讲解通过Python和C++进行GPIO编程控制LED与读取按钮输入的核心方法

weixin_33725270的博客 428
上一篇: 全志H616学习笔记
下一篇: wiringpi库的应用 -- sg90 定时器 oled
mx_jun
博客等级 码龄5年 1605粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值