ryuna’s diary

ryunaが適当にまとめまーす

パルスボールを検知するためのセンサについて

どうもです.

昨今のジュニアサッカーオープンBでは,パルスボールの赤外線を読むセンサとしてIRM2121が多く出回っているようです.

しかしながら,実際試してみると検知距離が短い.

少しロボットから離れただけで読まなくて辛いーと考えている人も少なくはないんじゃないでしょうか.

ではなぜ,IRM2121を使う人が後をというか....なんというかなのか.

ぶっちゃけ知らないです.ていうかみんな嘘ついてそうですよね.

そこでIRM2121の代わりになるセンサをこれから探していきたいと思います.(近距離においてはIRM2121はとてもいい)

試しにというかバカの一つ覚えで.同じ見た目のものを試してみました.

実験は,リモコン受光モジュールにローパスフィルタでなまらせたものを,オシロスコープで確認の流れで行いました.

・IRM2121 : 近距離しか見えない.壁がなくても何とかなる.距離により割と値が変わる.

・RPM7138-R: 遠くまで見えるが電圧値の変動に乏しい.また壁必須で,周りをしっかりと囲わないと全く意味がないよう.

2個しか試していないので今後追加していきます.

ちなみに受光モジュールは距離に応じたパルスが出るので,デジタルで読んだほうが精度があったりします.(体感)

以下に,デジタルで読むコードを乗せておきます.(mbedですが)

処理的にはC言語使える人なら余裕だと思うので,

実験して報告よろしく!!!(そんな人ならこのコード普通に思いつくくね?てか煩雑じゃね)

書き直すの面倒なのでライブラリだけですが...IRM2121 mbedとかで調べれば出ます.

名前がIRM2121となっていますが,たいていのものは使えるはずです.

/*IRM2121.h*/

#ifndef MBED_IRM_H

#define MBED_IRM_H

#include "mbed.h"

#define NAKATA 833 //周期833us

#define NOT_F 0

/** IRM2121 class, based on an DigitalIn pin, and a timer

* use RoboCup Junior Soccer to find PULSE BALL.

* Example:

* @code

* // Set Digital and read sensor.

* #include "mbed.h"

* #include "IRM2121.h"

* IRM2121 IR(p21);

*

* int main() {

* unsigned int length;

* while(1) {

*

* length = IR.Read();

* }

* }

* @endcode

*/

class IRM2121 {

public:

/** Create a IRM2121 object connected to the specified pin

**/

IRM2121(PinName IRM_PIN);

unsigned int Read (void);

/** Read the result

*

* @param none

*/

private:

DigitalIn _pin;

Timer _timer;

unsigned int _Time;

};

#endif

/*IRM2121.cpp*/

#include "IRM2121.h"

#include "mbed.h"

IRM2121::IRM2121(PinName IRM_PIN)

: _pin(IRM_PIN), _timer()

{

}

unsigned int IRM2121::Read(void)

// 0 means not valid.

{

_timer.reset();

_timer.start();

while(_pin){

if(_timer.read_us() > NAKATA){

_timer.stop();

return NOT_F;

}

}

_timer.reset();

while(!_pin){

if(_timer.read_us() > NAKATA){

_timer.stop();

return NOT_F;

}

}

_Time = _timer.read_us();

while(_pin){

if((_timer.read_us() -_Time) > NAKATA){

_timer.stop();

return NOT_F;

}

}

_Time = _timer.read_us() - _Time;

_timer.stop();

return _Time;

}