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

Dependents:   escapeFromYou Sample_LinetraceWithSonicDist

SonicDist.cpp

Committer:
natuga117
Date:
2017-03-02
Revision:
8:8bb311d39a99
Parent:
7:4a171a80f085

File content as of revision 8:8bb311d39a99:

#include "mbed.h"
#include "SonicDist.h"
SonicDist::SonicDist(PinName Trig, PinName Echo)
{
    trig=new DigitalOut(Trig);
    echo=new InterruptIn(Echo);
    soundspeed=340;
    startflag=false;
    NoiseCheckFlag=false;
    dist=-1;//まだ未測定時かどうかの判定用にdistはありえない値(負の値を代入しておく)
    trig->write(1);
    echo->rise( this, &SonicDist::StartMeasure );
    echo->fall( this, &SonicDist::endMeasure );
}
void SonicDist::StartMeasure(void)
{
    if(startflag && NoiseCheckFlag==false) {
        echotime.reset();
    }else{
        Postponement.detach();
    }
}
void SonicDist::endMeasure(void)
{
    if(dist!=-1&& startflag) {
        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)
{
    startflag=true;
    trig->write(!trig->read());
}
double SonicDist::read(void)
{
    return SonicDist::read_mm()/10;
}
double SonicDist::read_mm(void)
{
    if(dist<0) {
        SonicDist::takeDist();
        wait(0.03);
    }
    return dist;
}
double SonicDist::takeDist(void)
{
    if(dist==-1) {
        SonicDist::Init();
    }
    return (double)dist/10;
}