2011/08/28(日)PCからRS405CB/RS406CBを制御する

2011/08/28 13:08 Programimportnucho
RS405CBRS406CBはfutabaから発売されているシリアルサーボです.
いろんなパラメータがあって安全装置も入っているこの素敵サーボをJavaとPythonで制御するライブラリを書いたので,サーボの使い方と一緒に置いておきます.

配線

RS405CB
RS405CB/RS406CB取扱説明書より
数珠繋ぎは6つまでということに注意です.

サーボにIDを振る

このサーボはサーボ同士を繋げていって一本の配線で6つのサーボまでを制御することができます.
そのためにはそれぞれのサーボにIDを付けてあげなければいけないので,その作業を行います.

まずはこちらのサンプルプログラムからVB版をダウンロードします.
ソフトを起動して,電池や安定化電源の電源を入れた後,以下の手順を実行します.
RS405CB_VB1
  1. RSC-U485のささっているポートを選ぶ(コントロールパネル>システム>デバイスマネージャで確認できる)
  2. 画像2のボタンを押す(自動で設定が読み込まれるはず)
  3. 適当なサーボIDを選択し,setボタンを押す
  4. 画像4のボタンを押し,書き込みが終了した旨のメッセージを待つ
以上です.
設定やパラメータなどもここから弄れます.

プログラム

試したい盛りでgithubなんぞ使ってますが,いまひとつ操作に慣れてない感じですね.
RSC_U485_Java
RSC_U485_Python

あらかじめ,Java版の場合はrxtxを,Python版の場合はpyserialをインストールして置いてください.
クラスの使い方はコードに入ってるドキュメントを見れば大体わかると信じてます.
Java版だとこういった感じで使用します.
	public static void main(String[] args) {
		RSC_U485 servo = new RSC_U485("COM17", 115200);

		System.out.println("ID1のサーボのトルクをオン");
		servo.torque(1, true);

		System.out.println("最高速度で100度の位置へ回転");
		servo.move(1, 1000, 0);
		try {
			Thread.sleep(500);//しばし待つ
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("現在角度:"+servo.getAngle(1));
		
		System.out.println("1秒かけて0度の位置へ");
		servo.move(1, 0, 100);
		
		try {
			Thread.sleep(1000);//しばし待つ
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("現在角度:"+servo.getAngle(1));
		
	}
ちなみにJavaとPythonで書いたのはWindowsからもUbuntuからも制御したかったのが理由なのですが,RSC-U485がLinuxで認識せずしょんぼりです.
FT232RLとLTC485CN8で同等っぽいのが作れるみたいなので作らないとなぁ….

UbuntuでRSC-U485を認識させる

2012/1/13追記
この記事のコメントで,以下のようにすることでUbuntuでもRSC-U485が認識することをまえださんから教えていただきました.
ありがとうございます!
Ubuntu 9.10 では RS-U485 を
# modprobe ftdi_sio vendor=0x1115 product=0x0008
で認識しました.

資料

説明書
サンプルプログラム

2011/08/01(月)Javaでシリアルポートの詳細な名前取得

2011/08/01 19:29 Program::Javanucho
Java上でシリアルポートに接続された任意のデバイスのポート名を取得して,自動で接続するということがしたかった時のメモ.
システムの色んな情報を受け取れるらしいWMIをJavaにラップしているjWMIをeclipseで使う,という話です.

使用手順

  1. パッケージエクスプローラ上の任意のJavaプロジェクトを右クリック
  2. 「新規>パッケージ」を選択
  3. 名前に「com.citumpe.ctpTools」と入力
  4. ここからダウンロードしてきたフォルダの中の「jWMI.java」をさっき作ったパッケージの中に放り込む
  5. 何か341行目が化けてるので「OSRecoveryConfiguracion」みたいな感じで直す
あとはプログラムの頭で
import com.citumpe.ctpTools.jWMI;
とインポートし,
try {
	// COMポートの詳細な名前を教えてもらう
	String name = jWMI.getWMIValue(
			"Select Caption from Win32_SerialPort", "Caption");
	System.out.println(name);
	} catch (Exception e) {
	// TODO 自動生成された catch ブロック
	e.printStackTrace();
}
という風に使ったら,
通信ポート (COM1)
Silicon Labs CP210x USB to UART Bridge (COM33)
URG Series USB Device Driver (COM31)
てな感じで返ってきた…んですけど,モノによって出てこないものがあります.
確認しているものだとmbed(mbed Serial Port)とft232シリアル変換IC(USB Serial Port)は取得できなかったです.何故だ….

2011/8/26追記

name = jWMI.getWMIValue("Select Caption from Win32_PnPEntity", "Caption");
としたら,今まででてこなかったものも表示されました.
必要ない情報も多くなってしまいますけれど.

参考

シリアルポートの名前取得