基于全志H616的超声波测距实验

目录

一,超声波模块说明

①模块参数

②测距实现原理

③IO口接线说明

二,测距实现流程

①实现过程

②时序图

三,代码实现

①时间函数

②测试代码

③测距代码实现和验证

④视频演示链接


一,超声波模块说明

①模块参数

相关参数
模块型号:HC-SR04
工作电压DC 5V
工作电流15mA
工作频率40kHz
最远射程4m
最近射程2cm
测量角度15度
输入触发信号10uS 的 TTL 脉冲
输出回响信号输出TTL电平信号,与射程成比例
规格尺寸45*20*15mm

②测距实现原理

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

③IO口接线说明

型号: HC-SR04
接线参考:模块除了两个电源引脚外,还有 TRIG ECHO 引脚

  • Vcc:+5V电源供电
  • Trig:输入触发信号0(可以触发测距)
  • Echo:传出信号回响1(可以传回时间差)
  • Gnd:接地

二,测距实现流程

①实现过程

怎么让它发波: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 tv_sec;/*秒*/
     long tv_usec;/*微妙*/
};

②测试代码

计算程序在当前环境中数数10000次耗时多少微秒。
​
  1 #include <stdio.h>
  2 #include<sys/time.h>
  3
  4 //int gettimeofday(struct timeval *tv,struct timezone *tz )
  5 /*struct timeval
  6 {
  7   long tv_sec;//秒
  8   long tv_usec;//微妙
  9 }*/
 10 void cntTest()//数数10000次
 11 {
 12     int i,j;
 13     for(i=0;i<100;i++)
 14         for(j=0;j<100;j++);
 15 }
 16 int main()
 17 {
 18     struct timeval startTime;
 19     struct timeval stopTime;
 20
 21     gettimeofday(&startTime,NULL);//起始时间
 22     cntTest();//数10000次
 23     gettimeofday(&stopTime,NULL);//结束时间
 24
 25     long diffTime = 1000000*(stopTime.tv_sec-startTime.tv_sec)+(stopTime.tv_usec-startTime.tv_usec);
 26 //算出时间差值      //秒换算微秒
 27     printf("全志h6在linux中数10000次需要时间%lduS\n",diffTime);
 28
 29     return 0;
 30 }

​

运行结果:

orangepi@orangepizero2:~/hardwareSoft$ ./a.out
全志h6在linux中数10000次需要时间151uS
orangepi@orangepizero2:~/hardwareSoft$ ./a.out
全志h6在linux中数10000次需要时间151uS
orangepi@orangepizero2:~/hardwareSoft$ ./a.out
全志h6在linux中数10000次需要时间151uS
orangepi@orangepizero2:~/hardwareSoft$

③测距代码实现和验证

  1 #include <stdio.h>
  2 #include <wiringPi.h> //IO
  3 #include <sys/time.h> //时间
  4 #include <stdlib.h>
  5 #include <unistd.h>
  6
  7 #define Trig 0 //控制端/发送波
  8 #define Echo 1 //接收波
  9
 10 double getDistance()
 11 {
 12     double dis; //定义距离
 13
 14     struct timeval start; //定义起始时间
 15     struct timeval stop;  //定义停止时间
 16
 17                            //初始化IO口
 18     pinMode(Trig,OUTPUT);  //Trig口为输出口,放波
 19     pinMode(Echo,INPUT);   //Echo口为输入口,收波
 20
 21
 22     digitalWrite(Trig,LOW); //触发信号。
 23     usleep(5);             //在低电平上维持5微秒后,
 24
 25     digitalWrite(Trig,HIGH);//上到高电平维持10微秒,放波10微秒
 26     usleep(10);
 27
 28     digitalWrite(Trig,LOW); //最后拉到低电平,完成整个放波流程
 29
 30
 31     while(!digitalRead(Echo)); //用digitalRead读Echo的值,维持在低电平,刚开始的值为0,用!取反值为1。进入高电平等待
 32     gettimeofday(&start,NULL); //获取进入高电平后起始时间
 33     while(digitalRead(Echo)); //维持高电平继续等待,等到高电平不成立后进入低电平后停止
 34     gettimeofday(&stop,NULL); //获取停止时间
 35
 36     long diffTime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec-start.tv_usec);//计算波在空气中的时间
 37                     //秒的差值换算成微秒
 38     dis = (double)diffTime/1000000 * 34000 / 2; // 距离=速度(340m/s)*时间/2。波在空气中有来回,需要除以2
 39               //微秒换算成秒      //米换算厘米
 40     return dis;
 41 }
 42 int main()
 43 {
 44     double dis; //定义距离
 45
 46     //初始化wiringPi库,并判断
 47     if(wiringPiSetup() == -1){
 48         fprintf(stderr,"%s","initWiringPi error");
 49         exit(-1);
 50     }
 51
 52     while(1){
 53         dis = getDistance();
 54         printf("dis = %lf\n",dis);
 55         usleep(500000);
 56     }
 57
 58     return 0;
 59 }

编译结果:超声波模块距电脑显示器的距离由近到远的距离/cm

orangepi@orangepizero2:~/hardwareSoft$ sudo ./a.out
dis = 4.012000
dis = 3.162000
dis = 2.822000
dis = 5.202000
dis = 5.083000
dis = 5.406000
dis = 7.021000
dis = 7.038000
dis = 10.166000
dis = 10.744000
dis = 10.761000

④视频演示链接

https://live.csdn.net/v/276549?spm=1001.2014.3001.5501

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D.•

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值