raspberryPi g ++:超声波传感器不工作......!

时间:2014-03-22 16:23:49

标签: c++ raspberry-pi interrupt raspbian

我编写了以下程序,使用g ++在Rasberry pi Raspbian wheezy中连接超声波传感器,使用接线Pi库。但是我无法使其工作。我的代码有任何问题吗?我希望从传感器连续读取...... 提前谢谢!!!

#include<iostream>
#include<wiringPi.h> 
#include<errno.h>
#include<string.h>
#include<stdint.h>       //for uint32_t
using namespace std;
uint32_t time1=0,time2=0;
int time_diff=0;
float Range_cm=0;

    void myInterrupt(void)
     {
       cout<<"Interrupt\n";
       time2=micros();
       time_diff=time2-time1;
       Range_cm=time_diff/58;
       delay(150);
       digitalWrite(2,0);
       delayMicroseconds(1);
       digitalWrite(2,1);
       delayMicroseconds(10);
       digitalWrite(2,0);
       time1=micros();

     }

     int main(void)
      {
           if(wiringPiSetup()<0)
            {
               cout<<"wiringPiSetup failed !!\n";
            }
          pinMode(2,OUTPUT);
          pinMode(3,INPUT);
          pullUpDnControl(3,PUD_DOWN);
          digitalWrite(2,0);
          delayMicroseconds(1);
          digitalWrite(2,1);
          delayMicroseconds(10);
          digitalWrite(2,0);
          time1=micros();

          if(wiringPiISR(3,INT_EDGE_RISING,&myInterrupt) < 0)
             {
                  cerr<<"interrupt error ["<<strerror (errno)<< "]:"<<errno<<endl;
                  return 1;
             }


           while(1)
             {
               cout<<"distance= "<<time1<<" "<<time2<<" "<<time_diff<<" "<<Range_cm<<"cm\n";
             cout.flush();
             }
            return 0;
        }

1 个答案:

答案 0 :(得分:3)

问题在于我放置了wiringPiISR()功能。由于我之后放置了触发引脚的初始触发操作,因为wiringPiISR()尚未设置,我错过了第一个回波信号。因此,随后的触发和回声没有发生。有问题的代码段是

pinMode(2,OUTPUT);
pinMode(3,INPUT);
pullUpDnControl(3,PUD_DOWN);
digitalWrite(2,0);
delayMicroseconds(1);
digitalWrite(2,1);
delayMicroseconds(10);
digitalWrite(2,0);
if(wiringPiISR(3,INT_EDGE_BOTH,&myInterrupt) < 0)
  {
    cerr<<"interrupt error ["<<strerror (errno)<< "]:"<<errno<<endl;
    return 1;
   }

将此段更改为以下内容会产生中断触发器

pinMode(2,OUTPUT);
pinMode(3,INPUT);
pullUpDnControl(3,PUD_DOWN);
if(wiringPiISR(3,INT_EDGE_BOTH,&myInterrupt) < 0)
   {
     cerr<<"interrupt error ["<<strerror (errno)<< "]:"<<errno<<endl;
     return 1;
   }
digitalWrite(2,0);
delayMicroseconds(1);
digitalWrite(2,1);
delayMicroseconds(10);
digitalWrite(2,0);

我相应地修改了上面的代码,最后我得到了以下代码,并以cm为单位测量距离。

#include<iostream>
#include<wiringPi.h>
#include<errno.h>
#include<string.h>
#include<stdint.h>       //for uint32_t
using namespace std;
uint32_t time1=0,time2=0;
uint32_t time_diff=0;
float Range_cm=0;
volatile int flag=0;
void show_distance(void);

void myInterrupt(void)
 {
    if(flag==0)
      {
            time1=micros();
            flag=1;

      }
    else
      {
            time2=micros();
            flag=0;
            time_diff=time2-time1;
            Range_cm=time_diff/58;
            show_distance();

       }

  }
void show_distance()
  {
    cout<<"distance= "<<time1<<" "<<time2<<" "<<time_diff<<" "<<Range_cm<<" cm\n";
    cout.flush();
    delay(1000);
    digitalWrite(2,0);
    delayMicroseconds(1);
    digitalWrite(2,1);
    delayMicroseconds(10);
    digitalWrite(2,0);

  }

int main(void)
  {
    if(wiringPiSetup()<0)
     {
       cout<<"wiringPiSetup failed !!\n";
     }
    pinMode(2,OUTPUT);
    pinMode(3,INPUT);
    pullUpDnControl(3,PUD_DOWN);
    if(wiringPiISR(3,INT_EDGE_BOTH,&myInterrupt) < 0)
            {
            cerr<<"interrupt error ["<<strerror (errno)<< "]:"<<errno<<endl;
            return 1;
            }
    digitalWrite(2,0);
    delayMicroseconds(1);
    digitalWrite(2,1);
    delayMicroseconds(10);
    digitalWrite(2,0);

    while(1)
    {
    }
    return 0;
 }
相关问题