ロボカップジュニアサッカー IRM2121を用いた専用パルスボールを検知するためのライブラリ
Dependents: BallCheck_IRM2121_InterrputInAdd CatPot_SensorRight
Pingのライブラリを参考にしました。 RoboCupJuniorSoccerにおけるボール検知をまとめて行うために作成したライブラリ。
距離に応じて微妙に値が変わるようになりました。 まともに使えます。
なお、このライブラリには、interruptinの機能を拡張するためのライブラリが含まれています。 そのため、必要なときだけピン変化割り込みに入ることが可能となっています。
値に応じて関数ポインタとかすれば距離によって値かわるようにできるかも if文で十分かもしれません
IRM2121.cpp@0:fd5c1ea78a7c, 2014-11-09 (annotated)
- Committer:
- ryuna
- Date:
- Sun Nov 09 11:11:37 2014 +0000
- Revision:
- 0:fd5c1ea78a7c
- Child:
- 1:b25c8ac20d5b
irm2121??????????????????
Who changed what in which revision?
User | Revision | Line number | New 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 | } |