Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

cybergearをpythonで弄る その4:複数軸を位置で動かす

実際のところ

複数軸動かすときは、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)