import time
from motorbridge import Controller
def scan_damiao_motors(channel, start_id, end_id):
"""
扫描达妙电机。
参数:
channel: CAN 接口名,如 "can0"
start_id: 起始 ID,如 1
end_id: 结束 ID,如 32
返回:
找到的电机列表,每个元素是 (motor_id, feedback_id) 元组
"""
found_motors = []
print(f"开始扫描 {channel},ID 范围: {start_id} - {end_id}")
for motor_id in range(start_id, end_id + 1):
# 达妙的 feedback_id 通常是 motor_id + 0x10
feedback_id = 0x10 + (motor_id & 0x0F)
# 创建新的控制器实例
ctrl = Controller(channel)
try:
# 尝试添加电机
motor = ctrl.add_damiao_motor(motor_id, feedback_id, "4340P")
try:
# 尝试读取寄存器来验证电机存在
# RID 8 是 ESC_ID(电机 ID)
esc_id = motor.get_register_u32(8, timeout_ms=100)
# RID 7 是 MST_ID(反馈 ID)
mst_id = motor.get_register_u32(7, timeout_ms=100)
print(f"[找到] motor_id=0x{motor_id:02X} esc=0x{esc_id:X} mst=0x{mst_id:X}")
found_motors.append((motor_id, feedback_id))
except Exception:
# 读取失败,说明这个 ID 没有电机
print(f"[无响应] motor_id=0x{motor_id:02X}")
finally:
motor.close()
except Exception as e:
print(f"[错误] motor_id=0x{motor_id:02X}: {e}")
finally:
ctrl.close_bus()
ctrl.close()
print(f"\n扫描完成,找到 {len(found_motors)} 个电机")
return found_motors
# 运行扫描
if __name__ == "__main__":
motors = scan_damiao_motors("can0", 1, 20)
print("\n找到的电机配置:")
for motor_id, feedback_id in motors:
print(f" motor_id=0x{motor_id:02X}, feedback_id=0x{feedback_id:02X}")