はじめに
ここでは PICから浅草ギ研製感圧センサーボード「AGB65−4FS(4 point Force Sensor)」を駆動してみます。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
PICマイコンとAGB65−4FS
ロボット神経システムAGB65シリーズはPCやマイコンのシリアル通信機能を使えるスキルがあれば簡単に動かすことのできるモータコントローラ、センサー群です。1つのシリアルラインを複数のAGB65シリーズで共有でき、取り外しや追加も簡単に行えますのでPCやマイコンをホストコンピュータとしたロボットの作成が容易にできます。
AGB65シリーズについてはこちらにも情報があります。
今回使用するAGB65−4FSは1つのセンサーボードに4つの感圧センサーを付けて、それぞれの荷重情報だけでなく、4点内の重心位置をXY座標で出力する機能もついています。
4点感圧センサー AGB65-4FSの詳細はこちらを参照願います。<−このページは必ず参照してください。
(以後、このページを4FSのページといいます)
AGB65シリーズは標準ではマイコンと接続するようになっております。PCと接続する場合でも変換にはAGB65−232Cというオプションボードが用意されておりますので簡単に接続できます。下の図はマイコンとつなぐ場合のイメージです。AGB65シリーズは各ボードに固有のIDがあり、これを変更できるタイプのものは1つのシリアルラインに同じ種類のボードを複数接続することができます。4FSの場合は1つのシリアルラインに16個のボードを接続できます。
<PICマイコンについて>
電子工作を行っている皆様にはもうおなじみのマイコンであるPICですが、書籍やインターネット上での情報が豊富で、開発環境がアセンブラならメーカーのホームページより無償で入手できるというものです。最近では高機能のタイプが出てきましたが、もともとは小さくて単機能なシステムを作るために作られた経緯があり、機能やパッケージのバージョンも豊富です。
ここでは、8ピンでありながらADCまで付いている 12F675 を使ってみます。開発環境はMPLABをメーカーのホームページよりダウンロードします。言語は多くの方が使っていると思われる CCSC を使います。CCSCはサードパーティ製のC言語コンパイラですが、PICのCコンパイラの中では安いと思います。またインストールするとMBLABに組み込まれてMPLABでコンパイル指示すると自動で動いてくれるので使いやすいと思います。
以降で使っているマイコンボードは以前作ったもので、12F675に電源ジャックをつけたものです。このボードの作成と、開発環境のセットアップについてはこちらのページを参照願います。
PICマイコンボードを使って見る のページ
<−前に作ったボード。ACジャックが付いてる
PICへのプログラムミングは、純正のライタ PICSTART Plus を使って書き込んだ後に、上のボードのICソケットに挿すというやり方でやってます。PICの場合にはいろいろな書き込み方があるので、ご自分に合った環境でよろしいかと。安い自作ライタなどのキットも売っているようです。
<RCサーボについて>
RCサーボは RCサーボの紹介 のページで詳しく説明しています。
接続
4FSはTTLレベル(0V/5V)でシリアル通信を行いますので、5V系のマイコンと直結できます。ということでH8マイコンとも直結できます。
センサーの取り付け・実際の接続
<センサ取り付け>
まずは測定するためにセンサーを固定する必要があります。4FSのページに取り付け寸法がのってます。作業場に有った適当なアルミ板に取り付け穴をあけました。実際にはロボットの足裏や、外装の内側に取り付けることになります。
4点と取り付けたところです。真ん中に4箇所ネジ穴が開いてますが、これはこの裏にモジュール部を取り付けるためにあけました。モジュールの取り付け穴ピッチは25x25mm間隔です。AGB65の取り付け穴ピッチは5mm単位なので、製図をせずに、方眼紙を板に貼りつけても正確な穴があけられるかと思います。モジュール部のサイズも、ロボットへの取り付けを考慮して29x29mmと非常に小さく作りました。
裏面にモジュール部を取り付けたところです。
<電源ケーブル>
モジュールは内部5Vで動いており、7.5V以上(25Vまで)の電源が必要です。添付されている電源ケーブルは9V乾電池用のスナップがついてます。
プログラミング中はずっと通電することもあるかと思いますので乾電池を使いたくない場合はケーブルを加工して外部電源化するのもよいでしょう。私は開発中は、1Aぐらいの出力のACアダプタを使ってます。ACジャックは秋葉原の電子部品店などでも売ってます(私は千石電商で買いました。)。ACジャックと、4FSに添付されている9V乾電池用のケーブルを切ってハンダ付けしたのが下の右の写真です。
※右の写真に「RSCに添付...」とありますが、4FSに添付されたものを使います。(写真使いまわし)
<通信ケーブル>
スタンプと4FSの接続には4FSに付属の通信ケーブルを使います。これはAGB65同士を接続するように両側にコネクタが付いています。4FSを増設するときは、4FS同士を接続しますのでこのまま使いますが、マスタとの接続の場合はこのケーブルの加工が必要です。
今回は、マイコンボードからヘッダピンが出ているので、一方に2550コネクタを取り付けしました。皆様は、このマイコンボード+5V電源回路とまったく同じということは無いと思いますので、実際にはマイコンボードに合ったコネクタを自分で取り付けたり、直接マスタ側の基板にハンダ付けすることになると思います。
TXEラインはAGB65シリーズ同士をつなぐときにだけ使いますので接続しないでOKです。写真では黄色の線ですが、線の色は決まってませんので注意して下さい(フラットケーブルを切って作っているため。別な色もある。)。
実際の接続は下の写真のようになりました。12F675はもともとシリアルポートが無いところをCCSCの機能でソフト的にシリアル機能を実現しています。これで複数のピンにシリアル通信機能を持たせることもできるようですが、今回は内部クロック(遅い)を使ってますのでシリアル通信機能は1つに設定します。ということで、重心測定結果の出力をどうするか?ということになりますが、今回はLEDを付けて簡単にX方向の重心判定を行うことにします。
LEDのハード的な接続についてはは PICマイコンを使ってみる でやっていますのでこちらを参照願います。
その他細かい接続や注意点は4FSのページを参照願います。
プログラミング〜重心を表示するプログラム
AGB65−4FSは、それぞれの荷重を数値で取得できるだけでなく、4点から重心を割り出してXY座標で返す機能もあります。ここでは、一番使われるであろうこの機能を使うプログラムを考えます。
重心読み取りのフォーマットを4FSのページで確認しますと、命令60と80があります。80の方が現在の荷重を中心にセットできるのでこちらの方を使ってみます。
<命令送信フォーマット>
[255] [ID] [長(1)] [命令(80)]
<結果返信フォーマット>
[255] [ID] [長(3)] [命令(80)] [X] [Y]
とありますので、単純に4バイトの命令を送って6バイト取得するプログラムを作れば良いようです。
LEDの点灯についてが、シリアル通信機能と混在でGPIOを使う場合にちょっとコツが入りました。(これで3時間ハマった)。
ということで作ったのが次のプログラムです。
テキストデータはこちら H8_AGB65_4FS.c (右クリックで対象を保存)
■行1〜4
PICのヒューズ設定(ハード的な設定)と、シリアル通信のピン設定です。GP3は入力としてしか使えませんのでこれを受信にあてています。
■行8
4FSに送る命令を配列にセットしてます。シリアル通信は8ビット=1バイトづつ送るので、char型(8ビット変数)になってます。4FSはマイナス符号を判定しないので、一応
unsigned で宣言してます。(unsignedで宣言しなくてもたぶんOKですが。)
■行11
結果は6バイトで返ってくるので6バイト分の配列を作ります。rcv_data[4]にX、rcv_data[5]にYの結果が格納されます。
■行18〜23
and_data[ ] にセットしたデータを送信します。putc( ) 関数は1バイト送信する関数でCCSCで用意されたもの。
■行30
IO方向を設定。0が出力で、1が入力。入力は受信ラインのGP3だけになってます。
■行31
ココ重要です。立ち上げ後、4FSが起動し終えるまで待ってます。ここ重要です。4FSが立ち上がる前に通信を開始すると、どこが通信はじめかわからなくなるので通信できなくなります(非同期通信なので)。今回の場合は、PICと4FSの電源を別にしてますので、 4FS−>PIC の順に立ち上げないと通信ができなくなります。
■行33
ここがかなりハマりました。CCSCではソフト的にシリアル通信機能を実現でき、このプログラムではGP0を送信線に設定しています。今回、これとは別にLEDをつけてますのでこちらは普通のGPIOのように方向を設定してから、ピンをHigh/LowさせてLEDをつけたり消したりしようと思いました。
CCSCの関数を見ると、GPIOの出力をHigh/Lowに切り替えるには
output_high(ピン名) output_low(ピン名)
や
output_ bit(ピン名, 状態)
という関数があります。よってはじめは単純にこれらの関数を使いましたがまったく動きません。結論は、これらの関数は「指定したピンの状態を変えることができるが、他のピンには特に配慮していない」、ということでした(マニュアルにはありませんが)。オシロで波形を観測したところ、GP1につないだLEDをつけたり消したりすると、GP0がLowになったりします。GP0は通信待機中はHighで、High−>Lowになったときに通信が非同期で開始されますので、これでは正確な通信ができません。
ということで、LEDを変えるときには、GP0は必ずHighになるように、ポートA全体を設定する(行33)というやり方でやったらうまく動きました。ということで、以降はLED制御で1つのピンの状態を変える場合でも、ポートA全体を設定するというやり方にしてます。 ちなみに、12F675は8ピンしかないのでポートAしかありません。
LED設定は以下の通り。ピンをLowにするとLEDが点きます。
■行35〜48
ここの無限ループで 「命令送信」−>「6バイト受信」−>「XのデータによってLEDを点灯」 を繰り返してます。
実際に動かしてみましたが、上のプログラムはすんなり考えると「通常は消えていて、重心がどちらかに片寄るとLEDが点灯する。」 となるはずですが、なぜか重心が中心位置(判定でelseのところ)でLEDが”点滅”してしまいます。重心が変わる該当するLEDが点きっぱなしになるのでこれは正常な動きです。 まだなにかコツがあるようですが、とりあえず判定できますのでここでギブアップ。 (30分で終わると思ったが3時間かかってしまった。) PICはチップによってハード的なクセもあるので本格的に使う場合はデータシートをよく読んでおいた方がよいでしょう。
右を押すと右のLEDが点灯
左を押すと左のLEDが点灯
となりました。写真がわかりづらくてすいません。点灯している側と反対側も点滅してるので、シャッター速度を遅くしてもあまり左右のLEDの明るさの違いがわかりませんでした。(目で見ると当然はっきりわかる)
このような感じで簡単に重心を判定することができます。命令70は現在の重心を記憶するので、例えば、「ロボットが現在たっている状態を記憶して、そこから重心がどちらの方向に移動したか?」
ということも簡単に判定できます。
センサー取り付けのポイント
取り付け時のポイントですが、センサー部は点なので、接触部がその点以外の場合は当然荷重を検知できません。この場合、たとえば二足歩行ロボットの足裏につける場合は、足裏が床と平行に接触する場合でないと全センサーポイントからの値を読むことができません。床が水平でない場合も同様です。これではせっかくセンサーを付けた意味が無いので、全ポイントに荷重されるように構造的に改善するしかないかと思われます。
これは重要なポイントなので、浅草ギ研では引き続き、対象物が水平でなくても4点に荷重されるようなパーツを検討していきます。これらの情報については開発が終了しだい、4FSのページにてお知らせいたします。
おわりに
浅草ギ研では、4FSと同じようにコントロールできるセンサやコントローラを順次リリースする予定があります。感圧センサーだけでなく、他のセンサーやサーボモータコントローラも同様にコントロールできますので、これらを使えばロボットのアプリケーション開発に注力することができるでしょう。是非、高度なロボットを作成してみてください。
2006年4月18日
|