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

Dependents:   escapeFromYou Sample_LinetraceWithSonicDist

Revision:
6:ba801e0b68df
Parent:
5:8629d31e5e1c
Child:
7:4a171a80f085
--- a/SonicDist.cpp	Sun Jul 10 04:12:26 2016 +0000
+++ b/SonicDist.cpp	Sun Aug 07 18:26:25 2016 +0000
@@ -1,74 +1,54 @@
 #include "mbed.h"
 #include "SonicDist.h"
-SonicDist::SonicDist(PinName Trig, PinName Echo){
+SonicDist::SonicDist(PinName Trig, PinName Echo)
+{
     trig=new DigitalOut(Trig);
-    echopin=Echo;
-   // echo=new InterruptIn(Echo);
+    echo=new InterruptIn(Echo);
     soundspeed=340;
     startflag=false;
+    dist=-1;//まだ未測定時かどうかの判定用にdistはありえない値(負の値を代入しておく)
     trig->write(1);
-    setmeasure=true;
-}
-void SonicDist::init(void){
-    DigitalIn Ec(echopin);
-    echotime.stop();
-    echotime.reset();
-     trig->write(1);
-        wait(0.000010);
-        trig->write(0);
-        wait(0.000014);
-        trig->write(1);
-    while(Ec==0);
-    SonicDist::StartMeasure();
-    while(Ec==1||(double)echotime.read()<0.007);
-    SonicDist::endMeasure();
-   // Ec.dispose();
-    echo=new InterruptIn(echopin);
     echo->rise( this, &SonicDist::StartMeasure );
     echo->fall( this, &SonicDist::endMeasure );
-    SonicDist::setTrig();
 }
-void SonicDist::StartMeasure(void){
+void SonicDist::StartMeasure(void)
+{
     echotime.reset();
     echotime.start();
-    startflag=true;
 }
-void SonicDist::endMeasure(void){
-    if(startflag){
-    SonicDist::CalcDist();
-    systime.detach();
-    SonicDist::setTrig();
-    }
-}
-void SonicDist::CalcDist(void){
+void SonicDist::endMeasure(void)
+{
+    if(dist!=-1) {
         echotime.stop();
         dist=echotime.read()*soundspeed*1000/2;//mmで出力
         startflag=false;
+    }
 }
-void SonicDist::setTrig(void){
+void SonicDist::setTrig(void)
+{
+    if(startflag)SonicDist::endMeasure();
+    startflag=true;
     trig->write(0);
-   systime.attach(this,&SonicDist::releaseTrig, 0.000014);
+    systime.attach(this,&SonicDist::releaseTrig, 0.000010);
 }
-void SonicDist::releaseTrig(void){
+void SonicDist::releaseTrig(void)
+{
     trig->write(1);
-    systime.attach(this,&SonicDist::timeout, 0.007);
-}
-void SonicDist::timeout(void){
-    SonicDist::CalcDist();
-    SonicDist::setTrig();
-    if(startflag){printf("a");}
 }
-double SonicDist::read(void){
-    if(setmeasure){
-        SonicDist::init();
-        setmeasure=false;
-    }
-   return (double)dist/10; 
+double SonicDist::read(void)
+{
+    if(dist<0)SonicDist::takeDist();
+    return (double)dist/10;
 }
-double SonicDist::read_mm(void){
-   if(setmeasure){
-        SonicDist::init();
-        setmeasure=false;
-    }
-   return dist; 
+double SonicDist::read_mm(void)
+{
+    if(dist<0)SonicDist::takeDist();
+    return dist;
 }
+double SonicDist::takeDist(void)
+{
+    if(dist<0)pulse.attach(this,&SonicDist::setTrig, 0.3);
+    dist=-2;
+    while(dist<0) {printf("");}
+    return (double)dist/10;
+}
\ No newline at end of file