用树莓派简单实现超声波模块HC-SR04测距

用到的器件

超声波模块HC-SR04
树莓派
四条杜邦线
数据线一条

实验前提

secure CRT是一款支持 SSH2、SSH1、Telnet、Telnet/SSH、Relogin、Serial、TAPI、RAW 等协议的终端仿真程序,最吸引我的是,SecureCRT 支持标签化 SSH 对话,从而可方便地管理多个 SSH 连接,设置项也极为丰富。简单的说是Windows下登录UNIX、Linux服务器主机的软件。SecureCRT支持SSH,同时支持Telnet和rlogin协议。
用树莓派简单实现超声波模块HC-SR04测距_第1张图片
用securecrt连接树莓派,在Windows直接敲代码(获取树莓派ip和树莓派使用WiFi与电脑相连,和如何启用树莓派ssh)

接线方式

一共两个电源引脚和两个控制引脚。
Vcc 和 Gnd 接 5v DC 电源
Trig 引脚用来接收树莓派的控制信号。接任意 GPIO 口。这里我用的是GPIO.0
Echo 引脚用来向树莓派返回测距信息。接任意 GPIO 口。这里我用的是GPIO.2
用树莓派简单实现超声波模块HC-SR04测距_第2张图片
用树莓派简单实现超声波模块HC-SR04测距_第3张图片

超声波测距原理

(1)树莓派向 Trig 脚发送一个 10us 的脉冲信号。
(2) HC-SR04 接收到信号,开始发送超声波,并把 Echo置为高电平,然后准备接收返回的超声波。
(3) HC-SR04 接收到返回的超声波,把 Echo 置为低电平。
(4)Echo 高电平持续的时间就是超声波从发射到返回的时间间隔。
(5)计算
首先超声波计算距离是根据超声波模块发出超声波遇到物体会返回,此时距离为总的时间声音速度再除以2
S=(Tsum
V)/2
根据上面的说明 Tsum就是Echo 高电平持续的时间 ,声音速度我们取340米每秒
而ECHO高电平时间需要我们用struct timeval和gettimeofday来获取
struct timeval是一个时间结构体, 具体字段分别是秒和微秒, gettimeofday是具体获取时间的函数,超声波发出的时候记录下时间start,超声波回来的时刻也记录下来为stop,相减一下就是Tsum

具体代码实现:

#include 
#include 
#include 
#include 
#define Echo 0
#define Trig 2//定义两个关键的gpio口
float getDistance()
{


        struct timeval tv1;//起始时间结构体
        struct timeval tv2;//停止时间结构体
        long start;//开始时间
        long stop;//停止时间
        float dis;//距离
        pinMode(Echo,INPUT);//将ECHO口定为输入口,接收超声波
        pinMode(Trig,OUTPUT);//将Trig口定为输出口,输出10us脉冲


        //trig 输出十秒脉冲
        digitalWrite (Trig, LOW);
        delayMicroseconds(2);
        digitalWrite (Trig, HIGH);
        delayMicroseconds(10);
        digitalWrite (Trig, LOW);

       //当echo从0变1的时刻,记录下开始时间,并存在tv1时间结构体中
        while(digitalRead(Echo)==0);
           gettimeofday(&tv1,NULL);

      //当echo从1变0的时刻,记录下停止时间,并存在tv2时间结构体中
        while(digitalRead(Echo)==1);
           gettimeofday(&tv2,NULL);
        
          
         //将时间赋给start和stop变量并计算距离
        start=tv1.tv_sec*1000000+tv1.tv_usec;
        stop=tv2.tv_sec*1000000+tv2.tv_usec;
        dis=(float)(stop-start)/1000000*34000/2;
        return dis;
}            
      
int main()
{
        int ret;
        ret=wiringPiSetup();//初始化wiringPi
        if(ret==-1){
                printf("wiringPiSetup failed\n");
                exit(-1);
        }   
        //while循环,一直计算距离,并打印出来
        while(1){ 

                float dis;
                dis=getDistance();
                printf("distance is %0.2f cm\n",dis);
                delay(1000);
        }
        return 0;
}

你可能感兴趣的:(树莓派)