ブログ - DXL Yシリーズ試食1

DXL Yシリーズ試食1

カテゴリ : 
雑記
2024-6-24 9:10
DXLシリーズはモデルが大きく変わると運用方法が変わってしまう。せめてモデルが違っていても同じアイテム名のアドレス程度は同じであって欲しいのだが、Yシリーズも例に漏れず他のモデルとの互換性は低い。
毎回ドキュメントを読み返すのも何なのでDX2LIBを真似てModel Noを元にグループ化し、一部の共通するアイテムのアドレスを引っ張り出せる簡単なクラスを作成

次に電源だが、既存との互換性は一切ない。それなりに大きいターミナルブロックが2箇所設けられているが、単独で消費する電流程度しかまかなえないので、DXLをまたぎながらマルチドロップ接続する事は避けた方が良さそうだ。またYM70とYM80ではターミナルブロックのサイズが異なるので、使い回しができない。
通信はRS-485という事で、電気的に既存のDXL用のI/Fが使える。シグナルGNDは電源と共通で、D+とD-のみの1.25mmピッチ2ピンのコネクタが用意されている。筐体のサイズに対してコネクタが華奢なのと、自前でツイストシールド線を使った場合のシールド設置処置が少々面倒。


今回は諸々の電気的な不都合を無視した上で4ピンのEHコネクタに変換するケーブルを作成し、例のRasPi Zero 2W + キャリアボードに接続。


Pingを叩いたら応答するので電源と通信はOK。しかしLEDが点滅し続ける状態でトルクイネーブルができない。コントロールテーブルばかりを眺めていたので見逃していたが、e-manualの冒頭に記載されているバックアップバッテリに関する注意書きを読み飛ばしていた。筐体に内蔵されているバックアップバッテリのリード線が外れているので接続。


しかしまだ動かない。Clear Errorを行わないといけないようだ。特殊なパケットだが書いてある通りのバイト列を送信するのみ、DXL Wizardを使うのであればその操作方法に従うまで。
 dx.TxPacket(ID, DXLProtocolV2.INST_CLEAR, (0x01, 0x44, 0x58, 0x4c, 0x22))
 dx.RxPacket(timeout = 5.0)
なおError Clearはステータスパケットの返答までの時間が4秒程度と長かったり、その処理の直後はインストラクションパケットを受け取らない期間があったりと変な癖が見つかったので、pyDXL.pyのRead関数にtimeoutの引数を追加しておいた。

ようやく下準備が整ったところで、まずは位置決め制御を行ってみる。その所作は他のモデルと大差無く、トルクディスエーブル→動作モード設定→トルクイネーブル→目標位置へ任意の値の書き込み、といった段取り。今回試したYM070-210-M001-RHの場合、360度の範囲で動かそうとすると最大分解能が19ビットとかなり大きい数値を扱う事になる。
import time
from pyDXL import *
dx = DXLProtocolV2('/dev/ttyAMA0', 57600, 0.05)
ID = 1
dx.Write8(ID, 512, 0)
if input('Clear? (y/N) ') == 'y':
dx.TxPacket(ID, DXLProtocolV2.INST_CLEAR, (0x01, 0x44, 0x58, 0x4c, 0x22))
dx.RxPacket(timeout = 5.0)
time.sleep(1)
dx.Write8(ID, 33, 3)
dx.Write8(ID, 512, 1)
for i in range(-262144, 262144, 512):
dx.Write32(ID, 532, i)
dx.Write8(ID, 512, 0)

といったところで1時間が経過したので一旦休憩、続きは次回に。

技術

トラックバック

トラックバックpingアドレス http://www.besttechnology.co.jp/modules/d3blog/tb.php/253