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となるはずです。



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

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


2017年8月30日水曜日

RS304MDを動かしてみる。

モーターはまずなんでもいいから動かしてみることが大事ですよね(笑)
ということで、RS304MDを深く考えずに動かしてみましょう!

今回はFutabaのホームページから下記の場所にアクセスするとサンプルプログラムがあるので、それを使用して動かしてみたいと思います。
ホーム>ロボット・無人機用機能部品>システム構成/接続例
ここにリンクしておきます。)

接続方法

今回私はRS304MDとArduinoの接続を下の回路図のようにしました。
(ブレットボート図では電源を5V出力のACアダプタから供給している例を示しています。)




モーターの電源はArduinoの5V端子から供給するのではなく、別の電源から供給することをお薦めします(Arduinoの5V端子から供給する方法でも実際に稼働しますが、ArduinoやArduinoに電力を供給するUSBポートを壊す恐れがあります。
※Futabaさんの接続例ではRXが接続されていますが、今回のプログラムでは使わないため接続してもしなくても問題ありません。

プログラム

謎のPDF仕様のサンプルプログラムをArduinoIDEに貼り付けマイコンボードに書き込み!!
・・・・あれ・・・・動かないぞ??(・・?
まあサンプルは大抵動かないですよね(笑)


原因はサンプルプログラムの66行目にあり、この行にある配列数を10から12にするだけで治ります。

unsigned char TxData[10];
から↓
unsigned char TxData[12];
にするだけです。

動かない原因

サンプルプログラムで動かなかった原因を私なりに考察したものです。
簡単な内容なので、読み飛ばした方がいいかもです(笑)

サンプルプログラムの66行目では、

unsigned char TxData[10]; //送信データバッファ [10byte]

と書かれており、配列が10byteまでの領域を割り当てています。
しかし、実際のサンプルプログラムの85行目では

TxData[11] = CheckSum; //Sum

となっており、必要な配列数は12byteとなっています。
したがって、TxData[10] 、TxData[11] 文の領域が割り当てがないためプログラムが正常に機能していなかったものと思われます。

終わりに

きちんと動いたでしょうか?
次回は送るコマンドを意識してモーターを動かしていきたいと思います!