超声波模块

简介:
超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。

硬件
电路板上有4个引脚:

VCC(正级)
Trig(触发)
Echo(回应)
GND(接地-负极)

主要参数:

  • 工作电压与电流:5V、15mA
  • 感测距离:2~400cm
  • 感测角度:不大于15°
  • 被测物体的面积:不要小于50cm²,且尽量平整
  • 具备温度补偿电路
    在超声波模块的触发脚位输入10微秒以上的高电位,即可发射超声波,发射超声波之后,与接收到传回的超声波之前,“响应”脚位呈现高电位。因此,程序可以从“响应”脚位的高位脉冲持续时间,换算出被测物的距离。

超声波模块工作原理

超声波时序图

超声波模块工作原理

模块

T(发波)

R(接受)

先给 Trig 引脚发送一个 10uS(微秒)的 TTL(高电平)

T就可以发波了

发出的是循环 8 个 40KHz 的脉冲

波发出去后,Echo 引脚就会一直维持高电平,也就是说波在空中传播的过程是一直维持高电平

那么就可以根据Echo 引脚的高电平维持时间,超声波在空气中的物理性质的传输速度,就可以算出障碍物跟发波点的距离

即超声波能在空气中1秒能跑多远,那么就可以通过Echo 引脚的高电平维持时间,换算距离了

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

#define Trig    4
#define Echo    5

void ultraInit(void)
{
    pinMode(Echo, INPUT);  //设置端口为输入
    pinMode(Trig, OUTPUT);  //设置端口为输出
}

float disMeasure(void)
{
    struct timeval tv1;  //timeval是time.h中的预定义结构体 其中包含两个一个是秒,一个是微秒,这里是存放获取linux系统时间的结构体变量
    /*  timeval是time.h中的预定义结构体
    struct timeval
    {
        time_t tv_sec;  //Seconds.  秒
        suseconds_t tv_usec;  //Microseconds.   微秒
    };
    */

    struct timeval tv2;
    long start, stop;
    float dis;

    digitalWrite(Trig, LOW);    //输出一个低电平,保证超声波不发波
    delayMicroseconds(2);       //等待2微秒秒

    digitalWrite(Trig, HIGH);   //输出一个高电平,发出超声波
    delayMicroseconds(10);      //持续发出超声波脉冲的时间
    digitalWrite(Trig, LOW);    //输出一个低电平,使超声波不发波

    while(!(digitalRead(Echo) == 1));  //digitalRead()函数检测Echo引脚的开始输出的电平的时间点,好获取开始发波的时间
    gettimeofday(&tv1, NULL);           //获取当前时间 开始接收到返回信号的时候

    while(!(digitalRead(Echo) == 0));   //digitalRead()函数检测Echo引脚,是否有接受到碰到障碍物回弹的波被 R(接收器)感受到了后输出不同电平的时间点
    gettimeofday(&tv2, NULL);           //获取当前时间  最后接收到返回信号的时候
    /*
    int gettimeofday(struct timeval *tv, struct timezone *tz);
	gettimeofday()和settimeofday()函数可以获取和设置时间以及时区。
	tz参数通常应该指定为NULL。
    */
    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(void)
{
    float dis;  //存放测试的距离

    if(wiringPiSetup() == -1){ //如果初始化硬件接口失败,就输出错误信息,程序初始化工序务必进行
        printf("setup wiringPi failed !");
        return 1;
    }

    ultraInit(); //初始化超声波引脚,设置引脚 Trig、Echo 的树莓派对应端口功能

    while(1){
        dis = disMeasure();  //测距
        printf("distance = %0.2f cm\n",dis);
        delay(1000);
    }

    return 0;
}

加入蜂鸣器,效果为,障碍物离超声波模块的距离小于10cm就间隔的响

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

#define Trig    4
#define Echo    5
#define Feng    7

void ultraInit(void)
{
        pinMode(Echo, INPUT);  //设置端口为输入
        pinMode(Trig, OUTPUT);  //设置端口为输出
        pinMode(Feng, OUTPUT);
}

float disMeasure(void)
{
        struct timeval tv1;  //timeval是time.h中的预定义结构体 其中包含两个一个是秒,一个是微秒

        struct timeval tv2;
        long start, stop;
        float dis;

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

        digitalWrite(Trig, HIGH);
        delayMicroseconds(10);      //发出超声波脉冲
        digitalWrite(Trig, LOW);

        while(!(digitalRead(Echo) == 1));
        gettimeofday(&tv1, NULL);           //获取当前时间 开始接收到返回信号的时候

        while(!(digitalRead(Echo) == 0));
        gettimeofday(&tv2, NULL);           //获取当前时间  最后接收到返回信号的时候
        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;
}

void doVoice(void){
        for(int i=1;i<=3;i++){
                digitalWrite(Feng,HIGH);
                delay(500);
                digitalWrite(Feng,LOW);
                delay(500);
        }
}

int main(void)
{
        float dis;

        if(wiringPiSetup() == -1){ //如果初始化失败,就输出错误信息 程序初始化时务必进行
                printf("setup wiringPi failed !");
                return -1;
        }

        ultraInit();//超声波引脚初始化————定义输出,输入端口

        while(1){
                dis = disMeasure();
                printf("distance = %0.2f cm\n",dis);
                int s = dis;
                if(s < 10 ){
                        doVoice();
                        digitalWrite(Feng,HIGH);
                }else{
                        digitalWrite(Feng,HIGH);
                }

                delay(1000);
        }

        return 0;
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐