※特殊メイクのコーナーはこちらに移りました。Controller)」を使ってモータなどのアクチュエータをいろいろと駆動してみます。※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。※ここではビギナー向けに解説していますが、このページは、プログラミング技術の向上を狙っておりません。VC#に関する質問はご遠慮下さい。(他所で良いページがたくさんありますのでインターネットで調べてください。本を買って勉強してください。プログラム本は高いですが、図書館に申請すると無料で読めます。ついでにギ研の本も申請してもらえたら幸いです。)AVRマイコンと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同士でシリアルラインを共有できます。<AVRマイコンについて>日本ではホビー用としてH8やPICと同じように使われているマイコンにAVRというものがあります。AVRマイコンには、C言語でのプログラミングに考慮されたAT-megaシリーズがあり、浅草ギ研で販売しているロボットキット「AT-WALKER」にはベストテクノロジー社のAT−mega32マイコンボード、BTC067が使われています。マイコンの開発で一番はじめにカベとなるのが開発環境ではないかと思います。ベストテクノロジー社ではAT-mega32用のC言語開発環境GDLを無償で公開しており、これは本来であれば自分で構築しなくてはならない開発環境の設定があらかじめされている、という便利なもので、ビギナーでもすぐにプログラミングを始めることができます。以降では、AT−WALKERのマイコンボード(BTC067に5V電源回路を追加したボード)を使用した接続・プログラミング例を紹介します。他のAT−megaのマイコンボードや、自作マイコンボードを作っている方も大体同じですので参考にしてください。書籍で作るボードの完成品。5V電源基板の上にBTC067が載っているAT-mega32のプログラミングについては、浅草ギ研より出ている書籍「二足歩行ロボット製作超入門」に詳しく書いてあります。浅草ギ研ではこのAT−mega32マイコンボードだけの販売もおこなっております。(上の写真の真ん中の部分だけ)BTC067の改造この節は、ベステクのBTC067(AT−WALKERボードの上にのってるもの)を使用する場合に必要な処理ですので、自作のマイコンボードなどの場合は飛ばしてもOKです。BTC067の場合、シリアルポート通信ポートはプログラムポートも兼ねており、PCと通信ができるような外部回路がついています。この影響により、受信(RX)を使用とすると問題が発生しますので、若干改造をする必要があります。送信の場合(TXを使用)は問題ありません。下はBTC067についてくるマニュアルの回路図です。(R80がどうの、という記載は無視してください。)JP1は出荷時にはつながっており、PCからプログラムが受けられるようになってます。下の図は実際にこの状態でRXにデータを受けたときの波形です。下の図のレンジは1マス2Vで、Highの状態は5Vですが、LOWが0Vではなく2.2V近辺に上がってしまいました。実際にプログラムでデータを受け取ろうとしましたがこの波形では全てHighと認識されてしまい、データは受け取れませんでした。BTC067ではJP1の接続を切れますので、MAX3313(上の図の右のIC)の影響が出ないようにするために、JP1を外して実験してみます。いうところがあり、ハンダが盛られています。このハンダを取り去ると接続を切ることができます。ハンダ吸い取り線でハンダをとりました。(実際にはこの上からハンダゴテをあてます)JP1のハンダが取れて、接続が切られているのがわかります。波形を観測すると、今度はきちんとLOWが0Vまで下がり、データを受け取ることができました。今度はMAX3313の接続が切られているので、新しいプログラムを入れようとするとAVDUDE(*1)を起動してもプログラムが転送されません。(*1)GDLで作ったプログラムをATmega32に転送するプログラム。詳しくは浅草ギ研の書籍「二足歩行ロボット製作超入門」かBTC067のマニュアルを参照。この対策として、ここではJP1にプッシュスイッチを取り付けて、「プログラムを転送している間はスイッチを押す」ということにしました。これで、プログラムの書きこみも、RXを使うこともできるようになりました。ついでに、通信に使うピンにヘッダピンを取り付けて作業しやすくしました。接続SACはTTLレベル(0V/5V)でシリアル通信を行いますので、5V系のマイコンと直結できます。いうことでAVRマイコンとも直結できます。※マイコンボードによっては動作電圧が違うものもあります。(3.3Vなどの場合は通信ラインの間に電圧変換回路が必要です。)SACの方ですが、後で実験しやすいように1L,1H,2L,2H,3L,3H,4L,4H,G1-4端子にはピンヘッダを付けています。この基板ですが、裏面にモータドライバICが2個付いています。この部分を机などに接触したまま、アクチュエータ用の電源コネクタを抜き差ししたりすると、大きな力が加わってICが壊れますので、使用するにあたってはスペーサなどを取り付けた上で行ってください。基板の取り付けはM2ネジを想定しています。1.5mm厚のアルミ板にネジ止めする場合は、2mm系5mm長スペーサとM2L8ネジが最適です。WILCOあたりで購入できます。ここではまだモータなどは付けていません。それぞれのアクチュエータの接続実験はこのページ下で行います。SACには通信ケーブルが付いていますのでそれを改造して、H8側にはピンヘッダ用のコネクタ(2550コネクタ:浅草ギ研で売ってます)を取り付けました。紫と緑の線がそれです。灰色の線はTXEラインで、これはAGB65同士を接続するときだけに使いますのでここでは使いません。2550コネクタは千石電商でも買えます。いうことで、付属ケーブルを改造して接続したのが下の写真になります(BTC067はAT-WALKERに付いてます)。電源は9V乾電池を使っています。AT-WALKERに内蔵されています。プログラミング中はずっと通電することもあるかと思いますので乾電池を使いたくない場合はケーブルを加工して外部電源化するのもよいでしょう。今回は1Aまで出力できる9VのACアダプタが手元にありましたのでそれを使いました。ACジャックと、ADCに添付されている9V乾電池用のケーブルを切ってハンダ付けしたのが下の右の写真です。<アクチュエータ用電源>アクチュエータを駆動するにはアクチュエータ用のバッテリが必要です。SACでは大きな電流が流れる可能性もあるのでそれぞれの仕様に合った電源を使うようにしましょう。RSC側のコネクタは日本圧着端子製B2P-VHコネクタですので、電源やバッテリと接続する場合はコネクタを作成する必要があります。(SACにはコネクタ作成用のケーブルも添付されていますのでそれを切って、別のバッテリなどにつなぎます。バッテリをショートさせると非常に危険ですので十分注意して作業を行ってください。)下の写真は、無線機用の30Aまで出力できる電源に、SACや、他のRCサーボコントローラのサーボ電源用コネクタをつけたところです。電圧はつまみで調整できて5〜13Vぐらいまで調整できます。(ALINCOのDM−330MVというもので、ツクモロボット王国で売ってます。)私もプログラム中はこれをつかってます。モータなどは複数個を同時に駆動すると数A必要とすることがありますが、電子機器用の出力の小さいACアダプタはどではきちんとモータを動かせない場合があるので、テスト中にAC電源を使う場合はこのような大容量のものを使うことをお勧めします。実際にロボットに組み込むときにはニッケル水素バッテリなどを使用すれば大電流が出せます。その他細かい接続や注意点はSACのページを参照願います。プログラムGDLですが、フリーのGCCが原型ともあって、結構ひんぱんにバージョンが変わります。バージョンが変わって、浅草ギ研のサンプルプログラムが動かない、というお問い合わせがたまにあるので、今回はあまりバージョンに依存しないようにシリアル送受信プログラムもつくってみます。今回使用するバージョンは、Ver1.7.4.0です。2007年9月現在で最新版よりも少し古い感じになります。SACへの命令はシリアル通信により行います。ATmega32の場合はシリアル通信機能はUSARTという名称になっていますので、データシート(探すと日本語訳のデータシートが見つかります)のそのあたりを読んで書いた送信プログラムが下の部分です。<シリアル通信機能設定関数と、送信関数>USARTの設定は主にUCSRB,UCSRCレジスタで設定しますが、ほとんどデフォルトの設定で普通のシリアル通信ができます。あとは送信受信を有効にする(行10)ぐらいです。ボーレートはUBRR(ボーレートレジスタ)で設定します。設定値の計算方法はデータシートに載ってますが、クロックが16MHzの場合には9600bpsに設定するには103をセットします。UBRRですが、16MHzのクロックだと19200bpsぐらいまではなんとか設定できますが、それ以上になると誤差が大きすぎて通信できませんので注意しましょう。いうことで、クロック16MHzの場合は115200bpsではSACとは通信できませんので9600bps固定にします。行15〜19は実際に送信する部分です。送信にはUDRに値をセットするだけで自動で送信されるのですが、UDRからシフトレジスタを経由して送信されるので、前にセットしたものがシフトレジスタに送信しきれていない可能性があるので、UDREを監視しながら送信データをセットします。その他で、ウェイト関数があると便利なので作りました。<ウェイト関数>タイマをつかってウェイトをかけているだけです。引数xmSでウェイトを指定します。ここではDCモータをON/OFFして駆動する、命令1を発行するプログラムを考えてみます。SACのページを見ると、命令1のフォーマットは次のようになっています。[設定(0-254)]ということで、このフォーマットで5バイトのデータを送ればDCモータのコントロールができるということです。<メイン>1秒おきに正転/逆転を指示するプログラムです。難しいところはないかと思います。命令を変数配列(txData[]、上の方でグローバル関数で宣言してる)にセットして、先に作った送信プログラムに渡しているだけです。全ソースは次のようになります。AGB65_SAC_avr1.c(右クリックで対象を保存)では実際にマブチモータ(DCモータ)を接続して動かしてみましょう。マブチモータ(DCモータ)の接続ホビーで一番使われていると思われるDCモータ、マブチモータを動かしてみます。マブチモータは浅草ギ研では販売していませんので、ツクモロボット王国に買いにいきました。SACは2〜8.4Vのアクチュエータが対象になりますが、店長にお聞きしたところ、低電圧ではFA-130RE-140RE-260RE-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全てにつなげてみました。先のプログラムを実行してみました。写真のようにAT-WALKER上のBTC067の場合は書き込みスイッチやら電源スイッチやらが沢山あるので間違わないように操作してください。9V電池の抜き差しで電源を入れると、間違ったときに抜きやすいので良いです。実行すると、指定したとおりに1秒おきにch1につないだモータが正転/逆転しました。設定値をいろいろ変えることにより、動かすモータと方向が変えられます。命令の詳細はSACのページに書いてあります。設定値を0x55にすると4ch全部が正転します。実際に命令を送信したところ、全てのモータが勢いよく正転しました。この時、各モータに流れた電流は200〜500mAぐらいでした。軸を固定してストールさせてみたところ各1Aぐらい流れましたが、短時間(3秒とか)ならば問題ない様子でした。長時間は怖いので試してません。SACは1chにつき最大700mAが規格値です。ちなみに、マブチモータの規定の3Vを超えて5Vぐらいで回してみたところ、さらに早く回転しましたが、ドライバICや抵抗の発熱が大きくなりました。短時間なら5Vでも大丈夫そうです(マブチモータの仕様は超えてますので責任は負いません)。命令0を実行すると全て止まりました。次にPWMも実験してみました。PWM制御によって回転速度を変えられます。SACの場合はPWMのデューティーを%で指定します。[D(0-100)]送信データを変えて、PWMを変えてみる実験をしました。今度は命令自体を関数化してます。ch1を正転させますが、PWMのパワーを徐々に上げてみるというプログラムを書きました。実験すると、PWM20%のときは、高周波音がするだけで回転しませんが、40%から徐々にスピードが上がって回転していきます。全ソースは下の通りAGB65_SAC_avr2.c(右クリックで対象を保存)最後を101(%)としてますが、100よりも大きな値にするとパルスは発生せずに、ONがフラットな状態で出力されます。100%にしても101%(もしくはそれ以上の値)にしても違いはまったくわかりません。一瞬でもLOWになってはいけないようなアクチュエータの場合は101以上を設定するとよいでしょう(それがどういうものがはわかりませんが)。命令20でPWMのパルス周期を変えられますが、小型のDCモータぐらいでしたら初期設定(1mS周期)で特に問題ないようです。周期を長くしたりするとギコちない動きになることが予想されますので特に設定は変えない方が良いでしょう。命令20は念のために付けた程度のものです。ステッピングモータを駆動するときには自動的にさらに周期を短くしています。電磁石サーボAA-PT01の駆動SACは小型のアクチュエータを動かす用途で設計されていますので、小型のアクチュエータも販売しています。その中の一つが電磁石サーボAA−PT01です。AA-PT01AA-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を減らしていくとさらに右になります。駆動アクチュエータにもいろいろありますが、位置情報などのフィードバックの必要が無く精密な制御ができるものにステッピングモータがあります。カメラのズーム機構、プリンタのヘッドの位置制御、車などに沢山のステッピングモータが使われていますが、一般のホビーで入手できるものは種類が限られています。小型のものはホビー用途としてはほとんど販売されていません。いうことで、浅草ギ研では比較的小さい、直径15mm径のステッピングモータAA−STM15を販売しています。大きさとしてはマブチの130モータよりも少し小さいもので、”静止トルク”は約40gfcmです。適正負荷”で回転しているときが4gfcmとなっています。(ただし、回転速度はステッピングモータの方がかなり遅い。用途が違うので参考まで。)STM15にコネクタを付けてみました。DCモータやPT01のときと同じように2.54mmピッチコネクタです。赤と灰がA相側、黄と黒がB相側になりますので2こづつ。バイポーラなので線は4本しかつながなくて良いです。ステッピングモータの駆動についてはSACのページで詳しく説明しています。SACにつないだところが下の写真になります。STM15は5V駆動なので、今まで使っていたNiMHバッテリを外して、テスト用の5V電源をつなぎました。赤:1L灰:1H黄:2L黒:2Hにつなぎます。端子とコイルの相の関係はSTM15のページにあります。電源は実験用に5Vの電源につないでいます(STM15は5V動作)。片方のチャンネル(Ach)にしかつないでいないので、命令95と命令105を実行してみます。今回は命令95と命令105を関数化してみました。ポイントとしては、速度などは2バイトに分割して送るので、プログラム内で2バイトサイズの変数を送信時に1バイトづつに分割します。開始速度は数百〜数千の値まで指定する可能性がありますので、プログラム内ではlong型変数で扱います(ATmegaの場合16bitはlong、だと思いました。USARTで送信する場合は2バイトづつなのでこれを1バイトづつに分割してます。charに型変換して上位8bitをカットしてます。行42は下位8ビットをマスクしてます。実際に動かしてみましょう。加速設定がわからなかったので、とりあえず開始速度を100PPS、加速ステップ数を20と少し少なめにして「開始速度が普通で急に最高速度になる」というような設定にしたところ、上限速度は500PPSぐらいでした。命令105で1000ステップ回転させています。STM15はステップ角が18度なので20ステップで1回転します。いうことは1000ステップを実行すると50回転回るということです。実際のソースは次の通りAGB65-SAC_avr3.c(右クリックで対象を保存)実行してみたところ、速すぎて50回回ったかはわかりませんでしたが、毎回同じ位置に止まるので、きちんと指定通りのステップ数を回転していたことがわかります。止まる位置が同じ上限速度をいろいろと変えてみましたが、この加速設定ですと最高速を600PPSにすると脱調しました。止まる位置が毎回違う今度は加速を調整して開始=50PPS、加速ステップ数500と「始めはゆっくり、加速も長い時間をかけて徐々に上げる」という設定にしてみました。今度は最高速が1000PPSぐらいでも脱調しませんでした。この設定ですと、開始速度が遅いのと加速時間が長いので加減速の様子が見た目でわかります。ちなみに、この設定で速度を1000以上にすると、たとえば1100PPSに設定すると1100PPSと思われる時にはブルブルしてるだけで動きませんでした。電圧を低くしてみると、100PPSぐらいでも脱調子すことがありました。いうことは、電源電圧を5V以上にすると最高速度も変わるような気もしますが、怖いので実験してません。1分間ぐらい回していたところ、STM15がかなり熱くなりました。コイル抵抗が低いのと、ほぼむき出しの構造なので熱が出やすいようです。実際に駆動するときには、動作終了毎に命令0を発行して電流を切った方が良いでしょう。ステッピングモータは停止しているときもその位置を保持するために電流が流れていますので、注意しましょう。STM15はステップ角が18度とかなり大きいですが、逆に言うと同じステップ数であれば回転速度が速いということになります。実際に回してみたところ、一般的に入手できる30mm径ぐらいのハイブリッドステッピングモータに比べると回転速度が明らかに速いです。いうことで、車輪をつけてちょこまかと動くようなロボットに使えるのではないかとおもっています。マイクロマウスも小さい迷路ができるようですのでこれを機にマイクロマウスにはしるというのもよいかもしれません。駆動ステッピングモータといえば、ホビーロボットではマイクロマウスにもよく使われています。マイクロマウスといえば「マイクロマウス工房」の森永さんが有名ですが、ホームページではベーシックマウスというマイクロマウスロボットの作り方が詳しく紹介されており、このベーシックマウスの製作をきっかけにロボット道に入った方は多いのではないかと思います。いうことでベーシックマウスで使われている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で十分制御できます。バイオメタルは素子の状態でしか販売されておらず、ケースや取り付け部なども付いてアクチュエータの形になるとおもしろいかもしれません。細すぎて写真に写りずらかったので写真などは割愛します。おわりにこのような感じで簡単に、小型のアクチュエータを駆動することができます。面白いアプリケーションを考えてみてください。通信販売の法規(訪問販売法第8条)に基づく通信販売業者の。