« RS30xPacketUtil 1.0.1公開 | トップページ | 「週刊 ロボゼロ」 第4号(2)補強フレームとフロントカバーの取り付け »

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

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

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

|

« RS30xPacketUtil 1.0.1公開 | トップページ | 「週刊 ロボゼロ」 第4号(2)補強フレームとフロントカバーの取り付け »

Arduino / Processing」カテゴリの記事

週刊 ロボゼロ」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/221673/51184410

この記事へのトラックバック一覧です: Arduinoでロボゼロのサーボを動かしてみよう!(5):

« RS30xPacketUtil 1.0.1公開 | トップページ | 「週刊 ロボゼロ」 第4号(2)補強フレームとフロントカバーの取り付け »