割り込みを利用して超音波測距センサーをバックグラウンドで計測し続けられます。
Dependents: escapeFromYou Sample_LinetraceWithSonicDist
Diff: SonicDist.cpp
- 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