feat: 初始化项目,添加电机控制、CAN通信、QT界面等模块
This commit is contained in:
93
motor_control/can_main.py
Normal file
93
motor_control/can_main.py
Normal file
@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
# @Time : 2025/7/21
|
||||
# @Author : hx
|
||||
# @File : can_main.py
|
||||
'''
|
||||
|
||||
import can
|
||||
import time
|
||||
|
||||
# 导入你写的 generate_position_command 函数
|
||||
from motor_control_can_all import generate_position_command
|
||||
|
||||
|
||||
# ========================================
|
||||
# 发送CAN帧函数
|
||||
# ========================================
|
||||
def send_can_frame(data, can_id=0x01, channel='vcan0', interface='socketcan'):
|
||||
"""
|
||||
发送CAN帧
|
||||
:param data: 7字节的列表
|
||||
:param can_id: CAN ID
|
||||
:param channel: CAN 通道
|
||||
:param interface: 总线类型
|
||||
"""
|
||||
try:
|
||||
bus = can.interface.Bus(channel=channel, interface=interface)
|
||||
msg = can.Message(arbitration_id=can_id, data=data, is_extended_id=False)
|
||||
bus.send(msg)
|
||||
print(f"[发送CAN帧] ID={can_id:02X} 数据=[{', '.join(f'0x{x:02X}' for x in data)}]")
|
||||
bus.shutdown()
|
||||
except Exception as e:
|
||||
print(f"[发送失败] {e}")
|
||||
|
||||
|
||||
# ========================================
|
||||
# 监听CAN反馈函数
|
||||
# ========================================
|
||||
def listen_can_feedback(channel='vcan0', interface='socketcan', timeout=2.0):
|
||||
"""
|
||||
监听是否有CAN反馈数据
|
||||
:param channel: CAN 通道
|
||||
:param interface: 总线类型
|
||||
:param timeout: 等待反馈的超时时间(秒)
|
||||
"""
|
||||
try:
|
||||
bus = can.interface.Bus(channel=channel, interface=interface)
|
||||
print(f"[监听反馈] 等待来自 {channel} 的反馈({timeout}秒超时)...")
|
||||
msg = bus.recv(timeout=timeout)
|
||||
if msg:
|
||||
print(f"[收到反馈] ID={msg.arbitration_id:02X} 数据=[{', '.join(f'0x{x:02X}' for x in msg.data)}]")
|
||||
else:
|
||||
print("[未收到反馈]")
|
||||
bus.shutdown()
|
||||
except Exception as e:
|
||||
print(f"[监听失败] {e}")
|
||||
|
||||
|
||||
# ========================================
|
||||
# 主函数:发送位置控制指令并监听反馈
|
||||
# ========================================
|
||||
|
||||
def can_motor_contral(direction=0, angle=100, microstep=32, can_id=0x01, channel='vcan0', listen_feedback=False):
|
||||
print("=== 开始发送CAN位置控制指令 ===")
|
||||
print(f"参数:方向={direction}(0=逆时针,1=顺时针),角度={angle}°,细分={microstep}")
|
||||
|
||||
# 生成CAN数据帧
|
||||
can_data = generate_position_command(direction=direction, microstep=microstep, angle=angle)
|
||||
print(f"生成的CAN数据帧: [{', '.join(f'0x{x:02X}' for x in can_data)}]")
|
||||
|
||||
# 发送CAN帧
|
||||
send_can_frame(can_data, can_id=can_id, channel=channel)
|
||||
|
||||
# 如果启用监听,等待反馈
|
||||
if listen_feedback:
|
||||
listen_can_feedback(channel=channel)
|
||||
|
||||
print("=== 电机控制流程完成 ===")
|
||||
|
||||
# ========================================
|
||||
# 程序入口(直接运行时使用)
|
||||
# ========================================
|
||||
if __name__ == "__main__":
|
||||
# 这里写死参数,方便调试
|
||||
can_motor_contral(
|
||||
direction=1, # 顺时针
|
||||
angle=180, # 180度
|
||||
microstep=16, # 细分值16
|
||||
can_id=0x02, # CAN ID 0x02
|
||||
channel='vcan0', # 使用虚拟CAN
|
||||
listen_feedback=True # 是否监听反馈
|
||||
)
|
||||
Reference in New Issue
Block a user