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だった。pipとsetuptoolsが必要なのでインストールする。Python2.8からはデフォルトでpipが入っているので、Pythonのバージョン自体を上げても良いと思う。
Python3でやらなかったのは、後々ROS(Python3非対応)に対応させようと思ているので。 Python3であればPython環境設定はとくに必要なく動く。
pip
sudo apt install python-pip
setuptools
pip install -U pip setuptools
DYNAMIXELSDK設定
上記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 Areaと2.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
おわりに
ひとまずこれで動くようになった。動かすため、Pythonのバージョン、DYNAMIXELSDKの設定、PCとの通信設定、モータの仕様確認とサンプルへの反映が必要。 モータを動かすのは1つ1つのハードルは高くないけど、いちいち調べものが発生するのでやりたいことができるようになるまでに時間がかかる!
Windowsでの動作確認の方法はこちら。 www.niwaka-plus.com