« PSoCマイコンのCPU_Clock | トップページ | モータードライブ回路設計 »

2010年11月21日 (日)

IRセンサーのデータ解析

IRセンサーで取ったデータのグラフです(クリックすると拡大します)

Ir

センサーの値の取り方はいたってカンタン!
2000回デジタル入力してそのうち何回HIGHであったかというのがここで言うセンサーの値です。
赤外線リモコンモジュールは受信するとLOWになるので、ボールとの距離が近づけば値は小さくなります。

グラフを見てみると10cm違ってもあまりセンサーの値が変わらないことが分かります。

近似曲線を引いてみました。(7区間平均してみました)

Ir

これで、10cm以上誤差が出る確率は20%くらいに抑えることができました。

これらは処理によって誤差を少なくしようというものですが、それだと限界があり、また、ボールへの反応速度がガクンと落ちてしまうので、ハードウェアでも工夫しようと思います(というかハードの工夫の方が大切です)。

ちなみに前回の記事に書いたPSoCのCPU_Clockですが、SysClk/1にすると電源電圧が4.7Vを下回ったときに動作不可能になるようです。
ブレッドボードが錆び始めていて内部抵抗が高い→電圧が一瞬下がることがある→4.7V以下になったときに動作不可能になる
というのが原因で動作不可能になったと考えられます。

SysClk/2にしたら今のところ順調に動いています。

« PSoCマイコンのCPU_Clock | トップページ | モータードライブ回路設計 »

PSoCマイコン」カテゴリの記事

ロボットのハードウェア」カテゴリの記事

コメント

Reverse父です。
データを見る限り,10~40cmくらいでは信号が飽和してますね(デューティー比からすると,一番弱く発光している部分まで拾っています)。この辺で差をつけたいなら,センサ前部をいくらか遮光するといいですよ(少し遠くなると弱い発光を拾わないのでパルス短くなるから)。特にこのセンサは感度が高いので遠くのボールに対しては遮光しても問題なく見えます(一番強い200usのパルスは見える)。
あと,デジタル入力の繰り返しでもいいですが(確率的にデューティー比になるので),パルス幅を測ってもいいですよ。Arduinoでやるならpulsein(),PSoCでやるならここが参考になるかもしれません。http://blog.goo.ne.jp/toko0131/e/1c4d4c0c4d4152699ad199460b4c67e4
この他,デジタル入力をポート単位でやって最後まで残ったビットを検出するとか,いろいろ出来そうですが,うちはBに出る予定ではないので,使うところがありません。(昨年パルスボールかも,という噂で実験していたものです)
参考まで。

あとPSoCのリセットは,Global ResourcesのTrip Voltageを変えるとなんとかなるかもしれません。試してないのでわかりませんが。

> データを見る限り,10~40cmくらいでは信号が飽和してますね
そうなんですよ。だから、NDフィルター(減光フィルター)でも付けようかと思っているところです。でもNDフィルターってカメラ用だから高価なんですよ・・・
普通紙で遮光するといい感じにはなってました。
ただ普通紙は乱反射するのでどの角度から光が入っても同じくらいの値になってしまいます。だからNDフィルターに目を付けました。

http://blog.goo.ne.jp/toko0131/e/1c4d4c0c4d4152699ad199460b4c67e4
を今見た感じだとデューティー比を測るのではなく、立ち下がり割り込みから次の立ち下がり割り込みまでの時間を測っている気がするのですが・・・(それだとデューティー比は分からない気が・・・)
でもとにかくカウンタを使うのはいい案ですね!!

PSoCのリセットについてですが、4.7V以下になるとCPU_ClockがSysClk/1だと動作しなくなるとデータシートに書いてあったので、SysClk/1だと少し怖いので、SysClk/2でやろうと思います。
今のところSysClk/2でやっていて問題は出ていません。
ありがとうございます!

>デューティー比を測るのではなく、立ち下がり割り込みから次の立ち下がり割り込みまでの時間を測っている気が

それでいいんですよ。パルスボール(RCJ−05)の発光パターンを見ると,200us強いパルスがあって,その後,1/4強度4パルス(100us),1/16強度4パルス(100us),1/64強度4パルス(100us)と続くので,どの強度のパルスまでリモコンモジュールが反応しているかが,Lowのパルス長(200~500us)でわかるんです。
833usサイクルでパルスが来るので忙しいですが,うまくカウンタを使うと数msくらいの平均がとれます。(一応,そのカウンタ値を元にDAC8でアナログ電圧出力させるのはうまく行っています)

返信して頂きありがとうございます。
しかしながら、すみませんが未だによく分かりません。
赤外線リモコンモジュールの信号線の立ち下がりエッジから次の立ち下がりエッジの時間を測ると常に833μsが測定されるだけで、ボールまでの距離は分からないと思うのですが・・・
もしカウンタ割り込みでボールまでの距離を算出しようとすれば、立ち下がりエッジから次の立ち"上がり"エッジまでの時間を測らないといけない(つまりはデューティ比を測定しないといけない)と思うのですが、この考え方は間違っていますでしょうか?

そっか。16ビットカウンタを使ったパルスチェッカ のままだとそうですね。確かにfalling edgeの割り込みでは833us周期しかでませんね。
うちでは,リモコン入力を1MHzクロック(1us/clock)の16ビットカウンタのenable入力にして(Invert: Active lowにして),リモコン信号のある時だけカウントするようにしています。で,別のカウンタで2msくらいで割り込みかけてカウンタ値を取得し,DACに設定するようにしました。(その際に16ビットカウンタはリセット) 
これなら,リモコン信号が来ている間だけ1us毎にカウントされるので,カウント値がそのままパルス幅(の2ms周期での平均値)になります。

なるほど。そんな方法もあるのですね。
ありがとうございます。

ただ、今まで僕も任意の数ミリ秒でのデューティ比を測定していましたが、それだと、測定をいつ始めるかによって測定結果に誤差が大きく入ることに今気づいたので(2ms÷833μs=2.4周期)、任意の時間ではなく立ち下がりエッジから次の立ち"上がり"エッジまでの時間を測定して、本当の"デューティ比"を測定出来るようにしたいと思います。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1389908/37771766

この記事へのトラックバック一覧です: IRセンサーのデータ解析:

« PSoCマイコンのCPU_Clock | トップページ | モータードライブ回路設計 »