Team GRA・CHAN!

Robocup Junior サッカーに挑戦しているTeam”GRA・CHAN!”ロボ日記

Entries

超音波センサというのは?? - その3 実例?超音波センサPING))) さらにその2-

こんにちは、GRA父です。

長期出張のトリプルやゲリラ豪雨、猛暑に悩まされ続けましたが、やっと!夏休みへのカウントダウン開始~。
あと月曜と火曜の2日いけば正規夏休み~。

といいつつ、今日は自由取得の1日を使って、3れんきゅ~。

でもオヤジはこの複合した環境変化についていけずにバテています。
バテた状態ですが、リフレッシュ!!!ということで、今日はGRA母と2人で映画館で映画2本立て続けで見てきました。

一つは本日から封切りのロボットvs怪獣ものを3Dで、もう一つは西部劇風で白塗り&アイマスクの映画。
(どっちもTVCMしているやつです)

娘達の方は、受験勉強しろ!という私達から逃れる為、既に実家に避難(=帰省)中ですので、自由(?)な時間を満喫しております、ハイ。

さて話を戻して。
今日は前回の続きというか、やっとプログラムの考え方です。

プログラムの考え方ですが、私がここで書くのはおかしな感じですが、GRA・CHAN!が昔、ちょっと変わったやり方をしていたので、それを書きたいのと、ちょっとした致命的な問題点を書きたいので、あえて考え方を書きますね。

超音波センサPING

図は、PING)))の動作タイミングチャートです。

これをプログラムで書くわけですが、ざっくりと説明していきたいと思います。

まず最初にPING)))のSIGに接続しているマイコン基板のI/Oポートの信号端子を”デジタル出力=OUT”に設定して、出力状態をLOWに設定(2~5uS程度)しておき、その後5uS間、出力をHIGHにすることで、超音波センサPING)))が超音波が発信命令と解釈します。その後、PING)))が超音波を発信します。

その後、物体に反射して戻ってくる超音波を感知させるために信号端子を”デジタル出力”から”デジタル入力=IN”に切り替えます。

”デジタル入力”に切り替えられた信号端子には、超音波センサPING)))が計測を開始するとHIGHになります。
(トリガとして出力していた信号を、PING)))が5us間受信したら、その後750us経つとHIGHに自動的になる)
そして超音波センサPING)))が反射波を受信すればLOWになります。

つまり、プログラム的には”デジタル入力”に切り替えた後、まずHIGHになるのを待つというプログラムを実行させる。
そしてHIGHになるまで待つプログラムが終わり、次に進むので、まず最初にカウンターとかを”0”にするとかにして計測を開始させる。

そのあと、今度はLOWになるまで待つというプログラムを実行させ、LOWになったら次に進めて、カウンターを止めて、そのカウンター値を計算するというプログラムを書けばいいのです。

PICとかAVR等の場合は、内部タイマー分周で、それ以外の場合はタイマー割り込みをかけて時間を計測します。

このタイマーの使い方が??な場合ですが、2009年当初、当方では同じく???だったので、i=i+1を繰り返して時間を計測してました(爆笑)

まぁ、かなり実測値と誤差が出たので、補正値を掛ける羽目になりましたが・・・。
これでも時間計測はできます!!

それと、もう一つ面白い書き方だなぁ~と思ったのは、トリガのデジタル出力後に、350us(当時のPING)))はエコーホールドオフ時間が350usだったので。)待ってから、LOWになるだけを待つ!というプログラムを組んでいました(笑)

これは、どうしてもエコーホールドオフ時間の350usという数字のマジックに惑わされた為です。
どうしても350usを組み込まないといけない!という考えがあったようで、単純にHIGHになるのを待つ事にする発想が無かったとも言いますけど(笑)

まぁ、確かにi=0にするプログラムの処理時間+デジタル入力に切り替える時間+350us待つプログラム=350us以上になるので、確実にPING)))からはHIGH信号が出ているので、LOWだけ待っていればいいのは確かですけどね。

いつだったかPING)))が、350usバージョンから750usバージョンに切り替わったときに、2つのPING)))が混在している時期がありました。
それを知らずに計測値がおかしい?!ということがありました。
(たしかこのブログでも当時、Yが書いていたような気がします・・・。)

それが判った為、普通の書き方、つまりデジタル入力に切り替え後、HIGHを待つようなプログラムに変えたんですよね~。

あぁ、懐かしい~。

まぁ、この辺のプログラムの書き方というかサンプルプログラムは、いろんな書籍や先駆者様のblogにありますので、自分の基板にあったサンプルプログラムを探してくださいね。

ここで。
サンプルプログラムもそうですが、ちょっとこのままでは落とし穴があるので、それを。

考え方で、HIGHになるまで待つプログラムとか、LOWになるまで待つプログラムとか書きましたが、C言語でいう”while()”文の()内を、単純に”***になるまで待つ”だけでは絶対ダメです!

これは、当方チームが2011年のジャパンで食らったことですが、何らの原因でPING)))が壊れた場合、while()”文から先に進めずに無限ループに陥ります(涙)

つまり!そっから先にはプログラムは進みませんので、ロボットは動きませ~ん!!!

なので必ず()内には”***になるまで待つ”以外に”ある設定した時間が経過するまで待つ”の条件も入れて、どちらか一方が条件を満たしたときにwhile()文が終了して、次に進めるようにして、万が一、PING)))故障時でも動くようにプログラムしましょ~。

これしないと、試合中にえらい目に遭いますよ!
さっきも書きましたが、当方チームは2011年ジャパン予選で、おもいっきり食らっていました(爆笑)

さてさて、話を戻しますね。

マイコンの分周期タイマーとかカウンターとかで計測した時間は、前回も説明したとおり、超音波が物体にあたり跳ね返って戻ってくる往復の時間なので、計測時間の半分が実際の距離に要した時間となります。
やっと前々回で書いた記事が役に立ちます(笑)

そうです!
前々回に書いた計算式で求めることができるのです。

例えば、計測した時間:965(μs)であった場合の超音波センサ~物体までの距離dは、

     0.17221×965=166(mm)=16.6(cm)

となります。

また超音波の反射波がかえってこなかった時や超音波センサPING)))の測定可能距離をオーバーした場合は、自動的に計測時間は18.5(ms)となります。

計算してみれば判りますが、3185.6(mm)=3m以上となります。
この値のようにオーバー値がきた場合には、計測不可能だったよ!というようなプログラムが必要です。


今回は、かなり長文でしたが以上です。

なお、”いつもだろ、おい!”というツッコミはNGですよ(笑)
ここまで読んだ方、ご苦労様でした(笑)

次回は、今回が長文過ぎたので書くのを取り止めた補足等々とかを書きたいと思いま~す。


以上、GRA父でした~。
スポンサーサイト

Comment

Comment_form

管理者のみ表示。 | 非公開コメント投稿可能です。

左サイドMenu

黒ねこ時計 くろック

最新記事

最近のコメント

データ取得中...

右サイドメニュー

アクセス カウンター

検索フォーム