ロボカップジュニアサッカー IRM2121を用いた専用パルスボールを検知するためのライブラリ
Dependents: BallCheck_IRM2121_InterrputInAdd CatPot_SensorRight
Pingのライブラリを参考にしました。 RoboCupJuniorSoccerにおけるボール検知をまとめて行うために作成したライブラリ。
距離に応じて微妙に値が変わるようになりました。 まともに使えます。
なお、このライブラリには、interruptinの機能を拡張するためのライブラリが含まれています。 そのため、必要なときだけピン変化割り込みに入ることが可能となっています。
値に応じて関数ポインタとかすれば距離によって値かわるようにできるかも if文で十分かもしれません
IRM2121.cpp@1:b25c8ac20d5b, 2014-12-05 (annotated)
- Committer:
- ryuna
- Date:
- Fri Dec 05 14:51:05 2014 +0000
- Revision:
- 1:b25c8ac20d5b
- Parent:
- 0:fd5c1ea78a7c
- Child:
- 2:40101fcb6d44
level up by plus library.
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 | 1:b25c8ac20d5b | 15 | { |
ryuna | 0:fd5c1ea78a7c | 16 | } |
ryuna | 0:fd5c1ea78a7c | 17 | |
ryuna | 0:fd5c1ea78a7c | 18 | void IRM2121::_Start(void) |
ryuna | 0:fd5c1ea78a7c | 19 | { |
ryuna | 1:b25c8ac20d5b | 20 | _timer.start(); |
ryuna | 1:b25c8ac20d5b | 21 | _Time = _timer.read_us(); |
ryuna | 1:b25c8ac20d5b | 22 | _Valid = false; |
ryuna | 1:b25c8ac20d5b | 23 | _Busy = true; |
ryuna | 1:b25c8ac20d5b | 24 | _event.fall_disable(this,&IRM2121::_Start); |
ryuna | 1:b25c8ac20d5b | 25 | _event.rise(this,&IRM2121::_Stop); |
ryuna | 0:fd5c1ea78a7c | 26 | } |
ryuna | 0:fd5c1ea78a7c | 27 | |
ryuna | 0:fd5c1ea78a7c | 28 | void IRM2121::_Stop(void) |
ryuna | 0:fd5c1ea78a7c | 29 | { |
ryuna | 1:b25c8ac20d5b | 30 | if(~_Valid && _Busy){ |
ryuna | 0:fd5c1ea78a7c | 31 | _Valid = true; // When it stops, update the time |
ryuna | 0:fd5c1ea78a7c | 32 | _Busy = false; |
ryuna | 0:fd5c1ea78a7c | 33 | _Time = _timer.read_us()-_Time; |
ryuna | 1:b25c8ac20d5b | 34 | _event.rise_disable(this,&IRM2121::_Stop); |
ryuna | 1:b25c8ac20d5b | 35 | } |
ryuna | 0:fd5c1ea78a7c | 36 | } |
ryuna | 0:fd5c1ea78a7c | 37 | |
ryuna | 0:fd5c1ea78a7c | 38 | void IRM2121::Set() |
ryuna | 0:fd5c1ea78a7c | 39 | { |
ryuna | 1:b25c8ac20d5b | 40 | _event.fall(this,&IRM2121::_Start ); |
ryuna | 0:fd5c1ea78a7c | 41 | } |
ryuna | 0:fd5c1ea78a7c | 42 | |
ryuna | 0:fd5c1ea78a7c | 43 | int IRM2121::Read() |
ryuna | 1:b25c8ac20d5b | 44 | // 1 means not valid. |
ryuna | 0:fd5c1ea78a7c | 45 | { |
ryuna | 1:b25c8ac20d5b | 46 | if(_Valid && ~_Busy){ |
ryuna | 0:fd5c1ea78a7c | 47 | return (_Time); |
ryuna | 1:b25c8ac20d5b | 48 | }else{ |
ryuna | 1:b25c8ac20d5b | 49 | _event.fall_disable(this,&IRM2121::_Start); |
ryuna | 1:b25c8ac20d5b | 50 | _event.rise_disable(this,&IRM2121::_Stop); |
ryuna | 1:b25c8ac20d5b | 51 | return 1; |
ryuna | 1:b25c8ac20d5b | 52 | } |
ryuna | 1:b25c8ac20d5b | 53 | } |