树莓派超声波测距实验

来源:互联网 发布:商家去哪里找淘宝达人 编辑:程序博客网 时间:2024/04/28 14:05

超声波模块可以用hc-sr05,淘宝有许多,图如下
这里写图片描述
共四个接口
VCC、trig(控制端)、 echo(接收端)、 GND
原理比较简单
(1)采用IO口对TRIG触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
距离=(高电平时间*声速(340M/S))/2;
详细一点的内容可以看这里
https://electrosome.com/hc-sr04-ultrasonic-sensor-raspberry-pi/
该文在echo与树莓派之间加了电阻,防止电流冲击,实际不加问题不大。
实验接线如图

这里写图片描述

C源代码

/*             define from bcm2835.h                       define from Board DVK511                 3.3V | | 5V               ->                 3.3V | | 5V    RPI_V2_GPIO_P1_03 | | 5V               ->                  SDA | | 5V     RPI_V2_GPIO_P1_05 | | GND              ->                  SCL | | GND       RPI_GPIO_P1_07 | | RPI_GPIO_P1_08   ->                  IO7 | | TX                  GND | | RPI_GPIO_P1_10   ->                  GND | | RX       RPI_GPIO_P1_11 | | RPI_GPIO_P1_12   ->                  IO0 | | IO1    RPI_V2_GPIO_P1_13 | | GND              ->                  IO2 | | GND       RPI_GPIO_P1_15 | | RPI_GPIO_P1_16   ->                  IO3 | | IO4                  VCC | | RPI_GPIO_P1_18   ->                  VCC | | IO5       RPI_GPIO_P1_19 | | GND              ->                 MOSI | | GND       RPI_GPIO_P1_21 | | RPI_GPIO_P1_22   ->                 MISO | | IO6       RPI_GPIO_P1_23 | | RPI_GPIO_P1_24   ->                  SCK | | CE0                  GND | | RPI_GPIO_P1_26   ->                  GND | | CE1::if your raspberry Pi is version 1 or rev 1 or rev ARPI_V2_GPIO_P1_03->RPI_GPIO_P1_03RPI_V2_GPIO_P1_05->RPI_GPIO_P1_05RPI_V2_GPIO_P1_13->RPI_GPIO_P1_13::*/#include <bcm2835.h>#include <stdio.h>#include <sys/time.h>#define SS  RPI_GPIO_P1_16      //send signal#define RS  RPI_GPIO_P1_11      //receive signalint getdistance(){    bcm2835_gpio_write(SS,LOW);    bcm2835_delay(100);    bcm2835_gpio_write(SS,HIGH);    bcm2835_delayMicroseconds(15);    bcm2835_gpio_write(SS,LOW);    while(bcm2835_gpio_lev(RS)==0)    {        bcm2835_delayMicroseconds(1);    }    struct timeval tv_begin, tv_end;    gettimeofday(&tv_begin, NULL);    int count=0;    //最远探测约5米,无回波返回    while(bcm2835_gpio_lev(RS)==1 && count<=30000)    {        bcm2835_delayMicroseconds(1);        count++;    }    if(count>=30000)        return 0;    gettimeofday(&tv_end, NULL);    int timebetween;    if(tv_end.tv_sec>tv_begin.tv_sec)    {        timebetween=tv_end.tv_usec+1000000-tv_begin.tv_usec;    }    else        timebetween=tv_end.tv_usec-tv_begin.tv_usec;    int distance=timebetween*17150/1000000;    return distance;    //bcm2835_delay(500);}int main(int argc, char **argv){    uint8_t value,i;    if (!bcm2835_init())    {        printf("init error\n");        return 1;    }    bcm2835_gpio_fsel(SS, BCM2835_GPIO_FSEL_OUTP);    bcm2835_gpio_fsel(RS, BCM2835_GPIO_FSEL_INPT);    while (1)    {        printf("distance %d cm\n",  getdistance());        bcm2835_delay(1000);    }    bcm2835_close();    return 0;}
0 0