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

Dependents:   BallCheck_IRM2121_InterrputInAdd CatPot_SensorRight

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

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

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

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

Committer:
ryuna
Date:
Tue Feb 24 05:34:53 2015 +0000
Revision:
3:711dde7b4c12
Parent:
2:40101fcb6d44
aaaaaaaaaaa

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryuna 1:b25c8ac20d5b 1 /* mbed Ping Library respected Library !!
ryuna 0:fd5c1ea78a7c 2 *
ryuna 1:b25c8ac20d5b 3 * make interruptin_mod by bousiya03
ryuna 1:b25c8ac20d5b 4 *
ryuna 0:fd5c1ea78a7c 5 */
ryuna 0:fd5c1ea78a7c 6
ryuna 0:fd5c1ea78a7c 7
ryuna 0:fd5c1ea78a7c 8 #include "IRM2121.h"
ryuna 1:b25c8ac20d5b 9 #include "interruptin_mod.h"
ryuna 0:fd5c1ea78a7c 10 #include "mbed.h"
ryuna 0:fd5c1ea78a7c 11
ryuna 0:fd5c1ea78a7c 12 IRM2121::IRM2121(PinName IRM_PIN)
ryuna 3:711dde7b4c12 13 : _event(IRM_PIN), _timer()
ryuna 3:711dde7b4c12 14 {
ryuna 3:711dde7b4c12 15
ryuna 3:711dde7b4c12 16
ryuna 3:711dde7b4c12 17 }
ryuna 0:fd5c1ea78a7c 18
ryuna 0:fd5c1ea78a7c 19 void IRM2121::_Start(void)
ryuna 0:fd5c1ea78a7c 20 {
ryuna 2:40101fcb6d44 21 if(_Valid && _Busy ){
ryuna 3:711dde7b4c12 22
ryuna 2:40101fcb6d44 23 _timer.start();
ryuna 2:40101fcb6d44 24 _Time = _timer.read_us();
ryuna 2:40101fcb6d44 25 _Valid = false;
ryuna 2:40101fcb6d44 26 _Busy = true;
ryuna 2:40101fcb6d44 27 _event.fall_disable(this,&IRM2121::_Start);
ryuna 2:40101fcb6d44 28 _event.rise(this,&IRM2121::_Stop);
ryuna 2:40101fcb6d44 29 }
ryuna 0:fd5c1ea78a7c 30 }
ryuna 0:fd5c1ea78a7c 31
ryuna 0:fd5c1ea78a7c 32 void IRM2121::_Stop(void)
ryuna 0:fd5c1ea78a7c 33 {
ryuna 2:40101fcb6d44 34 if(!_Valid && _Busy){
ryuna 0:fd5c1ea78a7c 35 _Valid = true; // When it stops, update the time
ryuna 0:fd5c1ea78a7c 36 _Busy = false;
ryuna 0:fd5c1ea78a7c 37 _Time = _timer.read_us()-_Time;
ryuna 1:b25c8ac20d5b 38 _event.rise_disable(this,&IRM2121::_Stop);
ryuna 1:b25c8ac20d5b 39 }
ryuna 0:fd5c1ea78a7c 40 }
ryuna 0:fd5c1ea78a7c 41
ryuna 2:40101fcb6d44 42 void IRM2121::Set(void)
ryuna 0:fd5c1ea78a7c 43 {
ryuna 3:711dde7b4c12 44 _timer.reset();
ryuna 2:40101fcb6d44 45 _Valid = true;
ryuna 2:40101fcb6d44 46 _Busy = true;
ryuna 2:40101fcb6d44 47 _event.fall(this,&IRM2121::_Start );
ryuna 2:40101fcb6d44 48
ryuna 2:40101fcb6d44 49
ryuna 2:40101fcb6d44 50
ryuna 0:fd5c1ea78a7c 51 }
ryuna 0:fd5c1ea78a7c 52
ryuna 3:711dde7b4c12 53 unsigned long IRM2121::Read(void)
ryuna 2:40101fcb6d44 54 // 0 means not valid.
ryuna 0:fd5c1ea78a7c 55 {
ryuna 2:40101fcb6d44 56 if(_Valid && !_Busy){
ryuna 1:b25c8ac20d5b 57 _event.fall_disable(this,&IRM2121::_Start);
ryuna 1:b25c8ac20d5b 58 _event.rise_disable(this,&IRM2121::_Stop);
ryuna 3:711dde7b4c12 59 return _Time;
ryuna 3:711dde7b4c12 60 }
ryuna 3:711dde7b4c12 61
ryuna 3:711dde7b4c12 62 _event.fall_disable(this,&IRM2121::_Start);
ryuna 3:711dde7b4c12 63 _event.rise_disable(this,&IRM2121::_Stop);
ryuna 3:711dde7b4c12 64
ryuna 3:711dde7b4c12 65 return 0;
ryuna 1:b25c8ac20d5b 66 }
ryuna 2:40101fcb6d44 67
ryuna 2:40101fcb6d44 68
ryuna 2:40101fcb6d44 69 void IRM2121::ReturnVB(bool *valid, bool *busy){
ryuna 2:40101fcb6d44 70 //use after read_function. this is flag checker.
ryuna 2:40101fcb6d44 71 *valid = _Valid;
ryuna 2:40101fcb6d44 72 *busy = _Busy;
ryuna 2:40101fcb6d44 73
ryuna 2:40101fcb6d44 74 }