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

一、超声波模块介绍:

(1)超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接受。电路板上           有4个引脚:

                     VCC : 正极

                     Trig   : 触发脚

                     Echo : 回应脚

                     GND : 接地

        主要参数:

                1)工作电压与电流:5V、15mA

                2)感测距离:2 ~ 400cm

                3)   感测角度:不大于15度

                4)被测物体的面积不要小于50cm²并且尽量平整。

                5)具体温度补偿电路

(2)工作原理:

                   在超声波模块的触发脚位(Trig)输入10微秒以上的高电位,即可发射超声波,发射超                       声波之后,与接收到传回的超声波之前,“响应”脚位(Echo)的高电位脉冲持续时间,                       换算出 被测物体的距离。

(3)时序图:

      

(4)超声波从发射到返回的时间、测试距离:

         测试距离 = (高电平时间 * 声速(340/s)) / 2

二、所用函数:

(1)读取引脚值函数:

               int  digitalRead(int pin);

               pin : 读取的引脚

               返回值:引脚上的电平,可以是LOW,HIGH之一。读取一个引脚的电平值LOW,HIGH。

 (2)延时函数:

               void delayMicroseconds(unsigned int howlong);

               作用:将执行暂停的微秒数(1000微秒 = 1毫秒 = 0.001秒)

               注:最大延时时间可达71分钟。

  (3)gettimeofday();  获取系统时间

           int  gettimeofday(struct timeval * tv , struct timezone * tz);

       1)    第一个参数是一个结构体:

                                      struct timeval

                                              {

                                                           time_t tv_sec;       //秒

                                                           suseconds_t  tv_usec;        //微秒

                                              };

           第二个参数是一个时区结构,已经过时了,所以tz参数通常应该指定为NULL

           2)作用:该函数会把自Epoch以来的秒数和微秒数放到tv结构体。

           3)返回值:调用成功返回 0,失败返回 -1 并设置ermo 

三、程序贴图

/*
*      超声波程序实现:     
*
*      超声波工作原理:              
*            在超声波模块的触发角位输入10微秒以上的高点位,即可发射超声波,发射超声波之后,
*            与接受到传回的超声波之前,“响应”脚位呈现高电位。因此,程序可从”响应“脚位的高
*            电位脉冲持续时间,换算出被测物的距离。    
*
*            思路:
*                 (1)初始wiringPi库
*                 (2)初始化引脚(把引脚都拉成低点位)
*                 (3)根据时序图控制Trig,Echo引脚的电平值和等待时间
*                 (4)算出声波在空气中的传播时间(Echo 引脚处于高电平的时间),进而算出距离
*
*
*                 VCC  ——————————— 5V
*                 Trig ——————————— 2
*                 Echo —————————— 3
*                 GND  —————————— GND
*
*                 
*
*/

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



#define Trig  2       //触发 (输出高电平)
#define Echo  3       //回响 (接收高电平)

//声明
void Initpin();
float ultr();



void Initpin()
   {

	pinMode(Trig,OUTPUT);
	pinMode(Echo,INPUT);
        
	//引脚默认输出低电平
	digitalWrite(Trig,LOW);
	digitalWrite(Echo,LOW);
   }


float ultr()
    {
	  struct timeval start_val;
	  struct timeval stop_val;
          float distance = 0;           //距离
          long start_time;             //开始时间
	  long stop_time;              //结束时间
          float HIGH_time;


          Initpin();     //初始化引脚模式
          
          digitalWrite(Trig,HIGH);
	  delayMicroseconds(10);        //延时10us
	  digitalWrite(Trig,LOW);

	  while(!(digitalRead(Echo) == HIGH));     
          //start
          gettimeofday(&start_val,NULL);
	  //printf("s = %d,us = %d\n",start_val.tv_sec,stop_val.tv_usec);
	 
	  while(!(digitalRead(Echo) == LOW))
          //stop
	  gettimeofday(&stop_val,NULL);
          //printf("s = %d,us = %d\n",stop_val.tv_sec,stop_val.tv_usec);
     
         
	  //计算高电平时间:(转换成微秒)
	  stop_time  = (stop_val.tv_sec * 1000000) + stop_val.tv_usec;
          start_time = (start_val.tv_sec * 1000000) + start_val.tv_usec;
          
	  //printf("stop_time = %ld\n",stop_time);
	  //printf("start_time = %ld\n",start_time);
          
	  HIGH_time = stop_time - start_time;
	  //printf("HIGH_time = %ld\n",HIGH_time);

	  //距离测试 = (高电平时间 * 声速(340/s))/2
          distance = ((HIGH_time / 1000000) * 34000)/2;
       
	  return distance;
    }

int main()
  {  
	float ret;
	if(wiringPiSetup() == -1)    //初始化wiringPi库
	 {
	        printf("wiringPi error\n");
wq		return -1;
	 }

         while(1)
	     {
                 ret = ultr();
	         printf("%.2fcm\n",ret);
		 sleep(1);
             }

	  return 0;
  }

                    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值