割り込みを利用して超音波測距センサーをバックグラウンドで計測し続けられます。

Dependents:   escapeFromYou Sample_LinetraceWithSonicDist

Revision:
8:8bb311d39a99
Parent:
7:4a171a80f085
--- a/SonicDist.cpp	Sat Oct 08 22:15:39 2016 +0000
+++ b/SonicDist.cpp	Thu Mar 02 18:01:45 2017 +0000
@@ -6,6 +6,7 @@
     echo=new InterruptIn(Echo);
     soundspeed=340;
     startflag=false;
+    NoiseCheckFlag=false;
     dist=-1;//まだ未測定時かどうかの判定用にdistはありえない値(負の値を代入しておく)
     trig->write(1);
     echo->rise( this, &SonicDist::StartMeasure );
@@ -13,29 +14,38 @@
 }
 void SonicDist::StartMeasure(void)
 {
-    if(startflag) {
+    if(startflag && NoiseCheckFlag==false) {
         echotime.reset();
-        echotime.start();
+    }else{
+        Postponement.detach();
     }
 }
 void SonicDist::endMeasure(void)
 {
     if(dist!=-1&& startflag) {
-        echotime.stop();
-        dist=echotime.read()*soundspeed*1000/2;//mmで出力
+        distbuf=echotime.read()*soundspeed*1000/2;//mmで出力
+        if(distbuf<10){distbuf=dist;}//立ち上がりノイズと判定
         startflag=false;
+        NoiseCheckFlag=true;
+        Postponement.attach(this,&SonicDist::FallNoiseCheck,0.04);
     }
 }
+
+void SonicDist::FallNoiseCheck(void)//ここに到達すると立下りのノイズではないと判定される
+{
+    dist=distbuf;
+    NoiseCheckFlag=false;
+}
+void SonicDist::Init(void)
+{
+    echotime.start();
+    pulse.attach(this,&SonicDist::setTrig,0.05);
+    dist=-2;
+}
 void SonicDist::setTrig(void)
 {
-    if(startflag)dist=3000;
     startflag=true;
-    trig->write(0);
-    systime.attach(this,&SonicDist::releaseTrig, 0.000010);
-}
-void SonicDist::releaseTrig(void)
-{
-    trig->write(1);
+    trig->write(!trig->read());
 }
 double SonicDist::read(void)
 {
@@ -52,8 +62,7 @@
 double SonicDist::takeDist(void)
 {
     if(dist==-1) {
-        pulse.attach(this,&SonicDist::setTrig,0.05);
-        dist=-2;
+        SonicDist::Init();
     }
     return (double)dist/10;
 }
\ No newline at end of file