« 2011年2月 | トップページ | 2011年4月 »

2011年3月

Arduinoでロボゼロのサーボを動かしてみよう!(7)

「Arduinoでロボゼロのサーボを動かしてみよう!」の第7回は、前回の続きで、実際にリクエストを送信して、リータンを受け取ってみたいと思いますhappy01paper

oneNewSoftSerialライブラリーのインストール
これまでデジタルピンの1番を使ってサーボにデータを送信していましたが、パソコンとArduinoの通信(1)、および、Arduinoとサーボの通信(2)の両方を使えるようにする為に、

Arduinoデジタルピンの0,1番以外を使ってソフトウエア的にシリアル通信を行える様にする為のライブラリ=SoftwareSerialというのがありますが、このライブラリを使った場合の通信速度が9600bps程度です。
Arduinoscreensnapz004

そこでNewSoftSerialというライブラリーを使います。ここ(Arduiniana)からダウンロードできます。このライブラリーを使うと57600bps程度まで通信速度を使えます。
Safariscreensnapz004

インストール

  • 起動してたら、Arduinoのアプリケーションを終了
  • PreferencesのSketchbook locationに設定されたディレクトリーの中に「libraries」というフォルダを作る
    Arduinoscreensnapz005
  • NewSoftSerial???.zipを解凍
  • 解凍してできたNewSoftSerialのフォルダをlibrariesのフォルダに入れる
    Finderscreensnapz001
  • Arduinoのアプリケーションを起動
  • Sketch>Import Libraryの中にNewSoftSerialがあればインストール完了!
    Arduinoscreensnapz006

twoサーボの通信速度を38400bps(57600bps)以下に設定する
NewSoftModemが対応している通信速度にサーボの通信速度を変更します。

これに関しては「Arduinoでロボゼロのサーボを動かしてみよう!(4)」ですでに説明してありますので、そちらを参考に行って下さいhappy01paper

threeArduinoとRS306MDの配線
配線は前回の「Arduinoでロボゼロのサーボを動かしてみよう!(6)」に書いた配線にまりますhappy01paper
2

fourスケッチ
今回は、モデル番号、電圧、メモリーの30から41番の値を取得するサンプルを作ってみましたhappy01scissors

  • サーボとの通信はデジタルピン4(受信)、5(送信)としました
    NewSoftSerial ServoSerial(4, 5);
  • サーボとArduinoの通信速度は38400bpsで、Arduinoとパソコンの通信速度は115200bpsです。
      ServoSerial.begin(38400); //Arduino<-->Servoを38,400bpsに設定
     
    Serial.begin(115200); //PC<-->Arduinoを115,200bpsに設定
  • モデル番号、電圧、メモリーの30から41番のリクエストパケット
    • リクエストについては前回説明しましたので、そちらを参考にして下さい。
    • なお、RS30xPacketUtilを使って頂くと簡単にパケットが作れます。
  • パソコンからデータを受け取り、サーボへ送信
    スケッチでは、パソコンからA or B or Cのデータを受け取っると、サーボに対応したリクエストパケットを送信するようになっています。
     //リクエスト(送信)
      tx=
    Serial.available();//データ数
      if(tx>0) {
        switch(
    Serial.read()) {
          
    case 65://大文字A
       
     .....................
     
  • サーボからデータを受け取り、パソコンへ送信
    スケッチでは、サーボからデータを受け取ると、そのデータの数ぶん、ひとつづつパソコンへデータを送信するようになっています。
     //リターン(受信)
      rx=ServoSerial.
    available();//データ数
     
    if(rx>0) {
       
    digitalWrite(13,LOW);//LED消す
       
    for(int i=0;i<rx;i++) {
          
    Serial.print(ServoSerial.read(),HEX);
      .....................
          

以下がスケッチですpaper
//------------------------------

#include <NewSoftSerial.h>

NewSoftSerial ServoSerial(4, 5);// サーボとの通信に、4,5ピンを使用

byte modelnum[]={0xFA, 0xAF, 0x01, 0x0F, 0x00, 0x02, 0x00, 0x0C};
byte currVOLT[]={0xFA, 0xAF, 0x01, 0x0F, 0x34, 0x02, 0x00, 0x38};
byte mem30to41[]={0xFA, 0xAF, 0x01, 0x0B, 0x00, 0x00, 0x01, 0x0B};

void setup() {
  pinMode(
13,OUTPUT);//LED
  ServoSerial.
begin(38400); //Arduino<-->Servoを38,400bpsに設定
 
Serial.begin(115200); //PC<-->Arduinoを115,200bpsに設定
 
delay(1000);
}

void loop() {
 
int rx,tx;
 
//リターン(受信)
  rx=ServoSerial.
available();//データ数
 
if(rx>0) {
   
digitalWrite(13,LOW);//LED消す
   
for(int i=0;i<rx;i++) {
      
Serial.print(ServoSerial.read(),HEX);
      
Serial.print(",");
    }
   
Serial.print("\n");//改行
    ServoSerial.
flush();//受信データクリア
  }
 
 
//リクエスト(送信)
  tx=
Serial.available();//データ数
  if(tx>0) {
    switch(
Serial.read()) {
      
case 65://大文字A
       
digitalWrite(13,HIGH);//LED点灯
        send_msg(modelnum,
8);//モデル番号
       
break;
      
case 66://大文字B
       
digitalWrite(13,HIGH);//LED点灯
        send_msg(currVOLT,
8);//現在の電圧
       
break;
      
case 67://大文字C
       
digitalWrite(13,HIGH);//LED点灯
        send_msg(mem30to41,
8);//メモリーの30から41
       
break;
      
default:
       
for(int i=0;i<4;i++) {
         
digitalWrite(13,HIGH);
         
delay(200);
         
digitalWrite(13,LOW);
         
delay(200);
        }
       
break;
    }
   
Serial.flush();//受信データクリア
  }
}

// リクエストの送信
void send_msg(
byte msg[], int n) {
 
for(int i=0; i<n; i++){
    ServoSerial.
print(msg[i], BYTE);
  }   
}

//------------------------------

以上です。

five実践

  • スケッチをArduinoへ転送
  • 「Serial Monitor」ボタンをクリック
    Arduinoscreensnapz001
  • 通信速度が115200baudであることを確認
    Arduinoscreensnapz008
  • 「A」と入力し、「Send」ボタンをクリック。「B」も「C」も試してみて下さい。
    Arduinoscreensnapz009
  • 結果
    Arduinoscreensnapz010_2

結果の説明

  • モデル番号(1行目):40,30がデータです。リトルエンディアンなので、並び順を変えて、3040=RS304MDを意味します。RS306MDはRS304MDと同じ物なわけで、モデル番号は3040となっています。
  • 電圧(2行目):56,02がデータです。0256(16進数)=598(10進数)で、単位をボルトで表すなら100で割って、5.98Vとなります。
  • 30から41(3行目):0,0,0,0,0,64,0,0,0,0,0,0がデータです。ほとんどの値がゼロですが、指示位置(2バイト)、指示時間(2)、予備(1)、最大トルク(1)、トルクON/OFF(1)、予備(5)を意味してます。最大トルクが64(16進数)=100(10進数)で、最大トルク100%に設定されています。また、その次の値が0ということは、トルクがOFFということです。

sixプレゼントnotenotenote
前回の第6回で、書きましたが、今回のこのことを行う為に必要なICをプレゼント企画を行っています。こちらのブログ記事の下の方に応募方法などが書いてありますので、ご応募お待ちしておりますので、よろしくお願い致しますwinkpaper

----------------

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

「週刊 ロボゼロ」 第5号(1)背中にバックカバーを取り付ける

「週刊 ロボゼロ」 第5号は、第4号と一緒に3月13日に届きましたhappy01paper
Issue_5_1

第5号の組み立ては
「バックカバーを取り付ける」ですsign01
Ptdc0004

  • バックカバー
  • 右用サーボブラケット
  • 穴付きコの字ブラケット
  • M1.7x3mmネジ×6
  • サーボホーン
  • フリーホーン
  • M2x8mmタッピングネジ×1

20110313133621

パーツはいろいろありますが、組み立ては

  • 背中にバックカバーを取り付ける
     

だけですねconfident

バックカバーの中には、HSWB-4Fのコントロールボードが入ります。ここは将来的にも何度も取ったり付けたりするような場所だと思いますが、5つもネジがあるんですねbearing取り外しを簡単にするいい方法はないでしょうかね?
20110321195624

あと

  • (解説)ホーンやネジの種類
  • (解説)サーボモーターのケーブルの長さ

の解説がありましたねhappy01flair

で、サーボモーターのケーブルの長さについては、以前(ここで)、写真やDVDから何が何個か一生懸命数えてみたんですが、とりあえず当たりでしたねhappy01

20110321200659 20110321200649

それから、コントロールボードについて、ロボット・ラボで『ロボットの頭脳「コントロールボード」』解説がありましたhappy01

ロボゼロのコントロールボードはHSWB-4Fなんですが、JO-ZEROのHSWB-3Fの端子について違いを以前「HSWB-03Fと04Fの端子の違い」というタイトルで書きました。

で、第5号10ページの図
20110321195818
これは、HSWBと文字が入っていますが、これが本当に4Fなんでしょうか?
20110320014351

スタートアップDVDの組み立て説明に写っているコントロールボードは、HSWB-03Fと書かれてるので、明らかにこれは3Fですが、第5号10ページの写真が4Fである証拠はありませんよね。
20110223022527

さらに第5号10ページには、2つのCPUと書かれてますが、4Fも2つのCPUを搭載しているのしょうか?

あと、HSWB-4Fには、マイク端子と、赤外線LED接続端子は、付いてないとのことですが、第5号10ページの写真のボードには、マイク端子と、赤外線LED接続端子が付いているようです。

20110321224303

ちなみにHSWB-3Fのボードは、ここに写真があります。

HSWB-03Fと04Fの端子の違い」で書きましたが、HSWB-04Fのスペックは、週刊ロボゼロ創刊号特別付録スタートアップDVDや、ロボタイムズのロボゼロ紹介記事から

  • CPU R5F21368CNFP
  • マイクロSDカードスロット ×1
  • アナログ入力ポート ×1
  • デジタル入力ポート ×(4+7)
  • モード切替ディップスイッチ x4
  • スピーカー接続端子 ×1
  • 赤外線受信機 ×1
  • PC接続用RS232Cシリアルポート ×1
  • コマンド方式サーボ接続ポート ×24
  • 0.1度単位で角度指定

などが、予想できますが、第5号の解説ではまだ全容は明らかでない感じですねbearingというか名ばかりの4Fで、本当は3Fなんてことにはならないですよねsign02ちょっと気になります。。。

 

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

 

| | コメント (0) | トラックバック (0)

Arduinoでロボゼロのサーボを動かしてみよう!(6)

これまで「Arduinoでロボゼロのサーボを動かしてみよう!」では、

  • Arduinoからサーボ

にコマンドを送信して、サーボを動かしていましたが、今回は、

  • サーボからArduino

にデータを受信する方法についてです。

oneリクエストパケット
サーボからデータを受信する為には、リクエストパケット(という言葉はマニュアル的には使ってない)をサーボに送信すると、サーボからリクエストに応じたデータをリターンパケットとして送ってくる仕組みになっています。

●アドレスを指定してデータを得る場合のリクエストパケットは
FA AF AA 0F BB CC 00 DD

  • AA=サーボID
  • 0F=アドレスを指定してデータを得る場合のフラグ
  • BB=アドレス
  • CC=バイト数
  • DD=チェックサム

となります。例えば「現在位置」を知りたい場合のリクエストパケットは、現在位置のアドレスが0x2Aで、バイト数は2バイトなので、

  • FA AF 01 0F 2A 02 00 26

となります。

●アドレスの範囲を指定していっきにデータを得る場合のリクエストパケットは
FA AF AA BB 00 00 01 CC

  • AA=サーボID
  • BB=アドレスの範囲
    • 0x03=0から29バイト
    • 0x05=30から59
    • 0x07=20から29
    • 0x09=42から59
    • 0x0B=30から41
  • CC=チェックサム

となります。BBの値によって、メモリーアドレスの範囲が変わります。各アドレスの内容に関しては、双葉電子工業さんのRS303MR,RS304MDのマニュアルの25,26,33ページを見て下さい。また、RS30xPacketUtilを使うと簡単にパケットを生成できますhappy01paper

twoリターンパケット
リクエストに応じてサーボから返ってくるパケットをリターンパケットといいます。リターンパケットは送信のパケットと異なってヘッダーの値がFDDFと異なっているだけで基本構造は同じです。

  • ヘッダー2バイト=FDDF
  • サーボID
  • フラグ
  • サイズ=データのバイト数
  • カウント=1
  • データ=リクエストに応じたバイト数
  • チェックサム=サーボIDからデータまでのXOR

three半2重の為の回路
シリアル通信において、データの受送信の為に、送信用と受信用とそれぞれ1本づつ配線されている場合=全2重と言いますが、送信用と受信用が1本からなる場合=半2重と言います。

サーボには、シグナル用の線は1本しかないので、Arduinoとデータを受送信する為には半2重の回路を作る必要があります。

以下は、その写真と回路図です。

20110322022541

2
※図のTX/RXを修正(2011/4/2)

用意するもの

  • 第3号のバッテリーボックス
  • 抵抗1KΩ、100Ω
  • IC?????secret

※この回路はロボコンマガジン2010年11月号と、ここの写真を参考にしたものです。使っているICはロボコンマガジンに書いてあったので図では?????secretとさせて頂きました。申し訳ありませんが、?????secretが何か知りたい場合は、ロボコンマガジン2010年11月号を購入して下さいcoldsweats01

さて、実際に、この回路を使ってリクエストパケットを送って、リターンパケットを得るのは次回とさせて頂きますhappy01paper

※プレゼントnotenotenote
このIC?????secretを抽選で2名様にプレゼントしたいと思いますhappy01paper

  • 応募方法:このブログのコメントに「IC?????を希望」していることがわかるコメントを書いて下さい。また、メールアドレスの欄に必ずメールアドレス書いて下さい。メールアドレスが書いてない場合は抽選から外させて頂きます。
  • 応募期限:2011年3月31日
  • 当選発表:抽選の後、当選者にメールで当選の報告を致します。

ご応募お待ちしておりますwinkpaper

----------------

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (8) | トラックバック (0)

「週刊 ロボゼロ」 第4号(2)補強フレームとフロントカバーの取り付け

前回の続きsign01今回は「週刊 ロボゼロ」 第4号の残りの組み立てですhappy01

  1. ボディを補強フレームで補強
  2. 最後にフロントカバーを取り付け

ですsign01
補強フレームは、前後対象でないので、前後を間違えないように注意が必要ですねhappy01
20110321195548
次に、フロントカバーです。フロントカバーの中にはバッテリーが入るんですよね。バッテリーが届いてからでいいかなと思ったけど、バッテリーは第65号前後なので(ここに書いてあります)、ネジ締めておくことにしましたhappy01
20110321195611

以上で、第4号の組み立ては完了ですねgood

あと、少し、書くことがないので、ど〜でもいい小ネタですが、第4号のロボットラボに『ホビーロボットの骨格「フレーム」』として解説がありますが、それに関して。ではなく、そのページに人の膝関節の図がありますが、各名称書いておきましたcoldsweats01

20110321205548

簡単に説明

  • 大腿四頭筋:膝関節の伸展。
  • 大腿二頭筋:股関節の伸展。膝関節の屈曲。
  • 半腱様筋:股関節の伸展。膝関節の屈曲。
  • 半膜様筋:股関節の伸展。膝関節の屈曲。
  • 腓腹筋:ヒラメ筋とともに働く。歩行の際、踵を上げる。膝関節の屈曲。
  • ヒラメ筋:膝関節屈曲の補助。足の底屈
  • 膝蓋骨:人体の中で最も大きい種子骨。種子骨とは筋や腱の一部が骨化したもの。つまり膝蓋骨は大腿四頭筋の一部が骨化したもの。膝の屈曲の際、大腿四頭筋が傷つかない様に骨化することで保護している。
  • 膝蓋靭帯は:本来は大腿四頭筋の腱。膝蓋骨がある為、脛骨と膝蓋骨を繋ぐ靭帯となる。ちなみに「腱」は筋と骨を繋ぐ規則性緻密結合組織。「靭帯」は骨と骨を繋ぐ規則性緻密結合組織。ものは同じでも繋いでいるものの違いにより呼び名が変わる。

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

Arduinoでロボゼロのサーボを動かしてみよう!(5)

このシリーズも第5回になりましたねhappy01今回のArduinoでロボゼロのサーボを動かしてみよう!は「回転角度と回転速度を変えてみたい」と思いますhappy01paper

oneArduinoとRS306MDの配線
配線は第2回と同じですpaper

20110308144012_2

two回転角度と回転速度のパケット
回転角度(目標位置)のみを指定するパケットは、第2回で説明しましたが、角度は0.1度単位で整数値で指定するので、例えば123.4度の場合は1234になります。

回転速度と書きましたが、実は、回転速度は指定することはできません。目標位置までの移動時間として指定することしかできません。

その移動時間の単位は10msで、例えば、移動時間を0.3秒にしたい場合は、300ms/10=30となります。

で、目標角度移動時間のパケットは

  • FA AF AA 00 1E 04 01 BB BB CC CC DD

の12バイトです。

  • AA=サーボのID
  • 1E=目標角度のRAMのアドレス
  • 04=データは目標角度2バイトと移動時間2バイトの4バイト
  • BBBB=目標角度
  • CCCC=移動時間
  • DD=チェックサム

ちなみに、リトルエンディアンなので、2バイト以上のデータは順番が逆になります。
先ほどの123.4度と300msの値を例にパケットを作ってみると。

1234は、16進で04D2なので、リトルエンディアンの場合、D204になり、30は、16進で1Eなので、リトルエンディアンの場合、1E00になります。で、サーボIDが1の場合

  • FA AF 01 00 1E 04 01 D2 04 1E 00 D2

となります。チェックサムの計算が面倒ですが、RS30xPacketUtilを使って確認してみて下さいhappy01paper
20110322000147

threeスケッチ
さて、今回作るスケッチは、目標角度と移動時間にランダムな値を用いてランダムな角度、ランダムな速度で回転するようにしてみたいと思います。値がその都度変わる為、チェックサムの計算も必要になります。

  • 範囲を指定してランダムの値を得る為に(例)
    int deg=random(-1400,1400);
  • 角度や時間のバイトを入れ替える為に(例)
    rrs[7]=lowByte(deg);
    rrs[8]=highByte(deg);
  • チェックサムを計算する為に(例)
    void calcCheckSum(byte pkt[], byte n) {
      int sum = 0;
      for(int i=2; i<n-1; i++){
        sum = sum ^ pkt[i];
      }
      pkt[n-1]=sum;
    }

上記を利用して、以下のように作ってみましたhappy01paper

//-------------------------------
// Torque ON Packet
byte trqOn[] = {0xFA, 0xAF, 0x01, 0x00, 0x24, 0x01, 0x01, 0x01, 0x24};
// Random Rotate and Speed Packet
byte rrs[] = {0xFA, 0xAF, 0x01, 0x00, 0x1E, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};

void setup() {
 
//Serial.begin(115200);  // 通信速度15200bpsの場合
  Serial.begin(38400);        // 通信速度が38400bpsの場合
  delay(
500);
  Serial.
write(trqOn,9);
}

void loop() {
  randomRotateAndSpeed();
}

void randomRotateAndSpeed() {
  int deg=random(
-1400,1400);//-140度から140度のランダム
  rrs[
7]=lowByte(deg);//Little Endian
  rrs[
8]=highByte(deg);//Little Endian
  int spd=random(
0,100);//最速から1000msのランダム
  rrs[
9]=lowByte(spd);//Little Endian
  rrs[
10]=highByte(spd);//Little Endian
  calcCheckSum(rrs,
12);
  Serial.write(rrs,
12);
  delay(spd*
11);//移動時間の1.1倍待つ
}

void calcCheckSum(byte pkt[], byte n) {    // チェックサムの設定
  int sum =
0;
  for(int i=
2; i<n-1; i++){
    sum = sum ^ pkt[i];
  }
  pkt[n-
1]=sum;
}

//-------------------------------

さて、どうでしょう。いろんな角度に、いろんな速度で動きましたかsign02

----------------

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

RS30xPacketUtil 1.0.1公開

Arduinoでロボゼロのサーボを動かしてみよう!(3)」で公開したRS30xPacketUtilの新しいバージョン(ver1.0.1)を公開しましたhappy01paper

penRS30xPacketUtilは、ロボゼロのコマンド式サーボをコマンドでコントロールする際に必要となるパケットを簡単に作ることができるアプリケーションですhappy01paper

one更新内容good

  • リターン:ROM領域20〜29
    リターン:RAM領域30〜59
    リターン:RAM領域30〜41
    を追加
  • IntelMac版をCarbonアプリからCocoaアプリに変更

twoダウンロードcd
RS30xPacketUtilを以下のリンクをクリックするとダウンロードできます。ダウンロードしたファイルは圧縮されています。適当な所に解凍してお使い下さい。なお使い方の説明などは入っていません。各自の責任においてご使用下さい

three使い方flair
「例:-144度に動かす」

  1. Command:「目標位置」を選択
  2. 角度は0.1度単位なので-1440をDecに入力
  3. Hexボタンをクリック
  4. SInt16の値をDataにペースト
  5. 最下部の赤丸に-144度に動かす為のPacketが出来上がる

20110309014820

----------------

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

「週刊 ロボゼロ」 第4号(1)サーボモーターを胸の中に取り付け

「週刊 ロボゼロ」 第4号が3月13日に届きましたhappy01paper

Issue_4_1_2

第4号の組み立ては
「サーボを内部に取り付け、ボディを組み立てる」ですsign01
Ptdc0001

パーツは

  • ボディ内部フレーム
  • 左ボディ補強フレーム
  • 右ボディ補強フレーム
  • M1.7×23mmネジ×5
  • M1.7×3mmネジ×13

20110313133532

工程は

  1. サーボモーターを胸の中に取り付け
  2. ボディを補強フレームで補強
  3. 最後にフロントカバーを取り付け

の3つです。
今回は、1番目のサーボモーターを胸の中への取り付けをやりました

第3号で付いてきたサーボの四隅のネジを外し、サーボをボディ内部フレームに取り付けます。ボディ内部フレームはあらかじめネジ切りをして、ネジを締め易くしておいた方がいいと思います。
20110320034107 20110320034203

サーボのケーブルをボディ内部フレームの丸い方の穴に通して、サーボとフレームを重ねてM1.7x23のネジでフレームとサーボをとめます。
20110320034302

胸の中央部分に、回転軸が前方、サーボホンが下向きになるように入れて、前後から4カ所のネジを締めて固定します。この際、ケーブルをどこを通すか考えてしまいますが、バックフレームの大きな穴を通すと書いてあったので、サーボの右側の狭いスペースから通しました
20110320034420 20110320034501

さて、3月11日東北地方太平洋沖地震から1週間過ぎましたが、横浜でさえゴタゴタな1週間で大変だったんですが、被災地のみなさんはほんと想像絶するほど大変な1週間であったと思います。これからもまだまだしばらくは大変な状況が続くと思いますが、一日も早い復興をお祈りしています。

私は、3月11日は、電車が止まってしまった為、帰宅できず職場で泊まり、次の日、帰宅しました。自宅は倒れそうな家具類は防振ゲルが敷いてあるので倒れた物はなかったんですが、3畳程の私の部屋の中だけは、机の上に置いてあった物や本、そして床に積み上げてあったものなどが、ドバーっと、とんでもなくちらかってしまってましたbearing

で、ロボザック君も床に落ちてまして、サーボで首が回転できる様にしてあったんですが、首骨折crying
20110320014326
あと、写真ではちょっと見にくいかもしれませんが、ロボザックのMR-C3024に通信用のオーディオプラグが刺したままになっていたので、差し込み部分が基盤ごと割れてしまいましたcrying 直すのが大変そうsweat01
20110320014621

----------------

にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

Arduinoでロボゼロのサーボを動かしてみよう!(4)

今回のArduinoでロボゼロのサーボを動かしてみよう!第4回は「サーボの通信速度を変えてみたい」と思いますhappy01paper

oneArduinoとRS306MDの配線
配線は第2回と同じですpaper

20110308144012_2

two通信速度変更に必要なパケット
変更する速度は38400bpsとして話を進めます。

  1. 通信速度を38400bpsに変更する
  2. ROMに変更を書き込む
  3. サーボを再起動する

の3つです。
第3回で紹介したアプリを使うと簡単にそれらのパケットがわかります。
20110310020106

threeスケッチ
通信速度を変更、ROM書込み、再起動の3つのステップを行いますが、注意事項は、ROMへの書込みには時間がかかるため、1秒以上待ってから再起動を行う必要があります。今回は1.5秒にしてあります。

あと、一連の作業の終了したことがわかるように、LEDがピカピカするようにしてあります。

//-------------------------------------

// baudrate 38400
byte baud38400[] = {0xFA, 0xAF, 0x01, 0x00, 0x06, 0x01, 0x01, 0x04, 0x03};
// ROM Write

byte RomWrite[] = {0xFA, 0xAF, 0x01, 0x40, 0xFF, 0x00, 0x00, 0xBE};
// Servo Restart

byte ServoreStart[] = {0xFA, 0xAF, 0x01, 0x20, 0xFF, 0x00, 0x00, 0xDE};

void setup() {
 
pinMode(13,OUTPUT);
 
Serial.begin(115200); //115200bpsでポートを開く
 
delay(500); //0.5秒待つ
 
Serial.write(baud38400,9);//38400bpsに変更
 
Serial.write(RomWrite,8);//ROMに書込む
 
delay(1500);//重要!ROM書込み1秒以上待つ
 
Serial.write(ServoreStart,8);//再起動
}

void loop() {
delay(1000); //1秒待つ
  for(int i=0; i<5; i++) {  //完了の合図(ピカピカ)
   
digitalWrite(13,HIGH);//LED ON
   delay(200); //0.2秒
   
digitalWrite(13,LOW);//LED OFF
   
delay(200); //0.2秒
 }
}

//-------------------------------------

four通信速度38400bpsで機能するか調べる
第2回のスケッチのSerial.begin(115200);をSerial.begin(38400);に変更したファイルを作り、Arduinoへ転送。ちゃんと回転するか確認して下さい。

さて、ちゃんと回転してくれたでしょうかsign02happy01paper

five通信速度を戻す
38400bpsに変更した通信速度を、元の115200bpsに変更したい場合は、新規スケッチを作成し、上記スケッチをコピペして、Serial.begin(38400);からSerial.begin(115200);に変更したスケッチを動かせば元に戻せますhappy01paper

sixTips
通信速度変更後のROM書込みと再起動は、2つのステップに分けました。マニュアルには2つに分けろと書いてあるのでメーカーが推奨していない(保証外となるかも)方法ですが、2つのステップのフラグを立てて、1回のステップでもできてしまうようです。

//romwriterestart ロム書き込み+再起動
//推奨されないやり方なので、自己責任で行って下さい。

byte romwriterestart[] = {0xFA, 0xAF, 0x01, 0x60, 0xFF, 0x00, 0x00, 0x9E};

各自の責任において行って下さい。

----------------

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

あれこれい〜っぱいで幸せ〜

今日(9日)は誕生日でした。誕生日のメールとか、プレゼントとか、たまたま注文してたものが重なって届いて、今日はあれこれい〜っぱいで幸せで〜すhappy01heart04

箱根ビール3本heart04
20110309231228

バナナとバナナスタンドとチョッパーの縫いぐるみheart02
20110309231447 20110310212856

エレコムのWebカメラheart01
20110309231503

誕生日おめでとうメール
leccaマニア(leccaねえさんのファンクラブ)から、他数通happy01heart04
20110309234246

今日発売のleccaのミニアルバム「箱舟」cherry
20110309231855 

今日発売のleccaの2010年ライブツアーDVDslate
20110309232017

今日解禁となった春のニッセンCMソング
leccaのgiftの着うたをレコチョクでゲット!note
20110309234249

明日届くかと思ったら今日届いた
何故か入手した
Adobe Flash Pro CS5coldsweats01
20110309232158

今日ポチってしたら今日届いた
Flashで作るiOSアプリの本clock
20110309232222

| | コメント (0) | トラックバック (0)

Arduinoでロボゼロのサーボを動かしてみよう!(3)

前回、「コマンド方式のサーボテスタ」を作ってみましたが、サーボをコマンドで動かす為には、パケットというものを受送信します。

そのパケットには

  • ショートパケット:ひとつのサーボに対して送る場合
  • ロングパケット:複数のサーボに送る場合
  • リターンパケット:サーボから返信されてくるパケット

の3種類のタイプがあり、目的に合わせて、このパケットを作り、サーボに送信します。

今回は、
このパケット作成する「RS30xPacketUtil」という簡単なアプリを作ったので紹介したいと思いますhappy01paper(※各自の責任においてご利用下さい)

oneダウンロード
RS30xPacketUtilを以下のリンクをクリックするとダウンロードできます。ダウンロードしたファイルは圧縮されています。適当な所に解凍してお使い下さい。

twoパケットプリセット
Commandのポップアップメニューから以下のタイプのパケットのプリセットを選択できます。複数個のサーボを使う場合、IDの部位にあらかじめサーボのID番号をスペースを空けて16進数で入力して下さい。

●ショートorロングパケット:
目標位置,移動時間,最大トルク,トルクON,トルクOFF,トルクブレーキ,サーボIDを変更,回転方向(正),回転方向(逆),回転リミット,通信速度9600bps,通信速度14400bps,通信速度19200bps,通信速度28800bps,通信速度38400bps,通信速度57600bps,通信速度76800bps,通信速度115200bps,通信速度153600bps,通信速度230400bps,返信ディレイ時間,ROM書き込み,サーボを再起動,ROM書き込み+サーボを再起動,工場出荷時に戻す
●リターン用のショートパケット:
ROM領域,RAM領域,モデル番号,ファームバージョン,サーボID,リバース,通信速度,返信遅延時間,右リミット角,左リミット角,温度リミット,指示位置,指示時間,最大トルク,トルクON/OFF,現在位置,現在時間,現在スピード,現在負荷,現在温度,現在電圧

three使い方
「例:-144度に動かす」

  1. Command:「目標位置」を選択
  2. 角度は0.1度単位なので-1440をDecに入力
  3. Hexボタンをクリック
  4. SInt16の値をDataにペースト
  5. 最下部の赤丸に-144度に動かす為のPacketが出来上がる

20110309014820

fourRS306MDのモデル番号は
リターンに関してはまた別の機会に書きますが、リターンを取得できるように配線とプログラムすると、サーボの情報をいろいろ取得することができるようになります。

それで、RS306MDのモデル番号を見てみたら、以下の図の結果でした。
Arduinoscreensnapz001

これは、FDDF 1 0 0 2 1 40 30 72で、40 30がデータで、RS306MDのモデル番号はRS306MDでなく、RS304MDを示していましたdash [追記]:これはRS306MDとRS304MDのファームは同じものであるため、モデル番号が同じになるようです。

----------------

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

Arduinoでロボゼロのサーボを動かしてみよう!(2)

ロボゼロ第2号に付いてきたサーボテスターはPWM方式であることから、Arduinoでロボゼロのテスターを作ってみよう!ということであれこれやっていますが、

前回

というタイトルで、Arduinoを使ってPWM方式でロボゼロのサーボを動かしてみましたが、

今回
から

  • 第2回:Arduinoでロボゼロのサーボを動かしてみよう!

というタイトルに変更して、何回かに分けて書きたいと思います。

今回の目的は、第2号に付いてきたサーボテスターと同じ挙動を示す「コマンド方式のサーボテスター」をArduinoで作る!ですhappy01paper※自己責任において行って下さい。

用意するもの

  • RS306MD(壊しても後悔しないもの):ロボゼロ第3号1990円
  • Arduino(壊しても後悔しないもの):2000円〜3000円いろんな物がある
  • Arduinoと繋ぐUSBケーブル
  • ArduinoとRS306MDを繋ぐジャンパワイヤ
  • Arduino IDE

RS306MDのコマンド方式について

one特徴

  • PWM方式とコマンド方式に対応し、自動的に切り替わる
  • コマンド方式により、双方向通信が可能で、サーボの状況のフィードバックが得られる。

two通信

  • レート:115200bps(工場出荷) 9600, 14400, 19200, 28800, 38400, 57600, 76800, 115200, 153600, 230400bpsに対応
  • データビット:8bit
  • パリティ:なし
  • ストップビット:1bit
  • フロー制御:なし
  • 通信プロトコル:非同期半二重

threeパケットの種類

  • ショートパケット:ひとつのサーボに対して送る場合
  • ロングパケット:複数のサーボに送る場合
  • リターンパケット:サーボから返信されてくるパケット

fourショートパケットの構成

  • Header(2byte): 0xFAAF
  • ID(1):サーボのID サーボに割り振った1〜127のID番号 ※工場出荷時のIDは1、※255で全IDのサーボ
  • Flag(1):bit6:ROMへの書き込み,bit5:サーボの再起動,bit4:工場出荷時に,bit3-0:リターンパケットのアドレス指定
  • Address(1):サーボのメモリーのアドレス
  • Length(1):Dataのバイト数
  • Count(1):サーボの数
  • Data(可変):送信するデータ(メモリーに書き込むデータ)
  • Sum(1):チェックサム(=誤り検出)。IDからDataまでをXORした値

Arduinoのシリアル通信について

oneシリアル通信
ArduinoボードはSerialという名前で参照される1組のシリアルポート(RXとTX)を持っています(デジタルポートの0と1番)。その通信速度は、300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200bpsが使えます。

twoSoftSerial/NewSoftSerialの通信
デジタルポートの0と1番は、コンピュータとのデータの通信に(も)使われているポートである為、このポートを使うことがふさわしくない場合もあります。このような場合は、SoftSerialまたはNewSoftSerialというライブラリーを使うことで0と1番以外のポートが使えるようになり、0と1番をコンピュータとのやりとりに使えるようになります。しかし、SoftSerialの通信速度は9600bps程度、NewSoftSerialの速度は57600bps程度である為、ロボゼロのRS306MDの場合、初期値の115200bpsを変更しなくてはいけなくなります。これに関しては次回以降に書きたいと思います。

ArduinoとRS306MDを繋げる
ジャンパワイヤで以下の図の用に配線して下さい。

20110308144012_2

Arduinoのスケッチ(プログラミング)
Arduinoの基本的な使い方については他のサイトなどにお任せするとして、コマンド方式で動かす為には、サーボのトルクをオンにして、目標の回転角度を設定することによって動かすことができます。先に述べた「ショートパケットの構成」に従って、それぞれのパケットを作ります。

oneトルクON/OFF(RAM=24H)
ON=01H/OFF=00H
FAAF 01 00 24 01 01 01 24

two目標の角度へサーボを動かす(RAM=1EH)
単位=0.1度
例123度→1230→04CEH
FAAF 01 00 1E 02 01 CE 04 D6

threeスケッチ(-144〜144度の回転を繰り返す)

//-------------------------------------

//トルクON
byte trqOn[] = {0xFA, 0xAF, 0x01, 0x00, 0x24, 0x01, 0x01, 0x01, 0x24};
//時計回り144度
byte cw144[] = {0xFA, 0xAF, 0x01, 0x00, 0x1E, 0x02, 0x01, 0xA0, 0x05, 0xB9};
//反時計回り144度
byte ccw144[] = {0xFA, 0xAF, 0x01, 0x00, 0x1E, 0x02, 0x01, 0x60, 0xFA, 0x86};

void setup() {
 
Serial.begin(115200); //115200bpsでポートを開く
 
delay(500); //0.5秒待つ
 
Serial.write(trqOn,9); //トルクON
}

void loop() {
 
delay(2000); //2秒待つ
 Serial.write(cw144,10); //144度まで回転
 delay(2000); //2秒待つ
 Serial.write(ccw144,10); //-144度まで回転
}

//-------------------------------------

fourスケッチをArduinoにアップロード
上記スケッチをArduino IDEにコピペし、Arduinoにアップロードします。

さて、ちゃんと回転してくれたでしょうかsign02happy01paper

----------------

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (0) | トラックバック (0)

「週刊 ロボゼロ」 第2号(3)ボディフレーム取付け&小ネタ集(4)

第2号の組み立ては
「スピーカーとボディフレームを取り付ける」ですが、スピーカーはのちのち後回しということにして、ボディフレーム取付けだけ行いましたhappy01paper

作業は、前側の胸の赤いフレーム、ネジ4本と、背中側の黒いフレーム、ネジ4本を締めるだけです
20110306014822 20110306014810

創刊号のフェイス/フェイスガードと、チェスト・ブラケットを合わせてみましたhappy01
20110306014818

さて、組み立てはこれだけなので、恒例sign02の小ネタですpaper

oneサーボのケーブルの長さとは?
第3号に付いてきたサーボですが、RS306MD-DCでした。最後がDCなので150mmのケーブルとなりますが、実際に計ってみると120-125mm程度の長さしかありませんが、実は、ケーブルの長さとは、サーボの中に隠れている部分、およびコネクタ部分を含めた長さを含めた長さになるので、実際に見えている部分のケーブルを示しているのではないので注意が必要ですねpaper
20110306020715

twoロボザックの時、いくらくらい使ったのか?
ロボザックの時、予備の為に同じ号を何個か買いましたが、本屋で買った物は記録にないですが、Fujisanで買ったものは記録に残ってるので、だいたいなんですが、いくらくらい使ったのか計算してみました

定期購読
Numbersscreensnapz007

買い足し
Numbersscreensnapz008

両方合わせて=228,280円sign01なんだかんだで結構掛かりますねsweat01果たしてロボゼロでは合計いくら使うことになるんでしょうかね??

three予備はまんべんなく
ロボゼロ第3号は、サーボだったので予備として一冊買いました。が、3号はサーボとバッテリーボックスでしたね。ロボザックの頃から合わせてバッテリーボックスが4つになってしまいましたsweat01以前書いたようにロボゼロで使われるサーボは

  • DC: 6個
  • DF: 14個
  • DH: 4個

です。どの長さを何個づつ揃えるかも考えなければいけないですが、予備を買うにしても同じ号ばっかりでなく、サーボとどんなパーツが付いてるかも考えて、まんべんなく揃えたいですねhappy01

 

20110303011755 20110303011810

four胸のロゴ
以前、胸のロゴを自作したい話を書きましたが、ロボゼロの画像に合成して遊んでみました。漢字はいまいち似合わない感じ??happy01

M My

Photo Photo_2

fiveロボゼロ3Dデータ
誰かロボゼロの3次元データ作ってたりしますかsign02ロボザックの時は、ある方から貰った3D画像でモーションを作成できるようなアプリを作ったんですが(下のムービー)、ロボゼロの3Dデータ手に入らないかなぁ〜ま、手に入ったからといって作れるかどうかわからないけどsweat01ちょこちょこと自分で作ってますが、やったことがないことなので、やっとサーボとホイールホーン作れた程度だsweat01いつ出来上がることやらsweat01
Rs306md_image2
----------------

----------------

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (3) | トラックバック (0)

「週刊 ロボゼロ」 第3号(3)Arduinoでサーボのテスト(PWM)

第3号の作業は、

  1. サーボホーンの取り付け
  2. テストボードによるサーボのチェック

ですが、先日、2のサーボのテスト

を行ったので、今日は「サーボホーンの取り付け」をしましたhappy01
20110302235934

ネジはまだ締めてませんが、第3号の組み立てはこれで終わりですhappy01

さて、話はテストボードの話に戻りまして、RS306MDは、コマンド式とPWM式の2種類の通信方式に対応しており、ロボゼロのコントロールボードのHSWB-03F/04Fもコマンド式の通信方式を用いて制御していようですが、

  • ロボゼロ第2号に付いてきたテストボードでは、PWM方式でのテストしかできませんsign01

ので、コマンド式のテストを行えるものをArduinoで作れないかなぁ?と思ったら、

が参考になると教えて頂きましたので早速、

  • Fujisan.co.jpで注文happy01scissors

しましたが、まだ届いていませんbearing

いちおう、

  • Arduinoのサンプルスケッチは上記リンクからダウンロードできるので、
    • それを参考に、サーボテストのスケッチを作成中〜sign01
  • コマンドに関しては、双葉電子工業のRS304MDの取り扱い説明書に書かれてるので、
    • 一通り、読んでとりあえず理解したぞsign01
  • 仕事が入ってて行けなかったMake06で出てたんですね。
    • ここの写真を一生懸命拡大すると、単にArduinoだけでなく、TTLのレベル変換?RS485に変換してる?あと半2重にしてる?ま、何かやっているようだ。兎に角、よく判らないので、本が届くまで待つしかなさそうだ

ちなみに、商品になってるものは

  • RPU-10
    コマンド方式サーボ用小型軽量制御ユニット
    15750円もするのねsweat01
    Futaba_rpu10_w150
  • RSC-U485
    USB-RS485変換器
    8400円

があります。

ま、兎に角、ロボコンマガジン2010年11月号が届くまで、コマンド方式のテストボードは作れそうにないので、

まずは、ArduinoでPWM用テストボードを作ってみましたhappy01paper

といっても、何も苦労せず、ここ、そのまんまで動かせましたsweat01
配線の図だけは書きましたが、説明やスケッチに関しては、ここで、見て下さい。

20110302235034

とりあえず、iPhoneでムービーとって見ましたhappy01

------------------------------

------------------------------

Arduino簡単にあれこれできていいですねheart04
早く本届かないかな〜happy01

----------------

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

| | コメント (4) | トラックバック (0)

ROCKIN'ON JAPAN (ロッキング・オン・ジャパン) 2011年 04月号

ROCKIN'ON JAPAN (ロッキング・オン・ジャパン) 2011年 04月号
2011年2月28日発売

leccaねえさんインタビューが載ってるっていうんでゲット!届きましたhappy01
写真可愛いでね〜の

| | コメント (0) | トラックバック (0)

« 2011年2月 | トップページ | 2011年4月 »