はじめに
ここでは浅草ギ研製4軸歩行ロボットAT-WALKERに超音波距離センサを付けてみます。ここで使用するAT-WALKEについてはAT-WALKERの紹介ページを参照願います。尚、AT−WALKERの製作・プログラミングの基本については書籍を参照願います。センサー部分のプログラムについてはこのページで紹介します。
超音波距離センサーPING)))
超音波距離センサーは、人間では聞こえないぐらい高い周波数の音波を超音波発生素子で発射し、物体に音波が当たって跳ね返ってくる時間を計測することで距離を測定する、というのが基本的なシステムです。
超音波と言っても、基本的には音波なので、発射する音波が大きければ遠くまで音波が届く、つまり遠くの距離まで測定できるということになります。逆に、小さい音波しか作れない場合は跳ね返ってきた音波が弱くて測定できないということになります。対象物も音波を跳ね返すものでないと測定できません。
メリットとしては、光学系の距離センサと比べると、明るさなどの周りの環境に左右されないで測定できるということがあります。
超音波送信素子や受信素子は電子部品店でも入手することができますが、周波数発生回路や電力増幅回路を作る必要があり、ビギナーが素子から作るには少々難しいかと思います。ちなみに、秋葉ですと千石電商の2Fに数種類の超音波素子が販売されています(防滴仕様とか)。
浅草ギ研では、超音波素子に周波数発生回路や電力増幅回路を付けて測定距離をパルス幅で返すモジュール、PING)))を販売しています。これは5V仕様なので通常のマイコンのGPIO(汎用デジタルIO)に直結して操作・測定することができます。PING)))の商品説明はこちらにもありますが、以下に概要を示します。
<ピン配列>
<動作>
PINGには信号線が SIG しかありませんが、これは測定開始を指示するパルス入力と、結果パルスの出力を兼用しています。大抵のマイコンは、IOピンの入出力方向を切替られるので以下の手順で測定をすることができるかと思います。AT−WALKERに使われているATmega32マイコンも同じく、ピンの入出力を切り替えられます。
1)IOピンを出力に設定
2)IOピンから5uSのHighパルスを送信
3)IOピンを入力に設定
4)LowからHighになった瞬間からLowに戻るまでの時間をマイコンのタイマで計測
実際の接続
実際に超音波センサーを取り付けてみます。なお、ここで紹介するのはあくまでも一例です。センサーの固定方法もいろいろあると思います。
超音波センサには汎用IOピンを1つつなぎます。また、センサには電源が必用です。AT−WALKERのIO出力は2.54mmピッチのスルーホールになっていて、隣には5V出力とGNDが配置されていますのでセンサーの電源はここから取ることができます。尚、AT−WALKERマイコンボードから供給できる電流は最大1Aなので、センサー類を多数つける場合はそれぞれのセンサーの消費電流の合計に気をつけてください。今回のように超音波センサーを1つだけなら数十mAなので問題ありません。
スルーホールに直接配線しても良いのですが、後でそのIOピンの特殊機能が使いたくなった場合に、他のピンに付け替えできるように、今回はヘッダピンを取り付けて、センサーとはケーブル接続することにしました。
どのピンを使うかですが、実はココで結構ハマりました。
というのも、以前、無線機とシリアル通信をするのにTXピン(PD0と共有)を使用して、ここにピンヘッダをハンダ付けしていたのでコレを使おうと思ったのですがNG。あとでプログラムを紹介しますが、とりあえず距離をPCへ送ってGDLについているSIMPLETERMでモニタ(この辺りは書籍に詳しく書いてあります。)しようと思い、センサを接続しましたが動きません。よく考えると当然なのですが、PCへ結果を送るにはTXピンから送りますがこれはPD0と共有なのでした。5Vのシリアル通信は通信待ち状態で常に5Vが出力されるので通信していないときでもPD0は5Vに上がりっぱなしです。
次にピンヘッダを取り付けるのが簡単だったので何も考えずにPB7にピンヘッダを付けてセンサーを接続しようとしましたがコレもNG。おそらくATmega32のデータシートよく読めば原因がわかるかも知れませんが、力尽きたので読んでません。(本では「データシートをよく読もう」とか言っておきながら...)
ということでここではPB6を使います。(後でやりますが、PB6で動きました。)
配線はセンサのSIGをマイコンボードのPB6につなぎます。その他は5V同士、GND同士をつなぎます。よって、この間をつなぐケーブルを作ります。どちらもヘッダピンなので1x3列の2550コネクタ(浅草ギ研で販売してます。2.54mmピッチのコネクタ。)でつなぐことにしました。
下はコネクタの部品です。5Vは赤、GNDは黒、信号線は白にしました。
加工は圧着工具で端子を線につけた後に、端子をコネクタ(黒いもの)に差込ます。
出来上がったケーブルは下のようになりました。サーボの延長ケーブルみたいですね。実際、線の配列がサーボと同じなので、ラジコン用のサーボ延長ケーブルでも使えると思います。RCサーボもピン間は2.54mmピッチです。
GNDに黒、5Vに赤、SIGに白をつなぎます。
同じく、GNDに黒、5Vに赤、PD0に白をつなぎます。これで接続は完了です。
ロボットに取り付けるために板金パーツを作りました。私は通常、3D−CAD(INVENTOR)を使ってます。まあ、この程度でしたら3D−CADは不要ですが、サクっと作れます。
あまり参考にならないかも知れませんが、一応、展開図を載せておきます。AT−WALKERに取り付けるφ3.2穴は39mmピッチ(間隔)になってますが、これは、他のページで無線機を取り付けたネジ穴がAT−WALKERの上部に開いていたのでこの間隔になってます。上の2つのM3ネジ穴はφ2.5ドリルであけたあとにM3タップで切ります。M3の穴位置は上のセンサーの図の通りです。実際、INVENTORでこの通りのデータを入れたら問題なく取り付けられました。
板金パーツを取り付けたところ。
完成。
なんとなくWired7に似てますねぇ。ということで”なんちゃってキョロちゃん”と命名。そういえば、「Wired7で世界を征服する会」に入ってますが、なにも活動してない...
プログラム
プログラムは上でも説明しましたがもう一度書きますと、
1)IOピンを出力に設定
2)IOピンから5uSのHighパルスを送信
3)IOピンを入力に設定
4)LowからHighになった瞬間からLowに戻るまでの時間をマイコンのタイマで計測
となります。
今回、PB6を使用してますのでPB6を操作することになります。
下はセンサからの距離を返す関数です。コメントが「/*----PB7に接続した...」となってますがPB6の間違い。
基本的なところは「二足歩行ロボット製作超入門」を参照してください。本で解説している、ラジコンの受信機からの波形を読み取るプログラムとほぼ同じです。パルス幅測定にはタイマ2を使用してます。(あとで歩行させるが、歩行にタイマ0とタイマ1を使ってるので。)
ポイントですが、5uSぐらいのパルスを生成するところで、どうやって5uSを作るかです。ATmega32のクロックが16MHzなので1クロック=0.0625uSということで、数クロック必用な命令を組み合わせるとあっというまにuS単位での時間が経過してしまいます。本ではmS単位のウェイトを作る関数を作っていますが、同じようにタイマカウンタを使ってuS単位のウェイト関数を作ってみると、数値を最低にしても100uSかかってしまいました。
単純なforループを行って、オシロで計測しながら調整してみると 行34 のように4回のループで約5uSでした。ちなみに、8回ループで約10uS、16回ループで約20uSと、ほぼ比例してますので短いウェイトを適当に作るときにはよいかも。
上の関数を1秒ごとに呼び出して、測定結果を出力するプログラムがこちらになります。
ATW-PING1.c
(右クリックで対象を保存)
結果は下のように表示されます。
(ハマったときに)オシロを使ったのでついでに波形も観測してみました。15cmぐらいの距離の場合、こんな感じになります。右の1mSぐらいのパルスはセンサからの出力で、距離によって幅が変わります(右の方に伸びる)。
これで、超音波センサからの距離データを数値化することができました。
応用編
本では当然、歩行についてのプログラム作成についても解説していますが、今回のと組み合わせて、検知した距離によって歩行するプログラムを作ってみました。
プログラムはこちら ATW-PING2.c (右クリックで対象ほ保存)
実際に動かしたところは下になります。写真をクリックすると動画になります。MPEG1で約4.8MB。
映像では、いつぞや作った「野菜型コントローラ」をかざし、一定の距離を保っています(前後歩行だけですが。)。
最近、動くもの作ってなかったのですが、やっぱり動くと楽しいですね。
2005年10月22日
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできかねますのでよろしくお願いいたします。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
|
|
|