2017-05-17 22:36 | カテゴリ:PIC応用回路
前回、なんとかLCDディスプレイをi2cでドライブすることが出来るようになりました。
そこで、以前に購入していた、超音波距離センサーモジュールを接続して、測距にトライしてみました。

(USM00)
USM00.jpg



型番号は「HC-SR04」とあります

続きは、、、




この基板には、超音波の発振器と受信器が装備されて、外部から起動パルスを加えると、超音波のパルストレインが発射され、その後受信モードになって、発射された超音波を受信します。
その受信が続いている間、信号がHiになり、その時間を計測すると、超音波を発射後、目標に反射して戻ってくるまでの時間がわかり、結果、距離を算出できる仕組みです。


(USM01)
USM01.jpg

(USM02)
USM02.jpg

端子は、+5V、GNDと、trig(トリガー入力)とEcho(時間パルス出力)の4個です。

トリガーは、10マイクロ秒の正パルスを与えます。
直後から超音波パルストレインが発射されます。
その後、Echo端子がHiになって、一定時間後にLoに戻ります。

これをPICを使用して、パルスがHiになっている時間を計測します。

おなじみのブレッドボードに回路を追加してテストしました。

(USM03)
USM03.jpg


まず、TMR1をMCCを使って使用できるようにセットした後、

TMR1_StartTimer();

でタイマーをスタート。
そして、


Trig = 1; //Trigger信号(10usec)を与える
__delay_us(10);
Trig = 0;
while (echo == 0) { //Echo信号が1になるまで待つ
}
TMR1_WriteTimer(0);
while (echo == 1) { //Echo信号が0に戻るまで待つ
}

count = (long) (TMR1_ReadTimer()); //usec
timecnt = count * 16 / 10;
dist_cm = timecnt * (33150 + 61 * temp) / 200000; // mm単位で表示

counti = (int) (timecnt);
dist_cmi = (int) (dist_cm);


として、Echo信号がHiになっている時間を求め、それを距離に換算します。
tempは、本来なら温度センサーで計測すべきですが、今回は、25℃としました。

そして、それらをLCDに表示します。

itoa(msg, counti, 10);
SODIAL2004_cursor(0, 1);
SODIAL2004_Char_disp(msg);
SODIAL2004_Char_disp(" usec ");

itoa(msg, dist_cmi, 10);
SODIAL2004_cursor(0, 3);
SODIAL2004_Char_disp(msg);
SODIAL2004_Char_disp(" mm ");


このままですと、表示更新が頻繁で、醜いため、実際は10回の計測と平均をとって、表示させています。

机上にセンサーを上向きにおいて、天井までの距離を表示させてみました。

(USM04)
USM04.jpg

結果、1677mmでした。
表示は更新されますが、おおむねプラマイ2-3mmの間で安定しています。

この際の計測時間は、9676マイクロ秒でした。

動作の様子です。


(MeasureLCD)




【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(4)

管理者のみに表示する