はじめに
九州工業大学ロボットサークルRoDEPのyamatoです。
去年のROXで使ったddsm115を回すのにちょっとつまづいたので、動かし方をメモしておきます。
まだ作りかけですが以下のプログラムで動かせます。
rodep-soft/ddsm115_ros2_driver
前提
- DDSM Driver HAT (A) あり
- ROS 2 kilted
- M1 Mac(Ubuntuでも動きました)
繋ぎ方
DDSM Driver HAT (A)を使った動かし方には二つあるようです。
- DDSM Driver HAT (A) 内のESP32とJSONを介して通信する
- DDSM Driver HAT (A) 内のESP32を介さずに、モーターと直接バイナリデータをやり取りする
今回は遅延などを考慮し、後者で動かします。
大事なのは「USBはDDSMの方に刺す」こと、「ESP32/USBスイッチはUSBの方にする」ことです。USBがESP32-USBの方だったり、スイッチがESP32の方になってしまうとバイナリによる通信が行えなくなってしまいます。
USBでPCとDDSM Driver HAT (A) が繋がっていること、DDSM Driver HAT (A) とDDSM115が繋がっていること、XT端子に18Vが入力されていることを確認してください。
motor IDの設定
モーター本体にIDが保存されるタイプのモーターですので、各モーターに重複しない番号を割り当てる必要があります。
DDSM Driver HAT (A) とDDSM115を「一つだけ」接続し、
[0xAA, 0x55, 0x53, [ID], 0x00, 0x00, 0x00, 0x00, 0x00, [CRC-8/MAXIM]] を
「5回」送信します。
(※公式ドキュメントには、10番目は0x00を送るとの記述がありますが、そのすぐ上のサンプルコードではCRCの計算結果を送信しているのでよく分かりません)
上記の ddsm115_ros2_driver をビルドしているなら、以下のコマンドで /dev/ttyUSB0 に繋がっているモーターに ID: 1 を設定できます。
ros2 run ddsm115_ros2_driver set_motor_id.py --ros-args -p serial_port:="/dev/ttyUSB0" -p id:=1
回し方
モーターの制御方法には3つあります。
- 電流制御(
0x01) - 速度制御(
0x02) - 位置制御(
0x03)
まずは [[ID], 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, [mode]] を送信してモードを設定します。
各モードを設定した後、実際にモーターを駆動するためのコマンドを送信します。フォーマットは基本的に以下の10バイトです。
[[ID], 0x64, [Data_H], [Data_L], 0x00, 0x00, 0x00, [Brake_Flag], 0x00, [CRC-8/MAXIM]]
-
電流制御:
-8A 〜 8Aの範囲を-32767 〜 32767の16ビット整数にマッピングします。 -
速度制御:
-330rpm 〜 330rpmの目標回転数をそのまま16ビット整数として送信します。8バイト目にブレーキフラグ(フリー or ロック)を設定できます。 -
位置制御:
0° 〜 360°の範囲を-32767 〜 32767の16ビット整数にマッピングします。
フィードバックの受け取り方
モーターにコマンドを送信すると、モーターの現在の状態(速度や位置、電流など)が10バイトのパケットとして返ってきます。
受信パケットの構造は以下のようになっています。
[[ID], [Mode], [Current_H], [Current_L], [Velocity_H], [Velocity_L], [Position_H], [Position_L], [Error], [CRC]]
先ほどのマッピングの逆を行えば値が取得できます。電流制御であれば、-32767 〜 32767 を -8A 〜 8A にマッピングします。
ddsm115_ros2_driverで回す場合
作成したパッケージを使えば、ROS 2のTopicを使って簡単に回せるようになっています。modeの変更コマンドも自動的に送信されます。
1. 起動
motor_ids を配列で渡すことで、複数IDのトピックを同時に生成できます。
ros2 run ddsm115_ros2_driver ddsm115_driver_node --ros-args -p motor_ids:="[1, 2]" -p serial_port:="/dev/ttyUSB0"
2. 送信
TopicをPublishして指令を出します。以下はID:1のモーターを100 RPMで回転させる例です。
ros2 topic pub --once /motor_1/command ddsm115_ros2_driver/msg/Ddsm115Command "{mode: 2, value: 100.0, brake_mode: 0}"
3. 受信
TopicをEchoしてモーターの現在の情報を確認します。
ros2 topic echo /motor_1/status
終わりに
DDSM115は手軽に扱えるダイレクトドライブモーターです!簡単なロボットを作るにはピッタリだと思います!
もしROS 2環境(C++)で動かしたい場合は、今回作成したパッケージ ddsm115_ros2_driver をぜひ使ってみてください!
(RoDEPでは九工大で一緒にロボットを作るメンバーや支援して下さる方を募集しています!興味がある方はぜひ 公式X(旧Twitter) まで連絡をお願いします🙇)
