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

Dependents:   escapeFromYou Sample_LinetraceWithSonicDist

Committer:
natuga117
Date:
Sun Aug 07 18:26:25 2016 +0000
Revision:
6:ba801e0b68df
Parent:
5:8629d31e5e1c
Child:
7:4a171a80f085
improved precision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
natuga117 3:b22567a5f7d6 1 #include "mbed.h"
natuga117 3:b22567a5f7d6 2 #include "SonicDist.h"
natuga117 6:ba801e0b68df 3 SonicDist::SonicDist(PinName Trig, PinName Echo)
natuga117 6:ba801e0b68df 4 {
natuga117 3:b22567a5f7d6 5 trig=new DigitalOut(Trig);
natuga117 6:ba801e0b68df 6 echo=new InterruptIn(Echo);
natuga117 3:b22567a5f7d6 7 soundspeed=340;
natuga117 3:b22567a5f7d6 8 startflag=false;
natuga117 6:ba801e0b68df 9 dist=-1;//まだ未測定時かどうかの判定用にdistはありえない値(負の値を代入しておく)
natuga117 3:b22567a5f7d6 10 trig->write(1);
natuga117 3:b22567a5f7d6 11 echo->rise( this, &SonicDist::StartMeasure );
natuga117 3:b22567a5f7d6 12 echo->fall( this, &SonicDist::endMeasure );
natuga117 3:b22567a5f7d6 13 }
natuga117 6:ba801e0b68df 14 void SonicDist::StartMeasure(void)
natuga117 6:ba801e0b68df 15 {
natuga117 3:b22567a5f7d6 16 echotime.reset();
natuga117 3:b22567a5f7d6 17 echotime.start();
natuga117 3:b22567a5f7d6 18 }
natuga117 6:ba801e0b68df 19 void SonicDist::endMeasure(void)
natuga117 6:ba801e0b68df 20 {
natuga117 6:ba801e0b68df 21 if(dist!=-1) {
natuga117 3:b22567a5f7d6 22 echotime.stop();
natuga117 3:b22567a5f7d6 23 dist=echotime.read()*soundspeed*1000/2;//mmで出力
natuga117 3:b22567a5f7d6 24 startflag=false;
natuga117 6:ba801e0b68df 25 }
natuga117 3:b22567a5f7d6 26 }
natuga117 6:ba801e0b68df 27 void SonicDist::setTrig(void)
natuga117 6:ba801e0b68df 28 {
natuga117 6:ba801e0b68df 29 if(startflag)SonicDist::endMeasure();
natuga117 6:ba801e0b68df 30 startflag=true;
natuga117 3:b22567a5f7d6 31 trig->write(0);
natuga117 6:ba801e0b68df 32 systime.attach(this,&SonicDist::releaseTrig, 0.000010);
natuga117 3:b22567a5f7d6 33 }
natuga117 6:ba801e0b68df 34 void SonicDist::releaseTrig(void)
natuga117 6:ba801e0b68df 35 {
natuga117 3:b22567a5f7d6 36 trig->write(1);
natuga117 3:b22567a5f7d6 37 }
natuga117 6:ba801e0b68df 38 double SonicDist::read(void)
natuga117 6:ba801e0b68df 39 {
natuga117 6:ba801e0b68df 40 if(dist<0)SonicDist::takeDist();
natuga117 6:ba801e0b68df 41 return (double)dist/10;
natuga117 3:b22567a5f7d6 42 }
natuga117 6:ba801e0b68df 43 double SonicDist::read_mm(void)
natuga117 6:ba801e0b68df 44 {
natuga117 6:ba801e0b68df 45 if(dist<0)SonicDist::takeDist();
natuga117 6:ba801e0b68df 46 return dist;
natuga117 3:b22567a5f7d6 47 }
natuga117 6:ba801e0b68df 48 double SonicDist::takeDist(void)
natuga117 6:ba801e0b68df 49 {
natuga117 6:ba801e0b68df 50 if(dist<0)pulse.attach(this,&SonicDist::setTrig, 0.3);
natuga117 6:ba801e0b68df 51 dist=-2;
natuga117 6:ba801e0b68df 52 while(dist<0) {printf("");}
natuga117 6:ba801e0b68df 53 return (double)dist/10;
natuga117 6:ba801e0b68df 54 }