実際のところ
複数軸動かすときは、ID毎にインスタンスを生成して操作してあげればよいです。
各軸のIDは先に書き込みしておいてください。
import os import sys # 添加pcan_cybergear库的路径 # パスの追加 sys.path.append(os.path.join("..", "cybergear")) from pcan_cybergear import CANMotorController import can import time # Connect to the CAN bus with 1 Mbit/s bitrate bus = can.interface.Bus(bustype="socketcan_native", channel="can0", bitrate=1000000) motor1 = CANMotorController(bus, motor_id=101, main_can_id=254) motor2 = CANMotorController(bus, motor_id=102, main_can_id=254) motor3 = CANMotorController(bus, motor_id=103, main_can_id=254) ## ID疎通の確認 ## 問題がなければ、101、102、103のモーターが応答する。 ## ex ) 101 : (bytearray(b'\x19 \x06\x00\x7f\xff\x01\n'), 134243838) ## それ以外は(None, Noe)が返る import time for i in range(100,105): motor0 = CANMotorController(bus, motor_id=i, main_can_id=254) time.sleep(0.01) ex = motor0.write_param_table("limit_cur", 3.5) print(f'{i} : {ex}') # モーターの無効化、脱力するので注意 for mr in (motor1,motor2, motor3): mr.disable() # ゼロポジションの設定。脱力した状態では精度が若干不安。 for mr in (motor1,motor2, motor3): mr.set_0_pos() # モーターの有効化 for mr in (motor1,motor2, motor3): mr.set_run_mode(motor1.RunModes.POSITION_MODE) # 位置模式 mr.enable() # ゼロ点に移動 motor1.write_single_param("loc_ref", value=0.0) motor2.write_single_param("loc_ref", value=0.0) motor3.write_single_param("loc_ref", value=0.0) # 動作メイン while True: motor1.write_single_param("loc_ref", value=0.0) motor2.write_single_param("loc_ref", value=0.0) motor3.write_single_param("loc_ref", value=0.0) time.sleep(2.0) motor1.write_single_param("loc_ref", value=0.2) motor2.write_single_param("loc_ref", value=0.5) motor3.write_single_param("loc_ref", value=0.5) time.sleep(2.0)