zoukankan      html  css  js  c++  java
  • 超声波hc_sr04模块——树莓派基于C语言程序

    产品特点

    HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能, 测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。
    基本工作原理:
    (1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。
    (2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回。
    (3)有信号返回, 通过 IO 口 ECHO 输出一个高电平, 高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2。



    电气参数

    超声波时序图

    以上时序图表明你只需要提供一个 10uS 以上脉冲触发信号,该模块内部将发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。 由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。 公式: uS/58=厘米或者 uS/148=英寸; 或是: 距离=高电平时间*声速(340M/S) /2; 建议测量周期为 60ms 以上, 以防止发射信号对回响信号的影响。

     1 #include <stdio.h>
     2 #include <wiringPi.h>
     3 
     4 const int Trig_Pin = 1;    //Trig输出
     5 const int Echo_Pin = 4;    //Echo输入
     6 
     7 void hc_sr04_init(void)
     8 {
     9     pinMode(Trig_Pin, OUTPUT);
    10     pinMode(Echo_Pin, INPUT);
    11 }
    12 
    13 void hc_distance()
    14 {
    15     unsigned int start_time = 0;
    16     unsigned int end_time = 0;
    17     unsigned int real_time = 0;
    18     float distance = 0.0;
    19     digitalWrite(Trig_Pin, HIGH);
    20     delayMicroseconds(10);        //10us延时
    21     digitalWrite(Trig_Pin, LOW);
    22     
    23     while(digitalRead(Echo_Pin) == LOW)   //发射前Echo一直为低电平
    24         start_time = micros();
    25     while(digitalRead(Echo_Pin) == HIGH)  //HC_SR04发射超声波时,Echo至为高电平
    26         end_time = micros();
    27     
    28     real_time = end_time - start_time;    //时间精度为us级
    29     distance = (real_time * 0.0343) / 2;
    30     printf("distance: %.1fcm
    ", distance);
    31 }
    32 
    33 int main()
    34 {
    35     if(wiringPiSetup() == -1)
    36     {
    37         printf("Error!
    ");
    38         return 1;
    39     }
    40     hc_sr04_init();
    41     while(1)
    42     {
    43         hc_distance();
    44         delay(2000);
    45     }
    46     return 0;
    47 }

    HC_SR04超声波模块与RGB全彩LED程序,实现不同距离显示不同的颜色。

     1 #include <stdio.h>
     2 #include <wiringPi.h>
     3 #include <softPwm.h>
     4 
     5 const int Trig_Pin = 1;    //Trig输出
     6 const int Echo_Pin = 4;    //Echo输入
     7 
     8 const int Red_Pin = 9;
     9 const int Green_Pin = 10;
    10 const int Blue_Pin = 11;
    11 
    12 int colors[] = {0x00ff00, 0x228b22, 0xff4500, 
    13                 0xff00ff, 0xffff00, 0xff0000};
    14 
    15 void RGB_Color_Init()
    16 {
    17     softPwmCreate(Red_Pin, 0, 100);
    18     softPwmCreate(Green_Pin, 0, 100);
    19     softPwmCreate(Blue_Pin, 0, 100);
    20 }
    21 
    22 void Set_Color(int color)
    23 {
    24     int Red_color, Green_color, Blue_color;
    25     
    26     Red_color = (color & 0xff0000) >> 16;
    27     Green_color = (color & 0x00ff00) >> 8;
    28     Blue_color = (color & 0x0000ff) >> 0;
    29     
    30     softPwmWrite(Red_Pin, Red_color);
    31     softPwmWrite(Green_Pin, Green_color);
    32     softPwmWrite(Blue_Pin, Blue_color);
    33 }
    34 
    35 void hc_sr04_init(void)
    36 {
    37     pinMode(Trig_Pin, OUTPUT);
    38     pinMode(Echo_Pin, INPUT);
    39 }
    40 
    41 float hc_distance()
    42 {
    43     unsigned int start_time = 0;
    44     unsigned int end_time = 0;
    45     unsigned int real_time = 0;
    46     float distance = 0.0;
    47     digitalWrite(Trig_Pin, HIGH);
    48     delayMicroseconds(10);        //10us延时
    49     digitalWrite(Trig_Pin, LOW);
    50     
    51     while(digitalRead(Echo_Pin) == LOW)
    52         start_time = micros();
    53     while(digitalRead(Echo_Pin) == HIGH)
    54         end_time = micros();
    55     
    56     real_time = end_time - start_time;    //时间精度为us级
    57     distance = (real_time * 0.0343) / 2;
    58     printf("distance: %.1fcm
    ", distance);
    59     
    60     return distance;
    61 }
    62 
    63 
    64 int main()
    65 {
    66     int i=0;
    67     int distance;
    68     float distance_1;
    69     if(wiringPiSetup() == -1)
    70     {
    71         printf("Error!
    ");
    72         return 1;
    73     }
    74     RGB_Color_Init();
    75     hc_sr04_init();
    76     while(1)
    77     {
    78         distance_1 = hc_distance();
    79         distance = (int)distance_1;
    80         
    81         i = sizeof(colors)/sizeof(int);
    82         if(distance >= 0 && distance <= 5)
    83             Set_Color(colors[i-6]);
    84         else if(distance > 5 && distance <= 10)
    85             Set_Color(colors[i-5]);
    86         else if(distance > 10 && distance <= 20)
    87             Set_Color(colors[i-4]);
    88         else if(distance > 20 && distance <= 30)
    89             Set_Color(colors[i-3]);    
    90         else if(distance > 30 && distance <= 40)
    91             Set_Color(colors[i-2]);
    92         else
    93             Set_Color(colors[i-1]);
    94             
    95         delay(1500);
    96     }
    97     return 0;
    98 }
  • 相关阅读:
    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
    11
    实战 迁移学习 VGG19、ResNet50、InceptionV3 实践 猫狗大战 问题
    tx2系统备份与恢复
    如何在Ubuntu 18.04上安装和卸载TeamViewer
    bzoj 3732 Network (kruskal重构树)
    bzoj2152 聪聪可可 (树形dp)
    牛客 216D 消消乐 (二分图最小点覆盖)
    牛客 197E 01串
    Wannafly挑战赛23
  • 原文地址:https://www.cnblogs.com/demo-lv/p/14020463.html
Copyright © 2011-2022 走看看