はじめに
ここではPICと「AGB65−SAC(Small Actuator Controller)」を使ってモータなどのアクチュエータをいろいろと駆動してみます。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
※ここではビギナー向けに解説していますが、このページは、プログラミング技術の向上を狙っておりません。VC#に関する質問はご遠慮下さい。(他所で良いページがたくさんありますのでインターネットで調べてください。もしくは本を買って勉強してください。プログラム本は高いですが、図書館に申請すると無料で読めます。ついでにギ研の本も申請してもらえたら幸いです。)
PICマイコンとAGB65−SAC
ロボット神経システムAGB65シリーズはPCやマイコンのシリアル通信機能を使えるスキルがあれば簡単に動かすことのできるモータコントローラ、センサー群です。1つのシリアルラインを複数のAGB65シリーズで共有でき、取り外しや追加も簡単に行えますのでPCをホストコンピュータとしたロボットの作成が容易にできます。
AGB65シリーズについてはこちらにも情報があります。
今回使用するAGB65−SACは1つのボードに正転/逆転用のモータポートが4チャンネルあり、4つまでのDCモータ(及び、電流を流して駆動するアクチュエータ)又は2つまでのステッピングモータを駆動することができます。
小型アクチュエータ AGB65-SACの詳細はこちらを参照願います。<−このページは必ず参照してください。
(以後、このページをSACのページといいます)
マイコンとの接続の概略は次のようになります。IDを切り替えることにより1ラインに8つまでのSACを配置できます。マイコンによっては複数のシリアル通信機能(非同期シリアル通信。UARTという名前が多い。)があるものもありますのでその場合はそれぞれに8つまでつなぐことができます。また、SAC以外のAGB65シリーズもIDがSACとは異なりますので、同じラインに数珠つなぎに接続していくことができます。
※UARTの仕様は本来は1対1の通信ですが、AGB65シリーズは特殊な構造になっており、AGB65同士でシリアルラインを共有できます。
<PICマイコンについて>
電子工作を行っている皆様にはもうおなじみのマイコンであるPICですが、書籍やインターネット上での情報が豊富で、開発環境がアセンブラならメーカーのホームページより無償で入手できるというものです。最近では高機能のタイプが出てきましたが、もともとは小さくて単機能なシステムを作るために作られた経緯があり、機能やパッケージのバージョンも豊富です。
ここでは、8ピンでありながらADCまで付いている 12F675 を使ってみます。開発環境はMPLABをメーカーのホームページよりダウンロードします。言語は多くの方が使っていると思われる CCSC を使います。CCSCはサードパーティ製のC言語コンパイラですが、PICのCコンパイラの中では安いと思います。またインストールするとMBLABに組み込まれてMPLABでコンパイル指示すると自動で動いてくれるので使いやすいと思います。
以降で使っているマイコンボードは以前作ったもので、12F675に電源ジャックをつけたものです。このボードの作成と、開発環境のセットアップについてはこちらのページを参照願います。
PICマイコンボードを使って見る のページ
<−前に作ったボード。ACジャックが付いてる
PICへのプログラムミングは、純正のライタ PICSTART Plus を使って書き込んだ後に、上のボードのICソケットに挿すというやり方でやってます。PICの場合にはいろいろな書き込み方があるので、ご自分に合った環境でよろしいかと。安い自作ライタなどのキットも売っているようです。
接続
SACはTTLレベル(0V/5V)でシリアル通信を行いますので、5V系のマイコンと直結できます。ということでPICマイコンとも直結できます。
※マイコンボードによっては動作電圧が違うものもあります。(3.3Vなどの場合は通信ラインの間に電圧変換回路が必要です。)
接続ですが、SACは5V出力があります。これはオプションであるAGB65−232Cへの電源供給用にとつけたものですが、今回はPCとはつなぎませんのでここから電源が取れそうです。SACの5V出力はMOREXの53047-0210コネクタが付いていますのでこのコネクタのメス側が入手できればそれを使うと良いでしょう。今回はこのコネクタ裏から線を出してPICに電源を供給することにします。尚、このコネクタの端子間がせまいので、ショートしないように十分注意して下さい。(当然、改造なので保証外です)。
SACの方ですが、後で実験しやすいように1L,1H,2L,2H,3L,3H,4L,4H,G1-4端子にはピンヘッダを付けています。
この基板ですが、裏面にモータドライバICが2個付いています。この部分を机などに接触したまま、アクチュエータ用の電源コネクタを抜き差ししたりすると、大きな力が加わってICが壊れますので、使用するにあたってはスペーサなどを取り付けた上で行ってください。基板の取り付けはM2ネジを想定しています。例えば1.5mm厚のアルミ板にネジ止めする場合は、2mm系5mm長スペーサとM2L8ネジが最適です。WILCOあたりで購入できます。
ここではまだモータなどは付けていません。それぞれのアクチュエータの接続実験はこのページ下で行います。
私も今現在、MOREXのコネクタを持っていなかったのでSACの背面から5V電源を取ることにしました。とりあえず線をハンダ付けして、ショートなどしていないかルーペでよく確認します。
どちらが5VかGNDかですが、パターンを見るとベタグランド(色が薄くなってる大きな面)についている方がGNDとなりますのでわかります。よくわからなかったら表の印刷を確認して下さい。
SACには通信ケーブルが付いていますのでそれを改造して、H8側にはピンヘッダ用のコネクタ(2550コネクタ:浅草ギ研で売ってます)を取り付けました。紫と緑の線がそれです。灰色の線はTXEラインで、これはAGB65同士を接続するときだけに使いますのでここでは使いません。2550コネクタは千石電商でも買えます。
同じように、5Vコネクタ裏から出した線にもコネクタを付けておきました。
ということでAGB65-SACと自作PICマイコンボードを接続したところ。
SACは内部5Vで動いており、6V以上(15Vまで)の電源が必要です。SACに添付されている電源ケーブルは9V乾電池用のスナップがついてます。供給する電源はできるだけ6Vに近い電圧の方がロスが少ないのでできるだけ低くしましょう。あまり高い電圧を入れると、電圧差が熱となり、裏面の電源ICが非常に熱くなるので注意して下さい。
プログラミング中はずっと通電することもあるかと思いますので乾電池を使いたくない場合はケーブルを加工して外部電源化するのもよいでしょう。今回は1Aまで出力できる9VのACアダプタが手元にありましたのでそれを使いました。ACジャックと、ADCに添付されている9V乾電池用のケーブルを切ってハンダ付けしたのが下の右の写真です。
<アクチュエータ用電源>
アクチュエータを駆動するにはアクチュエータ用のバッテリが必要です。特にSACでは大きな電流が流れる可能性もあるのでそれぞれの仕様に合った電源を使うようにしましょう。RSC側のコネクタは
日本圧着端子製B2P-VHコネクタ
ですので、電源やバッテリと接続する場合はコネクタを作成する必要があります。(SACにはコネクタ作成用のケーブルも添付されていますのでそれを切って、別のバッテリなどにつなぎます。バッテリをショートさせると非常に危険ですので十分注意して作業を行ってください。)
下の写真は、無線機用の30Aまで出力できる電源に、SACや、他のRCサーボコントローラのサーボ電源用コネクタをつけたところです。電圧はつまみで調整できて5〜13Vぐらいまで調整できます。
(ALINCOのDM−330MVというもので、ツクモロボット王国で売ってます。)
私もプログラム中はこれをつかってます。
モータなどは複数個を同時に駆動すると数A必要とすることがありますが、電子機器用の出力の小さいACアダプタはどではきちんとモータを動かせない場合があるので、テスト中にAC電源を使う場合はこのような大容量のものを使うことをお勧めします。実際にロボットに組み込むときにはニッケル水素バッテリなどを使用すれば大電流が出せます。
その他細かい接続や注意点はSACのページを参照願います。
プログラム
PICのプログラム環境はいろいろありますが、今回は比較的安価で構築できる、CCSCのCコンパイラを使います。PICのCコンパイラの中では一番安く、書籍などでもよく紹介されています。
SACへの命令はシリアル通信により行います。
CCSCの場合は、UARTなどのシリアル通信機能がついていないPICにもソフト的にシリアル通信機能を実装することができ、しかも任意のピンを送信、受信ピンに指定できます。
プログラムが非常に短いので、全ソースを掲載します。
行4のところがCCSCでシリアル通信機能を実装する部分です。ここではGP0を送信、GP3を受信に設定し、通信速度を9600bpsにしています。この宣言だけで、2つの端子をシリアル通信端子として使用できます。但し、内蔵の4MHzクロックウを使って通信するのであまり速い速度は設定できません。
設定した端子からデータを1バイト送信する関数が行26の putc() 関数です。
行3のdelayは、CCSCの機能でウェイト関数を使うためのものです。delay_ms() は引数xmSのウェイトを行う関数で、行3の宣言を行うとこれらの関数が使えるようになります。詳しくはCCSCのマニュアルにありますのでそちらを参照してください。
とりあえず、ここではDCモータをON/OFFして駆動する、命令1を発行するプログラムを作っています。
SACのページを見ると、命令1のフォーマットは次のようになっています。
<送信フォーマット>
[255] [ID(20-27)] [バイト長(2)] [命令(1)] [設定(0-254)]
ということで、このフォーマットで5バイトのデータを送ればDCモータのコントロールができるということです。
その記述がmain関数の部分です。
特に難しいところはないかと思います。命令を変数配列(txData[]、上の方でグローバル関数で宣言してる)にセットして、先に作った送信プログラムに渡しているだけです。
全ソースは次のようになります。
AGB65_SAC_test1.c
(右クリックで対象を保存)
では実際にマブチモータ(DCモータ)を接続して動かしてみましょう。
マブチモータ(DCモータ)の接続
ホビーで一番使われていると思われるDCモータ、マブチモータを動かしてみます。マブチモータは浅草ギ研では販売していませんので、ツクモロボット王国に買いにいきました。SACは2〜8.4Vのアクチュエータが対象になりますが、店長にお聞きしたところ、低電圧では
FA-130
RE-140
RE-260
RE-280
が3V動作ということで、これらを購入しました。
マブチモータはコイル抵抗が非常に低いので、SACに直結すると大きな電流が流れてSACが壊れます。実際にテストしてみたところ壊れましたので100%壊れます。よって電流を制限するために、モータの両端に1オーム2W以上の酸化皮膜抵抗を取り付けてください。電子回路でよく使う1/4や1/8Wカーボン抵抗を使うと、抵抗器が非常に熱くなり、長時間動かすと抵抗が燃えたり破裂したりしますので、かならず2W以上のものを使用してください。
片方側だけに2オームの抵抗を入れても動きますが、正転と逆転で差が出ますので、両端に1オーム(以上)を入れた方が安定動作します。尚、抵抗が大きすぎると回転が遅くなるので注意して下さい。
実際に、モータに抵抗を取り付けたのが下の写真になります。実験中にショートすると怖いので、端子が出ている部分は絶縁テープを巻いています。この後にはステッピングモータなどをつないでみますので、取り外しできるようにコネクタも付けてみました。浅草ギ研で販売している2550コネクタをつけていますが、2.54mmピッチであればなんでも良いかと思います。
モータ用電源ですが、今回はNiMH(ニッケル水素)バッテリを使ってみました。RE260などのマブチの低電圧モータは3V推奨で、1.5V〜3Vが動作電圧となっています。NiMHは1本で1.2Vなので2本で2.4Vでちょうど良い。
全部つないでみたところが下の写真になります。ちょうど4種類のモータを買ったので、4ch全てにつなげてみました。
では早速、先のプログラムを実行してみました。すると、指定したとおりに1秒おきにch1につないだモータが正転/逆転しました。設定値をいろいろ変えることにより、動かすモータと方向が変えられます。命令の詳細はSACのページに書いてあります。
例えば、設定値を0x55にすると4ch全部が正転します。実際に命令を送信したところ、全てのモータが勢いよく正転しました。この時、各モータに流れた電流は200〜500mAぐらいでした。軸を固定してストールさせてみたところ各1Aぐらい流れましたが、短時間(3秒とか)ならば問題ない様子でした。長時間は怖いので試してません。SACは1chにつき最大700mAが規格値です。
ちなみに、マブチモータの規定の3Vを超えて5Vぐらいで回してみたところ、さらに早く回転しましたが、ドライバICや抵抗の発熱が大きくなりました。短時間なら5Vでも大丈夫そうです(マブチモータの仕様は超えてますので責任は負いません)。
命令0を実行すると全て止まりました。
次にPWMも実験してみました。
PWM制御によって回転速度を変えられます。SACの場合はPWMのデューティーを%で指定します。
<送信フォーマット>
[255] [ID(20-27)] [バイト長(3)] [命令(30)] [No(1-8)] [D(0-100)]
送信データを変えて、PWMを変えてみる実験をしました。
ch1を正転させますが、PWMのパワーを徐々に上げてみるというプログラムを書きました。
実験すると、PWM20%のときは、高周波音がするだけで回転しませんが、40%から徐々にスピードが上がって回転していきます。
全ソースは下の通り
AGB65_SAC_test2.c
(右クリックで対象を保存)
最後を101(%)としてますが、100よりも大きな値にするとパルスは発生せずに、ONがフラットな状態で出力されます。但し、100%にしても101%(もしくはそれ以上の値)にしても違いはまったくわかりません。一瞬でもLOWになってはいけないようなアクチュエータの場合は101以上を設定するとよいでしょう(それがどういうものがはわかりませんが)。
命令20でPWMのパルス周期を変えられますが、小型のDCモータぐらいでしたら初期設定(1mS周期)で特に問題ないようです。周期を長くしたりするとギコちない動きになることが予想されますので特に設定は変えない方が良いでしょう。命令20は念のために付けた程度のものです。
尚、ステッピングモータを駆動するときには自動的にさらに周期を短くしています。
電磁石サーボAA-PT01の駆動
SACは小型のアクチュエータを動かす用途で設計されていますので、小型のアクチュエータも販売しています。その中の一つが電磁石サーボAA−PT01です。
AA-PT01
AA-PT01はコイルの中の動作軸に磁石を取り付けたもので、電流の方向により左右に動きます。
非常に小さいものなのでトルクはありませんが、軽いものならば動かせますので、ロボットの装飾などに最適かと思います(耳を動かしたりとか。紙とか発泡スチロールなどで作れば動かせます)。最近では外装もあるロボットが増え、人間とのインターフェイスに表情なども効くと思いますのでこれから流行ればよいと思ってます。
コイルから出たエナメル線には1mmピッチのピンヘッダが付いています。SACと接続するには2.54mmピッチにする必要があるので、手元にあったケーブルと2550コネクタ(浅草ギ研で販売)を使ってコネクタを付けてみたのが下の写真です。
AA-PT01は、電流が流れていない時は動作軸がフリーになりますが、添付の磁石を付けると、電流が流れていない時に中心位置付近に止めておくことができます。下の写真のコイル右についている小さい銀色のツブがその磁石です。取り付け位置によって止まる位置が若干変わります。下の写真では、中心位置にしようと思いましたが磁石を少し上の方につけてしまい、軸が少し右に流れています。通電していない時にこの状態になります。
では早速駆動してみましょう。単純に右左に動かすには、コイルから出ている2本の線の片方をON/OFFすればよいので命令1を実行してみました。ちなみに、下の写真ではSACのch1(の1Lと1H)につないでいます。#1をONにしたところ、左にふれました。
#2をONにすると逆になります。
AA-PT01は両端子をPWM制御することで、位置制御も可能です。SACは各端子から任意のPWM波形が出せますので、これで制御してみました。
まず、#1を100%、#2を0%、つまり上でやった#1だけONと同じ状態にしみますと、同じく左いっぱいに振れました。
#1=100%/#2=0%
#2のデューティーを上げると、止まる位置が右の方へ変化していきます。以下同じ。
#1=100%/#2=25%
#1=100%/#2=50%
#1=100%/#2=75%
両方100%、つまり均衡しているので中心位置(付近?)になりました。
#1=100%/#2=100%
今度は逆に#1を減らしていくとさらに右になります。
#1=75%/#2=100%
#1=50%/#2=100%
#1=25%/#2=100%
#1=0%/#2=100%
小型ステッピングモータ AA−STM15 の駆動
アクチュエータにもいろいろありますが、位置情報などのフィードバックの必要が無く精密な制御ができるものにステッピングモータがあります。カメラのズーム機構、プリンタのヘッドの位置制御、車などに沢山のステッピングモータが使われていますが、一般のホビーで入手できるものは種類が限られています。特に小型のものはホビー用途としてはほとんど販売されていません。
ということで、浅草ギ研では比較的小さい、直径15mm径のステッピングモータAA−STM15を販売しています。大きさとしてはマブチの130モータよりも少し小さいもので、”静止トルク”は約40gfcmです。単純に比較はできませんがマブチFA−130は”
適正負荷”で回転しているときが4gfcmとなっています。(ただし、回転速度はステッピングモータの方がかなり遅い。用途が違うので参考まで。)
STM15にコネクタを付けてみました。DCモータやPT01のときと同じように2.54mmピッチコネクタです。
赤と灰がA相側、黄と黒がB相側になりますので2こづつ。バイポーラなので線は4本しかつながなくて良いです。
ステッピングモータの駆動についてはSACのページで詳しく説明しています。
SACにつないだところが下の写真になります。STM15は5V駆動なので、今まで使っていたNiMHバッテリを外して、テスト用の5V電源をつなぎました。
赤:1L
灰:1H
黄:2L
黒:2H
につなぎます。端子とコイルの相の関係はSTM15のページにあります。
とりあえず、片方のチャンネル(Ach)にしかつないでいないので、命令95と命令105を実行してみます。
命令95と命令105は関数化しています。ポイントとしては、速度などは2バイトに分割して送るので、プログラム内で2バイトサイズの変数を送信時に1バイトづつに分割します。たとえば、開始速度は数百〜数千の値まで指定する可能性がありますので、プログラム内ではlong型変数で扱います(CCSCの場合16bitはlong、だと思いました。)。シリアル通信で送信する場合は1バイトづつしか送れないのでこれを1バイトづつに分割してます。たとえば、行18はlong型変数のstartSpdを8bit右シフトすることによって上位バイトを下位8ビットに入れた上で、unsigned
charに型変換して上位8bitをカットしてます。行19は下位8ビットをマスクしてます。
加速設定がわからなかったので、とりあえず開始速度を100PPS、加速ステップ数を20と少し少なめにして「開始速度が普通で急に最高速度になる」というような設定にしたところ、上限速度は500PPSぐらいでした。命令105で1000ステップ回転させています。STM15はステップ角が18度なので20ステップで1回転します。ということは1000ステップを実行すると50回転回るということです。
全ソースは次の通り
AGB65-SAC_test3.c
(右クリックで対象を保存)
実行してみたところ、速すぎて50回回ったかはわかりませんでしたが、毎回同じ位置に止まるので、きちんと指定通りのステップ数を回転していたことがわかります。
−>止まる位置が同じ
上限速度をいろいろと変えてみましたが、この加速設定ですと最高速を600PPSにすると脱調しました。
−>止まる位置が毎回違う
今度は加速を調整して開始=50PPS、加速ステップ数500と「始めはゆっくり、加速も長い時間をかけて徐々に上げる」という設定にしてみました。今度は最高速が1000PPSぐらいでも脱調しませんでした。
この設定ですと、開始速度が遅いのと加速時間が長いので加減速の様子が見た目でわかります。
ちなみに、この設定で速度を1000以上にすると、たとえば1100PPSに設定すると1100PPSと思われる時にはブルブルしてるだけで動きませんでした。
また、電圧を低くしてみると、100PPSぐらいでも脱調子すことがありました。
ということは、電源電圧を5V以上にすると最高速度も変わるような気もしますが、怖いので実験してません。
1分間ぐらい回していたところ、STM15がかなり熱くなりました。コイル抵抗が低いのと、ほぼむき出しの構造なので熱が出やすいようです。実際に駆動するときには、動作終了毎に命令0を発行して電流を切った方が良いでしょう。
ステッピングモータは停止しているときもその位置を保持するために電流が流れていますので、注意しましょう。
STM15はステップ角が18度とかなり大きいですが、逆に言うと同じステップ数であれば回転速度が速いということになります。実際に回してみたところ、一般的に入手できる30mm径ぐらいのハイブリッドステッピングモータに比べると回転速度が明らかに速いです。ということで、車輪をつけてちょこまかと動くようなロボットに使えるのではないかとおもっています。
マイクロマウスも小さい迷路ができるようですのでこれを機にマイクロマウスにはしるというのもよいかもしれません。
日本サーボ製ステッピングモータ KH39FM2-801 の駆動
ステッピングモータといえば、ホビーロボットではマイクロマウスにもよく使われています。マイクロマウスといえば「マイクロマウス工房」の森永さんが有名ですが、ホームページではベーシックマウスというマイクロマウスロボットの作り方が詳しく紹介されており、このベーシックマウスの製作をきっかけにロボット道に入った方は多いのではないかと思います。
ということでベーシックマウスで使われているKH39FM-801を動かしてみます。ツクモロボット王国で車輪も売っていますので簡単に車輪型ロボットがつくれそうです。
接続は次のようになります。
−chA側−
1L:黒
1H:茶
2L:黄
2H:橙
−chA側−
3L:黒
3H:茶
4L:黄
5H:橙
青と赤はそれぞれ空いているG1〜G4につないで下さい。
今度は命令90、命令100を使って両方同時に回転させてみました。今回、プログラムは掲載しませんが、上記命令95、命令105のプログラムを参考にしてください。SACはSTM設定をしないとSTM駆動ができませんので必ず命令90を一度実行しましょう。その後は設定を変えるまで(命令95を実行するまで)何度でも命令100を実行できます。
KH39FM2-801はマイクロステップも使えます。たとえば400ステップ進めると、このモータは1ステップが1.8度なのでマイクロステップだと1.8x400/4=180度回ります。2相励起だと1.8x400=720度で2回転、ハーフステップだと1.8x400/2=360度で1回転となります。
マイクロステップはステップ角度が小さいのでスムーズに回る感じです。但し、同じ加速設定だと2相励起などにくらべると回転速度は遅くなります。
最高速度を試してみたところ、
2相励起:500PPS
ハーフステップ:1000PPS
マイクロステップ:1400PPS
といったところでした。
と思ったら、サーボを良く見たら電源がDC6.3Vというのを発見。上はAA−PT01の実験の流れで5Vで駆動してました。前回の疑問点だった電圧を上げると最高速度が変わるかという点ですが、6Vにしてみたところマイクロステップで1700PPSまで脱調しませんでした。ということで電圧が高くなれば脱調しづらいということがわかりました。
この勢いでマイクロマウスを作ってしまおうと思いましたが断念。力尽きました。
バイオメタルの駆動
トキコーポレーションからバイオメタルという名称で形状記憶合金型のアクチュエータが販売されています。電流を流して制御するということでこれもSACで駆動することができます。
いろいろと実験してみたところ、まず直結では抵抗が低すぎるので電流を流すと縮みますがもとにもどらなくなったりしました。ということで抵抗を直列に入れて実験してみたところ、BMF150という一番太いタイプで5〜10オームの抵抗を直列につないだときに問題なく動きました。このとき、流れる電流は200〜300mAとなりますのでSACで十分制御できます。
バイオメタルは素子の状態でしか販売されておらず、ケースや取り付け部なども付いてアクチュエータの形になるとおもしろいかもしれません。
細すぎて写真に写りずらかったので写真などは割愛します。
おわりに
このような感じで簡単に、小型のアクチュエータを駆動することができます。是非、面白いアプリケーションを考えてみてください。
2007年9月5日
|