■ホビーロボット部品の製造・販売 
  モータコントローラ、センサ、音声、画像、無線モジュールなど、
■ホビーロボット制作記事のページ (各種マイコン、PCとの接続事例)
■特殊メイク、特殊材料の販売 ※特殊メイクのコーナーはこちらに移りました。
Top(お知らせ) 製品紹介 使い方とサンプルプログラム 通信販売 リンク ロボット掲示板 会社案内
 Easy Robotics for all enthusiastic people!!!  ---HOBBY ROBOT PARTS SHOP ASAKUSAGIKEN---   Since 2003...

Visual C# 2005 を使ってPCからRCサーボを駆動してみる
はじめに

 
前回までで、VisualC#2005(以下VC#)でのシリアルポートの使い方をやりました。ここではシリアル通信で簡単にRCサーボが動かせる、浅草ギ研製RCサーボコントローラ AGB65-RSC(Rc Servo Controler) を使って、VC#でサーボを動かすプログラムを作ってみます。

 VC#2005のインストールについてはこちらを参照願います。

 VC#2005でシリアル通信をする方法、シリアル通信、RS232Cについてはこちらを参照願います。


 ※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。

 ※ここではビギナー向けに解説していますが、このページは、プログラミング技術の向上を狙っておりません。VC#に関する質問はご遠慮下さい。(他所で良いページがたくさんありますのでインターネットで調べてください。もしくは本を買って勉強してください。プログラム本は高いですが、図書館に申請すると無料で読めます。ついでにギ研の本も申請してもらうとありがたいです。)


AGB65シリーズとAGB65−RSC

 ロボット神経システムAGB65シリーズはPCやマイコンのシリアル通信機能を使えるスキルがあれば簡単に動かすことのできるモータコントローラ、センサー群です。1つのシリアルラインを複数のAGB65シリーズで共有でき、取り外しや追加も簡単に行えますのでPCをホストコンピュータとしたロボットの作成が容易にできます。

 AGB65シリーズについてはこちらにも情報があります。

 今回使用するAGB65−RSCは1つで12個のRCサーボの位置とスピードをコントロールするもので、シリアル通信でデータを送るとRSC側でサーボを動かすパルス生成などを行ってくれます。RSC上のDIPスイッチでIDを切り替えることにより、1つのシリアルポート、つまり1つのCOMポートには4つまでのRSCを接続でき、最大48個のRCサーボをコントロールすることができます。

 RCサーボについてはこちらにも情報があります。

 RCサーボコントローラ AGB65-RSCの詳細はこちらを参照願います。<−このページは必ず参照してください。
  (以後、このページをRSCのページといいます)

 PCとマイコンのシリアル通信の電圧は違いますが、AGB65シリーズは標準ではマイコンと接続するようになっておりますのでこれを変換する必要があります。変換にはAGB65−232Cというオプションボードが用意されております。

 

 COMポートが無いノートPCなどは、USBシリアルアダプタを使用することになります。市販の簡易的なUSBシリアルアダプタの場合は正常に通信できないものがありますのでご注意ください。浅草ギ研で販売しているものは確認済みです。


実際の接続

 実際に接続した写真が下記のようになります。接続は添付のケーブルで行います。ロボットに搭載されるので基本的にはバッテリ駆動を想定しています。また、大きさはできるだけ小さく作りましたのでRSCは34x34mmというかなり小さいサイズです。上面はほとんどコネクタだけです。

  

<サーボ電源>
サーボを駆動するにはサーボ用のバッテリが必要です。一番多いトラブルが、RCサーボ用のバッテリを使わないで動かないというものですが、コンビニなどで売っている乾電池ではたとえ電圧が同じでも動きませんので注意してください。RSCは近藤科学の「ロボパワーセル」というニッカドバッテリと接続できるコネクタがついています。RSC側のコネクタは

 日本圧着端子製B2P-VHコネクタ

ですので、他のバッテリと接続する場合はコネクタを作成する必要があります。(RSCにはコネクタ作成用のケーブルも添付されていますのでそれを切って、別のバッテリにつなぎます。バッテリをショートさせると非常に危険ですので十分注意して作業を行ってください。)

<RSC用の電源>
RSCは内部5Vで動作しています。普通のサーボのバッテリは4.8〜6Vなので、そこから安定した5Vを作るのは難しいので、7.5V以上の電源が別に必要になります。上の写真では9V乾電池をつないでます。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電池の代わりは、1Vぐらいの出力のACアダプタを使ってます。ACジャックは秋葉の電子部品店などでも売ってます(私は千石電商で買いました。)。ACジャックと、RSCに添付されている9V乾電池用のケーブルを切ってハンダ付けしたのが下の右の写真です。


その他細かい接続や注意点はRSCのページを参照願います。


プログラミング〜簡単にサーボを動かしてみる

以下、プログラミング経験がある方を想定して進めます。C#や.NET環境をまったく使ったことが無い方は前のページ(ココココ)を見てください。VC#2005はマイクロソフトより無償で入手できます。VBもC++もJ#も無償ですが、以下C#ですすめます。

C#は大文字と小文字を判断しますので、打ち間違いに注意してください。 textBox と TextBox は別ものと判断されます。

まずは簡単に、RSCのIDと、サーボ番号と、スピードを指定して、ボタンを押すとそのサーボが動く、というプログラムを考えて見ます。

RSCのページを見ると、サーボ1つを動かす場合のフォーマットは

 [255] [ID] [長(4)] [命令(2)] [サーボ番号] [サーボ位置] [Speed]

のようになっています。[ID] [サーボ番号] [サーボ位置] [Speed] が可変です。IDは0−4までで固定です。よってIDをコンボボックス、のこり3つをテキストボックスに割り当てることにします。

ということでWindowsアプリケーションでプロジェクトを作り、必要なコンポーネントを貼り付けたのが下になります。コンポーネントはツールボックスからドラック&ドロップで簡単に貼り付けられます。


初期値で名前などが button1 のようにC#側でつけられていますが、このままだとわかりづらいのでわかりやすい名前と表示に変更します。変更するにはそれぞれのコンポーネントを指定(クリック)した状態で画面右下のプロパティを変更します。名前は(Name)、表示はTextのところで変えます。(Name)はプログラム内で識別するもので、普通は半角英数にします。Textは自分でわかりやすいものにします。大きさはデザイナ画面(上の画面)でマウスで調整します。

旧(Name) 変更したプロパティ
Form1 Text:AGB65-RSCのサーボ駆動
label1 Text:ID
label2 Text:サーボ番号
label3 Text:サーボ位置
label3 Text:速度(x15mS)
comboBox1 (Name):id
Text:3
Items: 0 1 2 3 を追加
textBox1 (Name):servoNum
Text:0
textBox2 (Name):servoPos
Text:127
textBox3 (Name):servoSpd
Text:20
button1 (Name):runButton
Text:実行
※それぞれの設定方法はヘルプを参照してください。特にComboBox。

設定後は下のようになります。ここで「F6」でビルドして「Ctrl」+「F5」で実行すると、このフォームが実行され、フォームの実体が表示されます。


実際のプログラミングでは、入力チェック、たとえば半角数字を入れなくてはならないところに全角が入ってないかとかバイト変数に代入する値なので0〜255しか許可しない、などのチェックを入れないといけないのですが、プログラムがややこしくなるので割愛します。以後、操作するときは上のテキストボックスには0〜255の範囲で半角で入力してください。

IDはRSCのIDが出荷時に3に設定されているので初期値を3にしてます。

サーボ関係は0番サーボを中心位置に早めの速度でまわすという初期値にしてます。位置127が中心です。RSCの電源投入時には中心位置にサーボがきますので、ソフトをつないで突然動くということがないように中心にしてます。

さて、シリアルポートからデータを送信するのでシリアルポートコンポーネントも配置します。

ツールボックスを探すとSerialPortコンポーネントが見つかります。


フォームにドラック&ドロップすると、画面下の方に表示されます。実際にフォームに表示しないコンポーネントはこのように画面下のフォーム外に配置されます。そこをクリックするとプロパティが見れます。


プロパティを見ると次のようになっています。

一番重要な通信設定ですが、SerialPortコンポーネントの初期値は上のように

速度:9600bps
データ長:8ビット
パリティ:なし
ストップビット:1
フロー制御なし:

という設定です。これはRSCの初期設定と同じなので、プロパティなどは特に変える必要はないでしょう。変える可能性のあるのは、RSCはボーレート115kも設定できますのでボーレートの設定ぐらいでしょうか。115Kで通信する場合は上のBaudRateを115200に変えて、RSCのBPSジャンパをONにします。(が、ここではとりあえずやらない方が良いです。9600で動くのを確認してから115Kを試してみてください。)

このコンポーネントの名前が serialPort1 というのを覚えておきます。

では実際に送信するプログラムのコーディングに移ります。
Windowsのプログラムはイベントをきっかけに動きますので「ボタンをクリック」というイベントが発生したらデータを送るようにします。
下記の手順でボタンのイベントを表示させ、 Clickイベントの右をダブルクリックすると、Clickイベントの入力画面になります。


こんな感じで表示されます。実際にはフォームを定義する部分やいままでコンポーネントを貼り付けたりプロパティを設定した部分も必要ですが、そのあたりはコンストラクタ(起動時の処理をするところ。)内の InitializeComponent() で定義されています。この中身はForm1.Designer.csとい名前で別ファイル内にかかれてます。余計なところは隠しておくという感じでしょうか。前バージョンよりすっきりしてよいと思います。


さて、ここまできたら後はC#の初級本に書いてある内容だけで組めるかと思います。で、組んでみたのが下になります。


データはこちらになります。  Form1.cs

参考までに、デザイナで生成された部分ものせておきます。 Form1.Desiner.cs

難しいところは無いので解説の必要はないかと思います。コメントそのままです。各値は、各コンポーネントのTextからとってくるので、「文字」−>「Byteサイズの数値」に変換する必要があります。それが Convert.ToByte( ) です。コンバートしないとアスキーコードで送られるので注意してください。255の数値1バイト送りたいのに'2'と'5'と'5'の文字3バイトが送られます。

いままでAPIやCOMコンポーネントをつかってシリアル通信していたのとくらべるとアホみたいに簡単にできます。

では実際に動かしてみましょう。一年前に作ったKHR−G3がころがってましたのでつないでみました。

<位置200で送信>


<位置127で送信>


まちがい探しのようですが、左手の位置が変わってるのがわかるでしょうか?

※本格的に使う場合はエラー処理を入れたり、ディスポーズ内でポートを閉じる(seralPort1.Close( ))を追加してください。上はあくまでもわかりやすい例ということで簡単に作ってます。ポートクローズしないと、PCの電源を切らないとポートが開放されない場合がありますので注意してください(可能性は低いですが。)。


プログラミング〜教示機能に挑戦

 KHRに使われているサーボもそうですが、近藤科学のロボット専用サーボにはRedVersionと言ってサーボの位置をフィードバックする機能もあります。
 サーボを動かすときには、信号線にパルスを加えてそのパルス長でサーボの停止位置が決まりますが、この教示機能は教示機能モードに入るとサーボの方からパルスを出して位置をしらせます。

 RSCではこの「モードに入る」−>「位置の値を取得」ということも自動でやり、結果を数値で返す機能がついています。以下ではそのRSCの機能を使ってみます。

RedVersionの機能では、読み取り時はサーボが脱力になりますので、この命令を出すと 「脱力」−>「読み取り」という動きになります。そのままでいると脱力したままです。

RSCのページを見ると、指定したサーボのパルスを読み取る命令フォーマットは次のようになっています。
※全サーボ一括読み取りもできますが、ここではとりあえず一個だけ読みます。

<命令フォーマット>
[255] [ID] [長(2)] [命令(22)] [サーボ番号]

<結果のフォーマット>
[255] [ID] [長(3)] [命令(22)] [サーボ番号] [サーボ位置]


 今度は命令を送って、データを受信するので双方向の通信になります。

 とりあえず、今まで作ったものに、受信するためのコンポーネントを追加しました。デザイナ画面にもどり、下のように追加しました。


その後、先ほどと同じようにプロパティを変更しました。
旧(Name) 変更したプロパティ
groupBox1 Text:ポジションキャプチャ
button1 (Name):getPosButton
Text:読み取り
taxtBox1 (Name):captureResult

こうなります。

※GroupBoxは見やすいかなという理由でつけてますのでなくても問題ないです。

 これで、getPosButton(読み取りボタン)のクリックイベントで命令発行すれば命令を出す部分はよいことになります。これは実行ボタンのときと同じですので簡単です。読み取りボタンを選択し、イベントを開いて次のようにプログラムを追加しました。



 次は受信です。

 命令送信後、RSCからいつ結果が返されるかPC側ではわかりませんが、SerialPortコンポーネントに、受信がきたときに発生するイベントがありましたのでこれを利用します。デザイナ画面に戻り、貼り付けられている serialPort1 を選択(クリック)し、イベントボタン(イナズマアイコン)を押してイベントを表示させます。


 SerialPortコンポーネントの場合は、自動生成されるイベントの構文が若干違います。引数のところの記述が変わってますが、あまり気にしないでください。C#を追求するとこのあたりを操作できてさらにいろいろなことができるというものです。普通に通信する場合はいじりません。


さて、もう一度、RSCから返送される結果のフォーマットを見てみます。

<結果のフォーマット>
[255] [ID] [長(3)] [命令(22)] [サーボ番号] [サーボ位置]

ということでできたのが下のプログラムになります。


※テキストデータはこちら RCV2.txt (先のを上書きしてしまったのでテキストにしてます。参考まで。)

 受信も、イベントが用意されているので簡単に書けますね。詳細はコメントのとおりです。

 では早速動かしてみます。「F6」でビルドして「Ctrl」+「F5」で実行します。

■まず、位置250を「実行」しますと、手を上げます。サーボは左肩のサーボをRSCのP0番につないでます。この状態はRSCからサーボの位置パルスが出続けてますので、サーボを動かそうとしても動きません。


■ここで「読み取り」すると、ポジションキャプチャのところに #0=250 の表示がされました。この後、サーボは脱力になります。この読み取り値ですが、ここでは250に動かして250が読み取れてますが、計算上の量子化誤差(計算結果でちょうど四捨五入したときのズレとか)や、温度変化などで、指定した値と読み取り値が最大でプラスマイナス1誤差が出ることがあります。


■脱力になったサーボを手で動かしてみます。まったく通電してないときより少し重い感じがします。


■もう一度「読み取り」してみました。結果は #0=48 と値が変化しました。


このようにして教示機能を使うことができます。

尚、全サーボの位置を読み込む命令もありますが、この場合は結果返信され終わるまで待つか、1バイトづつ確認しながら読むかしないと、受信イベントが処理中にまた発生したりします。返信データが長い場合の対応は感圧センサーのページで解説してますのでそちらを参照願います。


おわりに

 VC#2005になったおかげで、このような感じで簡単にPCからシリアル通信で動く機器をコントロールすることができます。モーション作成ソフトを作ったり、PCからロボットをコントロールしてみてください。

 ビギナーの方は、ここまででとりあえず1個のサーボを動かすことができるようになったかと思います。複数の場合でも上記のプログラムを若干変更するだけで作れますので、是非トライしてみてください。


 また、浅草ギ研では、同じようにコントロールできるセンサやコントローラを順次リリースする予定があります。サーボコントロールだけでなく、センサーを使った高度なロボットも同様にして作れますのでこちらも是非お試しください。


2006年3月28日

 
(C)Copylight 2003. 有限会社浅草ギ研 | 通信販売の法規(訪問販売法第8条)に基づく通信販売業者の表示