割り込みを利用して超音波測距センサーをバックグラウンドで計測し続けられます。
Dependents: escapeFromYou Sample_LinetraceWithSonicDist
SonicDist.cpp@6:ba801e0b68df, 2016-08-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |