2011/12/06(火)DSO Nano v2が壊れたのでテキトー修理

2011/12/06 06:21 電子工作importnucho
フィジカルコンピューティング関連でアンテナを張っている方はご存知かもしれませんが、DSO Nano v2というちっちゃいオシロスコープがあります。
ちゃんとした計測器として使えるかどうかはさておいて、ちょっとした波形をみてキャプチャしたり、ちょっとしたPWMを出力したりなどと出来るため、そこそこ便利に使っていました。

しかしこのたび「うぇーいうぇーいアババ」とそこらのバカ学生顔負けの使い方をしていたらショートさせてしまい、PCと繋いでも認識されずに通信ができなくなってしまいました。
一応修理を行ったので、そのことを記録しておきます。もしも同じような壊し方をした人がいらっしゃれば参考に…。

修理

とりあえず分解してみると、
RIMG0547
のようにL2とL3が焦げていました。

回路図を確認するとこれらはフェライトビーズのようです。
フェライトビーズとはノイズをカットするための部品で、直流成分に対しては0.数Ωなのに対して100MHzには数百Ωになったりする偉いやつです。

しかしフェライトビーズが手元になかったので、「まぁノイズカットはなくても大丈夫っちゃ大丈夫だろ…大丈夫だよな…」と
RIMG0550
このようにジャンパしたら無事に?PCから認識されて通信が可能になりました。やってみるものですね。まぁ壊すときも同じような流れだったんですけど。

問題なくファームの更新なども行えることを確認しましたが、このままでは良い子も悪い子もあんまり真似しない方がいい状態かと思います。
フェライトビーズを置き換えれば完全に大丈夫なのでしょうが、どの値を付ければいいのかちょっとよくわかりません。サイズがおんなじこのあたりを使えば良いのかな。。

参考

DSO nano V2の回路図

2011/10/25(火)rosserial_arduino使い方メモ

2011/10/25 12:11 ROSnucho
rosserial arduinoの使い方メモです.ソースべたべたの真っ茶色の記事です.
ArduinoはDuemilanoveを使用しました.Japaninoだとうまく受信できなかったりしたので,クロックが16Mhzのものじゃないと駄目なのかも

Publisher,Subscriber

まずは基本的なPublisher,Subscriberの使い方から.
#include <ros.h>
#include <std_msgs/Int32MultiArray.h>
void messageCb( const std_msgs::Int32MultiArray& msg);

ros::NodeHandle nh;
std_msgs::Int32MultiArray array_msg;
ros::Subscriber<std_msgs::Int32MultiArray> s("array_sub", &messageCb);
ros::Publisher p("array_pub", &array_msg);

void messageCb( const std_msgs::Int32MultiArray& msg){
  array_msg = msg;
}

void setup()
{
  array_msg.data_length = 3;
  array_msg.data = (int32_t *)malloc(sizeof(int32_t)*3);
  array_msg.data[0] = 0;
  array_msg.data[1] = 0;
  array_msg.data[2] = 0;

  nh.initNode();
  nh.advertise(p);
  nh.subscribe(s);
}

void loop()
{
  p.publish(&array_msg);
  nh.spinOnce();
  delay(10);
}
というスケッチをArduinoに書き込み,PCのコンソールから

$ rosrun rosserial_python serial_node.py /dev/ttyUSB0
としてクライアントを起動させた後
$ rostopic pub array_sub std_msgs/Int32MultiArray [[['a',3,1]],0] [123,456,789]
publishing and latching message. Press ctrl-C to terminate
$ rostopiecho array_publayout: 
  dim: 
    - 
      label: 4
      size: 3
      stride: 1
  data_offset: 0
data: [123, 456, 789]
---
というようにして,Publishした値がちゃんと受け取られていることが確認できます.

ServiceServer

2011/12/6追記
change set 167あたりのサンプルプログラムに使い方が載っていました。
この記事を書いていた時点ではまだちゃんと実装されてなかったんですね。。。

次にServiceServerの使い方.こちらは実はよくわかってません.
#include <ros.h>
#include <std_msgs/Empty.h>
void myservice(const std_msgs::Empty& req, std_msgs::Empty& res );

ros::NodeHandle nh;
 
void myservice(const std_msgs::Empty& req, std_msgs::Empty& res ) {
}

ros::ServiceServer<std_msgs::Empty,std_msgs::Empty> service("service", &myservice);

void setup()
{
  nh.initNode();
  nh.advertiseService(service);
}

void loop()
{
  nh.spinOnce();
  delay(10);
}
このスケッチを書き込み,クライアントを起動させると期待していたServiceServerではなくSubscriverとして認識されます.
そして
$rostopic pub service std_msgs/Empty 
というようにPublishするとmyservice関数の中に入った後,resをPublishしてくれているようです.
どうやってresを受け取るのかはわかりません...

Parameter

次に便利なパラメータの使い方に関して.
#include <ros.h>
#include <std_msgs/Float32MultiArray.h>

ros::NodeHandle  nh;

std_msgs::Float32MultiArray data_msg;
ros::Publisher data_pub("data_pub", &data_msg);

void setup()
{
  nh.initNode();
  nh.advertise(data_pub);
  
  data_msg.data_length = 3;
  data_msg.data=(float*)malloc(sizeof(float)*3);

  while(!nh.connected()) {
    nh.spinOnce();
    delay(10);
  }

  if (!nh.getParam("param_test", data_msg.data,3)){ 
    //default values
    data_msg.data[0]=0;
    data_msg.data[1]=0;
    data_msg.data[2]=0; 
  }
}

void loop()
{
  data_pub.publish( &data_msg );
  nh.spinOnce();
  delay(10);
}
このスケッチを書き込んだら,クライアントを起動する前に,
$rosparam set param_test [1.23,4.56,7.89]
というようにあらかじめパラメータをセットしておきます.
試しているバージョン(changeset 143)の段階ではパラメータをセットしておかないとエラーでクライアントが落ちるので注意してください.
クライアントを起動したら
$ rostopic echo data_pub
layout: 
  dim: []
  data_offset: 0
data: [1.2300000190734863, 4.559999942779541, 7.8899998664855957]
---
というようにパラメータがセットできていることが確認できます.

ちなみに

mbedに移植したものでも同じように使うことができます.
mbedの場合だと
main()
{
  //setup()部分をここに
  while(1){
    //loop()部分をここに
  }
}
みたいな感じでちょっとの修正(delay()をwait_ms()にするとか)でそのまま使えます.便利!

2011/09/06(火)RSC-U485のまがい物をつくる

2011/09/06 03:01 電子工作importnucho
RSC-U485がubuntuで認識されなかったため、FT232RLとLTC485CN8でまがいものを作った記録です。

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

回路

rsu405_modoki
FT232RLはデフォルトだとCBUS2がTXDENとして機能しているそうなので、CBUS2をREとDEに接続することでRS485通信を行えます。

見た目

RIMG0038
秋月のFT232RLモジュールの下にLTC485CN8が置いてあります。
ついでにハブとしての回路も持たせてみてます。ちょっとスイッチが小さいのが心配ですが。。

これで一応WindowsでもLinuxからでもRS405CBが制御できるようになりました。

パクリ元

FT232RLでRS-485通信(爪車さん)

2011/09/04(日)ArduinoでRS485通信をしてみる

2011/09/04 15:36 Arduinoimportnucho
知り合いの人から「マイコンからRS485通信がしたいぜうぎぎ」と要望があったのが発端となり、LTC485CN8とArduinoでRS405CBを動かしてみたレポートです.

LTC485CN8を使ってみる

回路図

LTC485CN8_test

説明

LTC485CN8はDE,RE端子の状態によって送信、受信のモードを切り替えて使います。
つまりマイコンは,DE,REに直結した端子をHIGHにしてから送信、LOWにしてから受信というように処理を行えばいいわけですね。
あとはまぁ別に普通のシリアル通信です。

余談となってしまうんですが,RS405CBの設定で返信ディレイ時間が用意されている理由は、送受信の切り替えに時間がかかるマイコンを使ったときに調整するためなのかなぁと思ってます。
RS405CBはFutabaのロボット用サーボの開発成果を全て盛り込んだという触れ込みだけあって、色々気が使われてる印象がありますね。

プログラムはちょっと長いので続きを読むに置いときました。

参考という名のパクリ元

RS-485の接続(爪車さん)
FT232RLでRS-485通信(爪車さん)
爪車さんはシミュレータを使いこなしつつ二足歩行ロボをやってらっしゃる凄い方です。

続きを読む

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
で認識しました.

資料

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