はじめに
浅草ギ研より新型のRCサーボコントローラであるAGB65-RSC(RC Servo Controler)が発売されました。旧タイプのSC-01と違う点は
|
RSC |
SC-01 |
駆動サーボ数 |
12サーボ |
12サーボ |
1ライン最大 |
48サーボ |
192サーボ |
通信速度 |
9600,115200 |
9600,19200,57600,115200 |
主接続 |
マイコン
(オプションボードでPCと接続)
|
PC
(マイコン接続はインバータIC必要) |
近藤サーボ |
教示機能とキャラクタリスティックチェンジ機能に対応 |
なし |
といった感じです。一長一短がありますのでSC-01も今後は継続して販売しますが、ここではよりマイコン向けとなったRSCとBASICスタンプとの接続を考えてみます。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
AGB65シリーズとAGB65−RSC
ロボット神経システムAGB65シリーズはPCやマイコンのシリアル通信機能を使えるスキルがあれば簡単に動かすことのできるモータコントローラ、センサー群です。1つのシリアルラインを複数のAGB65シリーズで共有でき、取り外しや追加も簡単に行えますのでマイコンをホストコンピュータとしたロボットの作成が容易にできます。
AGB65シリーズについてはこちらにも情報があります。
今回使用するAGB65−RSCは1つで12個のRCサーボの位置とスピードをコントロールするもので、シリアル通信でデータを送るとRSC側でサーボを動かすパルス生成などを行ってくれます。RSC上のDIPスイッチでIDを切り替えることにより、1つのシリアルポート、つまり1つのCOMポートには4つまでのRSCを接続でき、最大48個のRCサーボをコントロールすることができます。
RCサーボについてはこちらにも情報があります。
RCサーボコントローラ AGB65-RSCの詳細はこちらを参照願います。<−このページは必ず参照してください。
(以後、このページをRSCのページといいます)
マイコンとの接続の概略は次のようになります。1ラインに4つまでのRSCを配置できます。マイコンによっては複数のシリアル通信機能(非同期シリアル通信。UARTという名前が多い。)があるものもありますのでその場合はそれぞれに4つまでつなぐことができます。
接続
RSCはTTLレベル(0V/5V)でシリアル通信を行いますので、5V系のマイコンと直結できます。ということでBASICスタンプとも直結できます。スタンプはP0〜P15全てのIOピンからシリアル通信(送信か受信)をすることができますのでとりあえずP0とP1につなぎました。
<通信ケーブル>
スタンプとRSCの接続にはRSCに付属の通信ケーブルを使います。これはRSC同士を接続するように両側にコネクタが付いています。RSCを増設するときは、RSC同士を接続しますのでこのまま使いますが、マスタとの接続はこのケーブルの加工が必要です。
今回はスタンプをキャリアボードに挿してRSCと通信することにしましたので、ケーブルの片側にヘッダピンをハンダ付けしました。実際にはマイコンボードに合ったコネクタを自分で取り付けたり、直接マスタ側の基板にハンダ付けします。
TXEラインはRSC同士をつなぐときにだけ使いますので接続しないでOKです。写真では黄色の線ですが、線の色は決まってませんので注意して下さい(フラットケーブルを切って使っているため。別な色もある。)。
実際に接続した写真が下記のようになります。接続は添付のケーブルで行います。ロボットに搭載されるので基本的にはバッテリ駆動を想定しています。また、大きさはできるだけ小さく作りましたのでRSCは34x34mmというかなり小さいサイズです。上面はほとんどコネクタだけです。
スタンプとRSCは同じ9Vの電源を使用しています。別電源を使う場合は RSC−>スタンプ の順番に電源が入るようにしないと通信がコケる可能性がありますので注意して下さい。
※これはフロー制御をしていない非同期シリアル通信に特有の現象です。受信側が準備が出来る前に送信側からデータが送られると通信が確立できなくなります。
<サーボ電源>
サーボを駆動するにはサーボ用のバッテリが必要です。一番多いトラブルが、RCサーボ用のバッテリを使わないで動かないというものですが、コンビニなどで売っている乾電池ではたとえ電圧が同じでも動きませんので注意してください。RSCは近藤科学の「ロボパワーセル」というニッカドバッテリと接続できるコネクタがついています。RSC側のコネクタは
日本圧着端子製B2P-VHコネクタ
ですので、他のバッテリと接続する場合はコネクタを作成する必要があります。(RSCにはコネクタ作成用のケーブルも添付されていますのでそれを切って、別のバッテリにつなぎます。バッテリをショートさせると非常に危険ですので十分注意して作業を行ってください。)
<RSC用の電源>
RSCは内部5Vで動作しています。普通のサーボのバッテリは4.8〜6Vなので、そこから安定した5Vを作るのは難しいので、7.5V以上の電源が別に必要になります。RSC用の電源はサーボとは違い、電流をあまり流さないでも動作しますので、コンビニで買った電池でもOKです。また、RSCには9V乾電池用の電源ケーブルが添付されています。
電源は7.5V以上(25V以下)であればなんでも良いのですが、近藤科学製ロボット専用サーボにHVシリーズというのがあり、これは12Vぐらいかけても大丈夫、というか電圧を上げて少ない電流で駆動するというロボット向きのサーボで、これを使用している場合は、サーボ用電源(HV用なので12V近辺)をRSC上のジャンパ設定によりバイパスすることができ、バッテリ一個でサーボとRSCの両方を駆動できます。
<プログラミング中に外部電源を使う>
ロボットに実際に搭載する場合は上のようにバッテリで駆動しますが、プログラムを作っている最中は電池切れの心配がありますので、家庭用AC100Vから電源を取ってもよいでしょう。実際に多くのロボットビルダーは家で開発するときにこのような外部電源を使っています。
この場合には当然、コネクタの改造が必要になります。AC電源が通電したまま線を切ったりするとショートして爆発したりしますので十分注意して作業してください。(私も何回かバッテリを破裂させた経験があります。AC電源はもっと危険です。)
これは無線機用の30Aまで出力できる電源に、RSCや、他のRCサーボコントローラのサーボ電源用コネクタをつけたところです。電圧はつまみで調整できて5〜13Vぐらいまで調整できます。
(ALINCOのDM−330MVというもので、ツクモロボット王国で売ってます。)
私もプログラム中はこれをつかって動きを確認しながらプログラミングしてます。ニッカド電池は小さくてもサーボを動かすのに十分な電流が取り出せますが、そのようなハイパワーのAC電源はけっこうでかくなります。
9V電池の代わりは、1Aぐらいの出力のACアダプタを使ってます。ACジャックは秋葉の電子部品店などでも売ってます(私は千石電商で買いました。)。ACジャックと、RSCに添付されている9V乾電池用のケーブルを切ってハンダ付けしたのが下の右の写真です。
その他細かい接続や注意点はRSCのページを参照願います。
プログラミング〜簡単にサーボを動かしてみる
まずは簡単に、RSCのIDと、サーボ番号と、スピードを指定してサーボを動かす、というプログラムを考えてみます。
RSCのページを見ると、サーボ1つを動かす場合のフォーマットは
[255] [ID] [長(4)] [命令(2)] [サーボ番号] [サーボ位置] [Speed]
です。スタンプからシリアル通信でデータを送る命令は SEROUT 命令になります。ということで単純にデータを出力するプログラムは次のようになります。
'{$STAMP BS2}
SEROUT 0,84,[255,3,4,2,0,127,20]
END
最初の1行は、スタンプエディタで使用するスタンプを指定したときに、自動で追加される行です。
SEROUTの 0,はP0から出力、 84,は9600bps、反転なしでシリアル通信をする設定です。その後の[]内のデータが送信されます。
255:シンクロバイト
3:IDは出荷時に3番になってるのでとりあえず3
4:送信バイト長。この後4バイト送信の意味
0:RSCのP0を指定
127:位置127(中心)
20:速度
としました。
KHRが近くにありましたので、RSCの0番に左手の1つのサーボをつないで実行したところが下の写真です。
実行はスタンプにプログラムを転送すると自動的に実行されますが、すぐにENDにしているので一回動いて終わります。
しかし、RSCの方ではその位置を保持しつづける状態になってますのでサーボの位置は保持されます。
※頭部は純正部品ではありません。
数値を変えてみましょう。
'{$STAMP BS2}
SEROUT 0,84,[255,3,4,2,0,200,20]
END
今度は位置を200にしました。実行すると下のように手の位置が動きました。
※ひじから先はとれてます。
という感じでサーボを動かすことができます。
送信データですが、SEROUTの引数が数値だとわかりづらいので、定数か変数に置き換えるとわかりやすいでしょう。また、同じ命令はほとんど決まった動作になりますのでサブルーチン化しておいた方がプログラムがすっきりします。
これらをふまえて、上の2ポジションに位置を変えつづけるプログラムが次のようになりました。(あくまで一例です。)
'{$STAMP BS2}
'定数設定
RX CON 0
TX CON 1
SNC CON 255
'変数宣言
ID VAR Byte
LENGTH VAR Byte
COMMAND VAR Byte
SN VAR Byte
SPOS VAR Byte
SSPD VAR Byte
'命令’2’で常に変わらない値をセット
ID=3
LENGTH=4
COMMAND=2
'RSCが起動終えるまで待つ
PAUSE 1000
'メインループ
LOOP:
SN=0
SPOS=127
SSPD=20
GOSUB MOVE_SERVO
SN=0
SPOS=200
SSPD=20
GOSUB MOVE_SERVO
GOTO LOOP
'サブルーチン(SNで指定したサーボを動かす)
MOVE_SERVO:
SEROUT RX,84,[SNC,ID,LENGTH,COMMAND,SN, SPOS, SSPD]
PAUSE (15*SSPD)
RETURN
このように、決まっている値は定数化して、データ送信部分をサブルーチンにすると、メインループ内がすっきりします。
プログラミング〜教示機能に挑戦
KHRに使われているサーボもそうですが、近藤科学のロボット専用サーボには「教示機能」と言って、サーボの位置をフィードバックする機能もあります。
サーボを動かすときには、サーボの信号線にパルスを加えますが、この教示機能はモードに入るとサーボの方からパルスを出します。
RSCではこの「モードに入る」−>「位置の値を取得」を自動で行い、結果を数値で返す機能がついています。以下ではその機能を使ってみます。
教示機能では、読み取り時はサーボが脱力になりますので、この命令を出すと 「脱力」−>「読み取り」という動きになります。よって読み取った後になにも命令を出さないと、そのサーボは脱力したままです。
RSCのページを見ると、指定したサーボのパルスを読み取る命令フォーマットは次のようになっています。
※全サーボ一括読み取りもできますが、ここではとりあえず一個だけ読みます。
<命令フォーマット>
[255] [ID] [長(2)] [命令(22)] [サーボ番号]
<結果のフォーマット>
[255] [ID] [長(3)] [命令(22)] [サーボ番号] [サーボ位置]
今度は命令を送って、データを受信するので双方向の通信になります。命令を送信したあと、6バイト受信して結果を表示という感じになります。
とりあえず作ったプログラムが下のようになります。
'{$STAMP BS2}
'定数
RX CON 0
TX CON 1
SNC CON 255
'変数
ID VAR Byte
LENGTH VAR Byte
COMMAND VAR Byte
SN VAR Byte
SPOS VAR Byte
ID=3
'メインループ
LOOP:
'読み取り命令発行
LENGTH=2
COMMAND=22
SN=0
SEROUT RX,84,[SNC,ID,LENGTH,COMMAND,SN]
'結果受信
SERIN TX, 84, [B1,B2,B3,B4,B5,B6]
'結果表示
DEBUG CLS,"SNC=",DEC B1,CR
DEBUG "ID=",DEC B2,CR
DEBUG "LENGTH=",DEC B3,CR
DEBUG "COMMAND=",DEC B4,CR
DEBUG "SN=",DEC B5,CR
DEBUG "SPOS=",DEC B6,CR,CR
PAUSE 1000
GOTO LOOP
変数や定数は長いプログラムになったときに見やすくなりますが、この程度ではあまり変わりません。
メインループ内で
1)命令を発行(送信)
2)6バイト受信して、バイト長レジスタB1〜B6へ格納
3)DEBUG文で結果を表示(CLSは画面クリア、CRは改行)
を1秒おきに繰り返しています。
スタンプでは、割り込み処理ができないので、受信時に1バイトでもコケると次の命令までなにもできません(運が悪いとフリーズする)が、有線のシリアル通信であればまずコケることはないでしょう。
また、スタンプは動作速度が遅いので1バイトづつ読み込んで1バイトごとに意味を判定、ということは難しいので、複数のセンサーなどと共用する場合は、1つの結果が返ってくるまでは別な要求はできないので注意して下さい。
上のプログラムを転送した結果が下の通りです。まず、中心よりすこし下になっている状態の値は
SPOS=108の位置と出力されました。
手で動かしてみます。まったく通電していない状態よりは少し重く感じられますが手で回転できます。
今度は SPOS=230 となり、動いた位置を判定することができました。
このようにして教示機能を使うことができます。
全サーボの位置を読み込む命令もありますが実験してません。スタンプの場合は普通のマイコンと違って「インタプリタ」なので動作が遅く、大量にデータをやりとりするのはあまり向いてませんのでちょっと心配です。(が、力尽きました)
普通のマイコンとスタンプのシリアル通信の違い
たまたま、別なマイコンの環境があったので波形を見比べてみましたが、結構違いましたのでついでにここで解説します。
マイコンの非同期シリアル通信は、 通常HIGH(5V)で待機しており、通信開始時に1ビットの時間分LOWになります。受信側ではこの立下りから時間を計測して、9600bpsのタイミングで8回データを読み、停止を表す1ビットのHIGHで通信を終えます。このHIGHから次の通信始まりまでは時間が空いてもかまいませんが、普通の高速で動いているマイコンなどでは待ち時間無しで動作します。
下はAVRマイコン(Cで記述)から[255,3,4,2,0,200,20]の7バイトのデータを送ったところですが、各バイト間に隙間はありません。
スタンプの波形は次のようになります。一見違うデータに見えますが、これでも受信側は同じデータとして受け取ります。
白い部分が実際のデータ送信部で、ピンクの部分がなにもしていない部分です。ピンクの部分をつめると、上と同じ波形になります。(下の波形は[255,3,4,2,0,127,20]の波形でしたので後半はちょっと違う。)
スタンプはBASICで動いていますが、BASICはインタプリタなので一行で動作が完結しなくてはならず、1バイト送る都度、そのピンの入出力を切り替えたり、シリアルの設定をしたりという作業を行っていると思われ、そのオーバーヘッド時間がけっこうかかっていると思われます。
沢山のバイトの送受信や、高速処理をおこないたいときは結構致命的になります。
おわりに
このような感じで簡単にスタンプからサーボを動かしたり、位置を読み取ったりすることができます。
ここまででとりあえず1個のサーボを動かすことができるようになったかと思います。複数の場合でも上記のプログラムを若干変更するだけで作れますので、是非トライしてみてください。
また、浅草ギ研では、同じようにコントロールできるセンサやコントローラを順次リリースする予定があります。サーボコントロールだけでなく、センサーを使った高度なロボットも同様にして作れますのでこちらも是非お試しください。
2006年4月11日
|
|
|