ロボカップジュニアサッカー IRM2121を用いた専用パルスボールを検知するためのライブラリ
Dependents: BallCheck_IRM2121_InterrputInAdd CatPot_SensorRight
Pingのライブラリを参考にしました。 RoboCupJuniorSoccerにおけるボール検知をまとめて行うために作成したライブラリ。
距離に応じて微妙に値が変わるようになりました。 まともに使えます。
なお、このライブラリには、interruptinの機能を拡張するためのライブラリが含まれています。 そのため、必要なときだけピン変化割り込みに入ることが可能となっています。
値に応じて関数ポインタとかすれば距離によって値かわるようにできるかも if文で十分かもしれません
IRM2121.cpp@2:40101fcb6d44, 2015-01-05 (annotated)
- Committer:
- ryuna
- Date:
- Mon Jan 05 05:51:24 2015 +0000
- Revision:
- 2:40101fcb6d44
- Parent:
- 1:b25c8ac20d5b
- Child:
- 3:711dde7b4c12
??????????????????????; ; ???????????busy,valid???????????
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:fd5c1ea78a7c | 13 | : _event(IRM_PIN) |
ryuna | 0:fd5c1ea78a7c | 14 | , _timer() |
ryuna | 2:40101fcb6d44 | 15 | { |
ryuna | 0:fd5c1ea78a7c | 16 | } |
ryuna | 0:fd5c1ea78a7c | 17 | |
ryuna | 0:fd5c1ea78a7c | 18 | void IRM2121::_Start(void) |
ryuna | 0:fd5c1ea78a7c | 19 | { |
ryuna | 2:40101fcb6d44 | 20 | if(_Valid && _Busy ){ |
ryuna | 2:40101fcb6d44 | 21 | _timer.start(); |
ryuna | 2:40101fcb6d44 | 22 | _Time = _timer.read_us(); |
ryuna | 2:40101fcb6d44 | 23 | _Valid = false; |
ryuna | 2:40101fcb6d44 | 24 | _Busy = true; |
ryuna | 2:40101fcb6d44 | 25 | _event.fall_disable(this,&IRM2121::_Start); |
ryuna | 2:40101fcb6d44 | 26 | _event.rise(this,&IRM2121::_Stop); |
ryuna | 2:40101fcb6d44 | 27 | } |
ryuna | 0:fd5c1ea78a7c | 28 | } |
ryuna | 0:fd5c1ea78a7c | 29 | |
ryuna | 0:fd5c1ea78a7c | 30 | void IRM2121::_Stop(void) |
ryuna | 0:fd5c1ea78a7c | 31 | { |
ryuna | 2:40101fcb6d44 | 32 | if(!_Valid && _Busy){ |
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 | 1:b25c8ac20d5b | 36 | _event.rise_disable(this,&IRM2121::_Stop); |
ryuna | 1:b25c8ac20d5b | 37 | } |
ryuna | 0:fd5c1ea78a7c | 38 | } |
ryuna | 0:fd5c1ea78a7c | 39 | |
ryuna | 2:40101fcb6d44 | 40 | void IRM2121::Set(void) |
ryuna | 0:fd5c1ea78a7c | 41 | { |
ryuna | 2:40101fcb6d44 | 42 | _Valid = true; |
ryuna | 2:40101fcb6d44 | 43 | _Busy = true; |
ryuna | 2:40101fcb6d44 | 44 | _event.fall(this,&IRM2121::_Start ); |
ryuna | 2:40101fcb6d44 | 45 | |
ryuna | 2:40101fcb6d44 | 46 | |
ryuna | 2:40101fcb6d44 | 47 | |
ryuna | 0:fd5c1ea78a7c | 48 | } |
ryuna | 0:fd5c1ea78a7c | 49 | |
ryuna | 2:40101fcb6d44 | 50 | int IRM2121::Read(void) |
ryuna | 2:40101fcb6d44 | 51 | // 0 means not valid. |
ryuna | 0:fd5c1ea78a7c | 52 | { |
ryuna | 2:40101fcb6d44 | 53 | if(_Valid && !_Busy){ |
ryuna | 2:40101fcb6d44 | 54 | return _Time; |
ryuna | 2:40101fcb6d44 | 55 | |
ryuna | 2:40101fcb6d44 | 56 | }else { |
ryuna | 1:b25c8ac20d5b | 57 | _event.fall_disable(this,&IRM2121::_Start); |
ryuna | 1:b25c8ac20d5b | 58 | _event.rise_disable(this,&IRM2121::_Stop); |
ryuna | 2:40101fcb6d44 | 59 | return 0; |
ryuna | 1:b25c8ac20d5b | 60 | } |
ryuna | 1:b25c8ac20d5b | 61 | } |
ryuna | 2:40101fcb6d44 | 62 | |
ryuna | 2:40101fcb6d44 | 63 | |
ryuna | 2:40101fcb6d44 | 64 | void IRM2121::ReturnVB(bool *valid, bool *busy){ |
ryuna | 2:40101fcb6d44 | 65 | //use after read_function. this is flag checker. |
ryuna | 2:40101fcb6d44 | 66 | *valid = _Valid; |
ryuna | 2:40101fcb6d44 | 67 | *busy = _Busy; |
ryuna | 2:40101fcb6d44 | 68 | |
ryuna | 2:40101fcb6d44 | 69 | } |