にわかプラス

にわかが玄人になることを夢見るサイトです。社会や国際のトレンド、プログラミングや電子工作のことについて勉強していきたいです。

DYNAMIXELサーボ Ubuntuでの動作方法【MX-12W】

sponsor

DYNAMIXELサーボをUbuntu18.04で動かしたのでその手順を記事にした。最終的にはRaspberry PiとROSで動かしたいがそれはまた今度。

基本的には前回Windows時と同様、公式からSDKや動作確認ソフトが提供されているので、それにしたがって設定していく。

ただし、モータごとに仕様が違うので、忘れずにプログラム上に記載しなければいけない。

環境

  • デスクトップPC
  • Ubuntu18.04
  • DYNAMIXEL サーボモータ MX-12W
  • U2D2
  • Python2.7.17
    • Python3系でも可能

※サーボモータMX-12WとU2D2について詳しくはこちら www.niwaka-plus.com

Python環境設定

Ubuntu18.04のデフォルトはPython2.7.17だった。pipsetuptoolsが必要なのでインストールする。Python2.8からはデフォルトでpipが入っているので、Pythonのバージョン自体を上げても良いと思う。

Python3でやらなかったのは、後々ROS(Python3非対応)に対応させようと思ているので。 Python3であればPython環境設定はとくに必要なく動く。

pip

sudo apt install python-pip

setuptools

pip install -U pip setuptools

DYNAMIXELSDK設定

github.com

上記GitHubのリポジトリを適当なディレクトリに展開し、DYNAMIXELの環境をインストールする。

cd DynamixelSDK/python
python setup.py install

「python」フォルダ配下に「build」「dist」フォルダが生成されていたら成功。

PCとの通信設定

サンプルを実行する。(デフォルトではエラーが起こる)

python DynamixelSDK/python/tests/protocol1.0/read_write.py

サーボモータの仕様にしたがってアドレス値を設定する。 MX-12Wの仕様は公式の2.2Control Table of EEPROM Area2.3Control Table of RAM Areaの表を参照する。

  • ADDR_MX_TORQUE_ENABLE トルクOn/Off
    • 24
  • ADDR_MX_GOAL_POSITION   角度指令値
    • 30
  • ADDR_MX_PRESENT_POSITION  角度現在地
    • 36

通信設定も必要に応じて変更すること。私の場合は以下。

  • BAUDRATE           ボーレート
    • 1000000
  • DEVICENAME          USB番号
    • ttyusb0

デフォルト値はコメントアウトし、上記で調べた値に書き換えた。

read_write.py

# Control table address
# ADDR_MX_TORQUE_ENABLE      = 64               # Control table address is different in Dynamixel model

ADDR_MX_TORQUE_ENABLE      = 24               # Control table address is different in Dynamixel model
# ADDR_MX_GOAL_POSITION      = 116
ADDR_MX_GOAL_POSITION      = 30 
# ADDR_MX_PRESENT_POSITION   = 132
ADDR_MX_PRESENT_POSITION   = 36 


# Protocol version
PROTOCOL_VERSION            = 1.0               # See which protocol version is used in the Dynamixel

# Default setting
DXL_ID                      = 1                 # Dynamixel ID : 1
# BAUDRATE                    = 57600             # Dynamixel default baudrate : 57600
BAUDRATE                    = 1000000
DEVICENAME                  = '/dev/ttyUSB0'    # Check which port is being used on your controller
                                                # ex) Windows: "COM1"   Linux: "/dev/ttyUSB0" Mac: "/dev/tty.usbserial-*"

これでもう一度実行すると以下の表示が出て接続に成功する。

Succeeded to open the port
Succeeded to change the baudrate
Dynamixel has been successfully connected

モータの仕様確認とサンプルコードへの反映

aを押すと約8度左に、sを押すと約8度右に。escを押すと終了するようにサンプルを変更した。

MX-12Wは0~360度を0~4095の値で表し、最小の角度ステップは0.088度であることに気をつける必要がある。

MX-12W 2.4.20Present Position (36) 参照

コード内に取りうる角度の範囲を設定するところがあるので、これらを0~4095の範囲で設定する必要がある。

DXL_MINIMUM_POSITION_VALUE  = 10
DXL_MAXIMUM_POSITION_VALUE  = 4000

packetHandler.write4ByteTxRx第4引数で目標角度を指定しているが、この値が上記で設定した最大最小値化の範囲外だと[RxPacketError] Out of range error! を出力してしまう。

    dxl_comm_result, dxl_error = packetHandler.write4ByteTxRx(portHandler, DXL_ID, ADDR_MX_GOAL_POSITION, dxl_goal_position[index])

read_write.py

github.com

おわりに

ひとまずこれで動くようになった。動かすため、PythonのバージョンDYNAMIXELSDKの設定PCとの通信設定モータの仕様確認とサンプルへの反映が必要。 モータを動かすのは1つ1つのハードルは高くないけど、いちいち調べものが発生するのでやりたいことができるようになるまでに時間がかかる!

Windowsでの動作確認の方法はこちら。 www.niwaka-plus.com