2017年8月31日木曜日

RS304MDを動かしてみる。(2)


今回は前回「RS304MDを動かしてみる。」で動かしたサーボモーターがどのようなコマンドで動いているのかを探って行きたいと思います。


RS303MR/RS304MD取扱説明書を参考にして、コマンドを作るためのエッセンスを自分なりにまとめて見ました。
取扱説明書も見ながら読んで頂くとより一層わかりやすいと思います!




Ⅰ- 送るデータの種類


送るデータには大きく分けて二種類です。
  • ショートパケット1個のモーターに命令を送る時に用いる。
  • ロングパケット複数のモーターに命令を送る時に用いる。



Ⅱ- ショートパケットの構成


Ⅱ-Ⅰ パケット構成


ショートパケットの構成は以下のようになっています。
[Header]-[ID]-[Flag]-[Address]-[Length]-[Count]-[Data]-[Sum]



Ⅲ-Ⅱ 各パケットの説明


・Header:先頭を表す部分です。値は0xFA,0xAFの2byteです。

・ID:サーボモーターのIDを表す部分です。設定を変更していなければ0x01です。

・Flag:設定を書き込んだり、リターンパケットを要求する際に使う部分です。   
     モーターを動かす際は0x00にします。

・Address:メモリーマップ上の先頭アドレスを指示する部分です。      
       モーターを動かす際は0x1Eにします。

・Length:[DATA]のバイト数を表す部分です。                 
     角度のみを指定0x02角度と移動時間を指定0x04です。

・Count:サーボモーターの数を表す部分です。                 
      今回はショートパケットを使用するため値は0x01です。

・Data:[Address]で指定したメモリーマップに書き込むデータです。

・Sum:送信データ確認用チェックサムです。


DataSumの値はⅢにて記載します。





Ⅲ- DataとSumの値の決め方



Ⅲ-Ⅰ Dataの値


Dataの値には角度」もしくは「角度+移動時間」を入れます。


1. 角度のみ指定する場合

角度は-150~150度までを0.1度単位で決め、16進数で代入します。

例)-90度まで動かしたい → -900=0xFC7C → [0x7C  0xFC]
      120度まで動かしたい → 1200=0x4B0    →   [0xB0  0x04]


2byteで一つのデータは[Lowbyte Highbyte]の順になります。


2. 角度+移動時間を指定する場合

角度に関しては1の「角度のみ指定する場合」と同じです。

移動時間は0~163830msまでを10ms単位で決め、16進数で代入します。
ここで定まった数値を角度データの次にいれます。

例)-90度まで1秒で動かしたい → 100=0x64 → [0x7C  0xFC  0x64  0x00]
      120度まで3秒で動かしたい → 300=0x12C  → [0xB0  0x04  0x2C  0x01]



Ⅲ-Ⅰ Sumの値


Sumの値にはIDからDataまでを1byteずつXORした値が入ります。
いちいち手計算するのもあれなので、Arduinoに計算をやってもらいます。



このプログラムでは120度まで3秒で動かしたい時のSumを出しています。

使い方は、
1.HeaderからDataまでをそろえておきます。

 120度まで3秒で動かしたいときは
 [0xFA  0xAF  0x01  0x00  0x1E  0x04  0x01  0xB0  0x04  0x2C  0x01]
 となります。

2.これをSumCheck配列に入れます。

これだけです!ちなみにこのときSum0x83となるはずです。



ひとまずコマンドを作ることが出来ました。

次回は今回制作したコマンドを使って実際にモーターを動かしてみたいと思います!


0 件のコメント:

コメントを投稿