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

Dependents:   escapeFromYou Sample_LinetraceWithSonicDist

SonicDist.cpp

Committer:
natuga117
Date:
2016-07-10
Revision:
5:8629d31e5e1c
Parent:
4:84f4fa630726
Child:
6:ba801e0b68df

File content as of revision 5:8629d31e5e1c:

#include "mbed.h"
#include "SonicDist.h"
SonicDist::SonicDist(PinName Trig, PinName Echo){
    trig=new DigitalOut(Trig);
    echopin=Echo;
   // echo=new InterruptIn(Echo);
    soundspeed=340;
    startflag=false;
    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){
    echotime.reset();
    echotime.start();
    startflag=true;
}
void SonicDist::endMeasure(void){
    if(startflag){
    SonicDist::CalcDist();
    systime.detach();
    SonicDist::setTrig();
    }
}
void SonicDist::CalcDist(void){
        echotime.stop();
        dist=echotime.read()*soundspeed*1000/2;//mmで出力
        startflag=false;
}
void SonicDist::setTrig(void){
    trig->write(0);
   systime.attach(this,&SonicDist::releaseTrig, 0.000014);
}
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_mm(void){
   if(setmeasure){
        SonicDist::init();
        setmeasure=false;
    }
   return dist; 
}