ロボカップジュニアサッカー IRM2121を用いた専用パルスボールを検知するためのライブラリ

Dependents:   BallCheck_IRM2121_InterrputInAdd CatPot_SensorRight

Pingのライブラリを参考にしました。 RoboCupJuniorSoccerにおけるボール検知をまとめて行うために作成したライブラリ。

距離に応じて微妙に値が変わるようになりました。 まともに使えます。

なお、このライブラリには、interruptinの機能を拡張するためのライブラリが含まれています。 そのため、必要なときだけピン変化割り込みに入ることが可能となっています。

値に応じて関数ポインタとかすれば距離によって値かわるようにできるかも if文で十分かもしれません

Committer:
ryuna
Date:
Sun Nov 09 11:11:37 2014 +0000
Revision:
0:fd5c1ea78a7c
Child:
1:b25c8ac20d5b
irm2121??????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryuna 0:fd5c1ea78a7c 1 /* mbed Ping Library
ryuna 0:fd5c1ea78a7c 2 *
ryuna 0:fd5c1ea78a7c 3 *
ryuna 0:fd5c1ea78a7c 4 */
ryuna 0:fd5c1ea78a7c 5
ryuna 0:fd5c1ea78a7c 6
ryuna 0:fd5c1ea78a7c 7 #include "IRM2121.h"
ryuna 0:fd5c1ea78a7c 8 #include "mbed.h"
ryuna 0:fd5c1ea78a7c 9
ryuna 0:fd5c1ea78a7c 10 IRM2121::IRM2121(PinName IRM_PIN)
ryuna 0:fd5c1ea78a7c 11 : _event(IRM_PIN)
ryuna 0:fd5c1ea78a7c 12 , _timer()
ryuna 0:fd5c1ea78a7c 13 {
ryuna 0:fd5c1ea78a7c 14 _event.rise(this,&IRM2121::_Stop );
ryuna 0:fd5c1ea78a7c 15 _event.fall(this,&IRM2121::_Start );
ryuna 0:fd5c1ea78a7c 16 _event.disable_irq();
ryuna 0:fd5c1ea78a7c 17 _Flag = false;
ryuna 0:fd5c1ea78a7c 18 }
ryuna 0:fd5c1ea78a7c 19
ryuna 0:fd5c1ea78a7c 20 void IRM2121::_Start(void)
ryuna 0:fd5c1ea78a7c 21 {
ryuna 0:fd5c1ea78a7c 22 _Flag = true;
ryuna 0:fd5c1ea78a7c 23 _Valid = false; // start the timere, and invalidate the current time.
ryuna 0:fd5c1ea78a7c 24 _Busy = true;
ryuna 0:fd5c1ea78a7c 25 _timer.start();
ryuna 0:fd5c1ea78a7c 26 _Time = _timer.read_us();
ryuna 0:fd5c1ea78a7c 27 }
ryuna 0:fd5c1ea78a7c 28
ryuna 0:fd5c1ea78a7c 29 void IRM2121::_Stop(void)
ryuna 0:fd5c1ea78a7c 30 {
ryuna 0:fd5c1ea78a7c 31 if(_Flag == true){
ryuna 0:fd5c1ea78a7c 32 _Flag = false;
ryuna 0:fd5c1ea78a7c 33 _Valid = true; // When it stops, update the time
ryuna 0:fd5c1ea78a7c 34 _Busy = false;
ryuna 0:fd5c1ea78a7c 35 _Time = _timer.read_us()-_Time;
ryuna 0:fd5c1ea78a7c 36 _event.disable_irq();
ryuna 0:fd5c1ea78a7c 37 }
ryuna 0:fd5c1ea78a7c 38 }
ryuna 0:fd5c1ea78a7c 39
ryuna 0:fd5c1ea78a7c 40 void IRM2121::Set()
ryuna 0:fd5c1ea78a7c 41 {
ryuna 0:fd5c1ea78a7c 42 _event.enable_irq();
ryuna 0:fd5c1ea78a7c 43
ryuna 0:fd5c1ea78a7c 44 }
ryuna 0:fd5c1ea78a7c 45
ryuna 0:fd5c1ea78a7c 46 int IRM2121::Read()
ryuna 0:fd5c1ea78a7c 47 // -1 means not valid.
ryuna 0:fd5c1ea78a7c 48 {
ryuna 0:fd5c1ea78a7c 49 if(_Valid && ~_Busy)
ryuna 0:fd5c1ea78a7c 50 return (_Time);
ryuna 0:fd5c1ea78a7c 51 else
ryuna 0:fd5c1ea78a7c 52 return -1;
ryuna 0:fd5c1ea78a7c 53 }