PICでPSDの測定結果を距離に変換
PSDはレンジファインダーの原理で対象物までの距離を測るセンサです。測定結果は電圧で出力されるので、距離に変換する関数を作っておくと便利です。
距離と電圧の関係はこのグラフのようになっています。
これは1/xのグラフを当てはめれば良さそうですので、次の式を使います。
距離 = a/(電圧+b)
aとbは次のように求めます
1・b=0とおいて式を変形→ a=距離・電圧
2・上の式で10cmでのaを求める(電圧はグラフから読む)
3・求めたaを最初の式に代入して60cmでの電圧から距離を求める
4・求めた距離が60cmに近づくようにbの値を調整する
bを決めると10cmでの電圧と距離にも多少誤差がでてくるので、10cmでの電圧値と60cmの電圧値を交互に入れながらbの値を調整します。この時、必要ならaの値も微調整します。いわゆるトラッキング調整です。中身は違いますが、5球スーパーなんかでやってる周波数調整に感覚は似ています。
この作業はエクセルなどに式を登録して行うと簡単です。
求めたa,bを使った距離の計算式をプログラムしたものがこれです。整数化したので16シリーズのPICでも高速で変換できます。
引数は10bit、AD電圧5.0Vで変換したPSDの電圧、変換結果はmmでの対象物までの距離です。電圧が400mV以下の場合は、反応なしとして0xffffを返します。
//PSD GP2D12の出力電圧をmmに変換(100-800mm)
//longは16bit変数 long longは32bit変数
unsigned long adj_GP2D12(unsigned long sensor_val){
unsigned long long xd;
//ADは基準電圧5v、10ビットで量子化
if(sensor_val < 80) return(0xffff); //遠すぎる場合(400mvより小さい)0xffffを返す
xd = sensor_val * 5; //AD変換値をmvに調整(実際は4.9)
return(220000 / (xd - 200)); //距離調整はこの計算式で
}
220000がa、-200がbです。これは実際のセンサで校正した値です。ケント紙を対象物とし、これの距離を変えて測定距離が正確になるようaとbを微調整します。
これで結果がすぐにmmで読める訳ですが・・・使う上には注意が必要です。
ご存知の方も多いと思いますが、PSDは、形の複雑なもの、平面でも模様があるものなどを計測すると結果がかなりばらつきます。また、理想的な反射体でも、検出物との距離が大きくなるほど値が不安定になります。距離が大きくなるとグラフの傾きが小さくなっていくので、わずかな電圧の変化が、大きな距離の変化になって現れるからです。このことは、小さな電気的ノイズなどが大きな誤差になることを意味していますね。
何回かの計測値の平均を取るなどの前処理をするとよくはなりますが、1回の計測に50msくらいかかるようなので、確定値を得るために時間がかかります。
この辺を理解した上で、この関数を使う必要があるでしょう。例えば、500mmと510mmを見分けなければならないようなプログラムは思ったように動きません。
« C#でPSDセンサを「見える化」する | トップページ | ジャイロセンサを試してみる »
「ロボット作ろう」カテゴリの記事
- Raspberry Pi3でturtlebotを動かしたいのだけど(2016.06.11)
- STM32F4のAD変換トラブル(その2)(2013.03.29)
- TrueSTUDIOからEclipseへ乗り換える(拾遺)(2012.07.14)
- TrueSTUDIOからEclipseへ乗り換える(その3)(2012.07.13)
- TrueSTUDIOからEclipseへ乗り換える(その2)(2012.07.07)
コメント