適用:XC330 適用:全シリーズ 適用:全シリーズ 適用:全シリーズ 適用:XM/XH/XDシリーズ 適用:全シリーズ
Attach file: E212_3D.png by takaboo
OpenOCD_x86_0.12.0+dev-00524-g07141132a
OpenOCD_x64_0.12.0+dev-00524-g07141132a
Attach file: E179B_CN5-12 by takaboo
Attach file: SLG4E46882_DS_r010_08312023.pdf by takaboo
デモに同梱したDXLIBはDynamixelのモデルを意識すること無くかつ物理値での指令に対応する追加APIが使用でき、それを利用して俗に言うモーションを簡単に再生するDXLMotionクラスを作った。
def __init__(self, port : serial.Serial | str, baudrate = 57600, timeout = 0.05, mutex = None): if isinstance(port, serial.Serial): self.__serial = port self.__baudrate = port.baudrate self.__timeout = port.timeout else: print(port, baudrate, timeout) print(type(port)) self.__serial = serial.Serial(port, baudrate = baudrate, timeout = timeout) self.__baudrate = self.__serial.baudrate self.__timeout = self.__serial.timeout if mutex == None: self.__mutex = threading.Lock() else: self.__mutex = mutex return self.__serial.baudrate def __reconfig(self): self.__serial.baudrate = self.__baudrate self.__serial.timeout = self.__timeout
self.__reconfig() def FullScan(self) -> tuple: orgtimeout = self.__timeout orgbaudrate = self.__baudrate #baud=(3000000,2000000,1500000,1250000,1000000,625000,115200,57600) baud=(57600,115200,625000,1000000,1250000,1500000,2000000,3000000) self.__serial.timeout = 0.001 for b in baud: for id in range(240): self.__serial.baudrate = b r = self.MemREAD8(id, 0) print(f'baud:{b:7} id:{id:3} :', end='find\n' if r else 'none\r') self.__serial.timeout = orgtimeout self.__baudrate = orgbaudrate
try: pmx = PMXProtocol('\\\\.\\COM12', 115200) except: pass else: ID = 0 # reboot print('ReBoot=', pmx.ReBoot(ID, echo=True)) time.sleep(0.5) ''' # factory reset print('FactoryReset=',pmx.FactoryReset(ID)) time.sleep(0.5) ''' # load print('LOAD=', pmx.LOAD(ID, echo=True)) # save print('SAVE=', pmx.SAVE(ID, echo=True)) ''' # sys write print('SysWrite=',pmx.SystemWRITE(ID, (ID, pmx.SYSW_BAUD_115_2k, pmx.SYSW_PARITY_NONE, 20))) time.sleep(0.5) ''' # sys read r = pmx.SystemREAD(ID) print('SysRead=', f'${r[0]:08x} ${r[1]:08x} ${r[2]:08x} {r[3]:d} ' if r else 'False') # dump memory print('dump') for addr in range(0, 800, 20): r = pmx.MemREAD(ID, addr, 20) print(f' MemREAD({addr}:{20})=', r.hex(':') if r else '!!!!!!!!!!!!!!!!!!!!!!!!') # gain r = pmx.MemREAD(ID, 0, 64) print('gain\n MemREAD(0:64)=', *iter_unpack('<IIIIIIIIIIIIIIII', r) if r else '!!!!!!!!') # voltage limit r = pmx.MemREAD(ID, 76, 8) print('volt lim\n MemREAD(76:8)=', *iter_unpack('<HHHH', r) if r else '!!!!!!!!') # present value r = pmx.MemREAD(ID, 300, 24) print('present val\n MemREAD(300:20)=', *iter_unpack('<hhhhhhhhhHHH', r) if r else '!!!!!!!!') # error stat r = pmx.MemREAD(ID, 400, 6) print('err stat\n MemREAD(0:400:7)=', *iter_unpack('<BBBxH', r) if r else '!!!!!!!!') print('preparation for pos ctrl') # ctrl off print(' MotorWRITE=', pmx.MotorWRITE(ID, pmx.MOTW_OPT_FREE, ())) time.sleep(0.1) # 1:pos,2:speed,4:cur,8:torq,16:pwm,32:time print(' MemWRITE8(501)=', pmx.MemWRITE8(ID, 501, 1)) print(' MemWRITE8(502)=', pmx.MemWRITE8(ID, 502, 0b11111)) time.sleep(0.1) # goal angle print('start pos ctrl') print(' MotorWRITE=', pmx.MotorWRITE(ID, pmx.MOTW_OPT_TORQUEON, ())) for ang in tuple(range(0, 32000, 500)) + tuple(range(32000, -32000, -500)) + tuple(range(-32000, 500, 500)): for n in range(10): r = pmx.MotorWRITE(ID, pmx.MOTW_OPT_NONE, (ang,)) if r != None: if len(r) > 0: print(f' MotorWRITE= {r[0]},', ''.join('{:6},'.format(k) for k in r[1]), 'stat=', pmx.status, end = '\r') pmx.MemREAD(ID, 400, 6) else: pass print(' MotorWRITE= !!!!!!!!!!!!!!!!!!!!!!!!') break time.sleep(0.005) continue pass break print() time.sleep(0.1) print(' MotorWRITE=', pmx.MotorWRITE(ID, pmx.MOTW_OPT_FREE, ()))
print(' MotorWRITE=', pmx.MotorWRITE(ID, pmx.MOTW_OPT_FREE, ())) time.sleep(0.1) # 1:pos,2:speed,4:cur,8:torq,16:pwm,32:time print(' MemWRITE8(501)=', pmx.MemWRITE8(ID, 501, 2)) time.sleep(0.1)
# goal angle print('start speed ctrl') print(' MotorWRITE=', pmx.MotorWRITE(ID, pmx.MOTW_OPT_TORQUEON, ())) for spd in tuple(range(0, 2000, 50)) + tuple(range(2000, -2000, -50)) + tuple(range(-2000, 50, 50)): for n in range(10): r = pmx.MotorWRITE(ID, pmx.MOTW_OPT_NONE, (spd,)) if r != None: if len(r) > 0: print(f' MotorWRITE= {r[0]},', ''.join('{:6},'.format(k) for k in r[1]), 'stat=', pmx.status, end = '\r') pmx.MemREAD(ID, 400, 6) else: pass print(' MotorWRITE= !!!!!!!!!!!!!!!!!!!!!!!!') break time.sleep(0.005) else: continue pass break else: print() time.sleep(0.1) print(' MotorWRITE=', pmx.MotorWRITE(ID, pmx.MOTW_OPT_FREE, ()))
del pmx
なお「~/DX2LIB_v?.?/SampleCode/C/config.c」はID・ボーレート・動作モードの変更、テスト運転用のサンプルソースになりますので、Dynamixelの諸設定変更の際は利用してみてはいかがでしょうか。
def __init__(self, port : serial.Serial | str, baudrate = 57600, timeout = 0.05, mutex = None): port : serial.Serial | str pySerial or Device name def __init__(self, port : serial.Serial | str, baudrate = 57600, timeout = 0.05, mutex = None): port : serial.Serial | str pySerial or Device name
$ bitbake -c savedefconfig linux-renesas
モーションは時間を追って変化する目標値を任意の時間で区切って羅列したデータを予め作っておき、そのデータをサーボの補間機能を活用しながら再生するもの。ここでは2個のサーボを角度制御と速度制御によるモーションを使って運転してみる。
mt.start(0, IDs, (jp200.Pose(2, [ 400.0, 800.0 ], 1, 500, 'TP=1000'),)) mt.start(0, IDs, (jp200.Pose(2, [ -800.0, -400.0 ], 1, 500, 'TP=1000'),)) mt.start(0, IDs, (jp200.Pose(2, [ 0.0, 0.0 ], 1, 500, 'TP=1000'),))
XH540-V150 | 1188 | 0~1188 |
XM540-W270 | 2047 | 0~2047 |
XH540-V270 | 1188 | 0~1188 |
XW540-T140 | 2047 | 0~2047 |
RA4M1,DA14531
※現状ではArduinoライブラリに問題があるため、解消するまで適用は控えてください。それでも115.2kbps以下であれば使えない事もありません。
Attach file: e2s_prj_bin.png by takaboo
公開日: 2023/5/5
SHIELDのジャンパ線がPicoのTP6へ正しく接続されていれば、BOOTSELボタンを使わずとも電源を印加したままPB1の押下時間のみでPicoのリセットとブートROMのUSBマスストレージへの遷移が行えます。
DXLIB dxif ((DX2LIB::TDXHost_ConfParam *)¶m); DX2LIB dxif ((DX2LIB::TDXHost_ConfParam *)¶m); DX2LIB dx2 ((DX2LIB::TDXHost_ConfParam *)¶m); DX2LIB dxif((DX2LIB::TDXHost_ConfParam *)¶m);
GDLAvrPack202209.exe
公開日: 2022/09/23
サイズ: 17,167,850 byte
MD5ハッシュ値: bea84c49fdf355ba61d3985739ee1d23
Attach file: new_XL430_dimension.pdf by takaboo
Attach file: X540_hn13-i101.png by takaboo
BTX122
ショップページへ
ホーン HN13-I101 EPX540-BR101
またNerOへプログラムを転送する際は、無条件に本モードに変更しておかないと転送に失敗します。
電源 | 5V | USBバスパワー VDDが印加されている場合はDXMIO上のLDOから供給 |
ショップページへ
基板用ヘッダー | molex 22-03-5035 |
ハウジング | molex 50-37-5033 |
ターミナル | molex 08-70-1040 |
詳細はこちら。
Dynamixel MX-106
詳細はこちら。
DYNAMIXEL Communiation Protocol 1.0ページ参照。
詳細はこちら。
3D pdf |
KONDO KRS | 15 | 不正デバイスIDエラー |
KONDO B3M | 15 | 不正デバイスIDエラー |
14 | 不正IDエラー | |
13 | 異IDエラー | |
12 | 不正サイズエラー | |
11 | 不正パラメータエラー | |
10 | COMポートエラー | |
9 | チェックサムエラー | |
8 | 通信タイムアウト | |
7 | B3MのSTATUSに準拠 | |
6 | ||
5 | ||
4 | ||
3 | ||
2 | ||
1 | ||
0 |
MX-12W | PID Control | 32x50x40 | 55 | 10~14.8 | 0.2/12 | 1.4/12 | 470/12 | GMR | Cored | 360 | 4096 | TTL | Enpla | Enpla | 4.5 | V1 |
Attach file: H8Pac3687F.png by takaboo
GCC Developer Liteの詳細についてはこちら。
Attach file: AvrPacATM32.png by takaboo
既にユーザプログラムが書き込まれている場合は、電源印加直後もしくはブートローダのコマンドモードから'G'を発行した時にユーザプログラムが実行されます。
また、既にユーザプログラムが書き込まれている場合は、電源印加直後もしくはブートローダのコマンドモードから'G'を発行した時のみユーザプログラムが実行されます。
Attach file: ArmPackATSAM7X.png by takaboo
Attach file: ArmPackATSAM7S.png by takaboo
Attach file: ArmPackATSAM7S.png by takaboo
TVSダイオードのクランプ電圧は印加される電源電圧以上かつ半導体の絶対最大定格電圧以下、容量はモータの回生電力を吸収しきれるものを選びます。