135 lines
4.5 KiB
Python
135 lines
4.5 KiB
Python
|
|
#!/usr/bin/env python
|
|||
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
'''
|
|||
|
|
# @Time : 2025/7/15 17:52
|
|||
|
|
# @Author : hx
|
|||
|
|
# @File : motor.py
|
|||
|
|
'''
|
|||
|
|
import serial
|
|||
|
|
import time
|
|||
|
|
import math
|
|||
|
|
|
|||
|
|
start_speed = 8
|
|||
|
|
stop_speed = 0
|
|||
|
|
|
|||
|
|
def send_hex_command(port, baudrate, hex_data):
|
|||
|
|
"""
|
|||
|
|
通过串口发送十六进制指令
|
|||
|
|
:param port: 串口号 (如 'COM3' 或 '/dev/ttyUSB0')
|
|||
|
|
:param baudrate: 波特率 (如 9600)
|
|||
|
|
:param hex_data: 十六进制字符串 (如 "7B 01 02 01 20 0E 10 00 64 23 7D")
|
|||
|
|
"""
|
|||
|
|
try:
|
|||
|
|
# 转换十六进制字符串为字节数据
|
|||
|
|
byte_data = bytes.fromhex(hex_data.replace(" ", ""))
|
|||
|
|
|
|||
|
|
# 打开串口
|
|||
|
|
with serial.Serial(port, baudrate, timeout=1) as ser:
|
|||
|
|
print(f"已连接串口 {port}, 波特率 {baudrate}")
|
|||
|
|
|
|||
|
|
# 发送指令
|
|||
|
|
ser.write(byte_data)
|
|||
|
|
print(f"已发送指令: {hex_data}")
|
|||
|
|
|
|||
|
|
# 可选:等待并读取返回数据
|
|||
|
|
time.sleep(0.1)
|
|||
|
|
if ser.in_waiting > 0:
|
|||
|
|
response = ser.read(ser.in_waiting)
|
|||
|
|
print(f"收到响应: {response.hex().upper()}")
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"发生错误: {e}")
|
|||
|
|
|
|||
|
|
def generate_fixed_command(speed):
|
|||
|
|
"""
|
|||
|
|
生成固定的速度控制指令: 7B 01 01 00 20 00 00 00 <speed> <checksum> 7D
|
|||
|
|
参数:
|
|||
|
|
speed (int): 十进制速度值 (0~255)
|
|||
|
|
返回:
|
|||
|
|
str: 十六进制命令字符串
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
actual_speed = int(speed * 10)
|
|||
|
|
|
|||
|
|
if not (0 <= actual_speed <= 255):
|
|||
|
|
raise ValueError("速度必须在 0~255 范围内")
|
|||
|
|
|
|||
|
|
command_bytes = [
|
|||
|
|
0x7B, 0x01, 0x01, # 帧头、地址、控制模式
|
|||
|
|
0x00, 0x20, # 方向、细分
|
|||
|
|
0x00, 0x00, # 位置高/低字节(持续旋转)
|
|||
|
|
0x00, actual_speed # 保持整数速度值
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
# 计算校验和(前9个字节异或)
|
|||
|
|
checksum = 0
|
|||
|
|
for byte in command_bytes:
|
|||
|
|
checksum ^= byte
|
|||
|
|
|
|||
|
|
full_command = command_bytes + [checksum, 0x7D]
|
|||
|
|
return ' '.join(f'{byte:02X}' for byte in full_command)
|
|||
|
|
|
|||
|
|
def listen_and_respond(port, baudrate):
|
|||
|
|
"""
|
|||
|
|
持续监听串口,一旦有信号就执行开始和停止的指令
|
|||
|
|
"""
|
|||
|
|
try:
|
|||
|
|
with serial.Serial(port, baudrate, timeout=1) as ser:
|
|||
|
|
ser.reset_input_buffer()
|
|||
|
|
print(f"[监听中] 串口 {port} 已打开,等待信号...")
|
|||
|
|
|
|||
|
|
while True:
|
|||
|
|
if ser.in_waiting > 0:
|
|||
|
|
incoming = ser.read(ser.in_waiting)
|
|||
|
|
print(f"[收到信号] 内容: {incoming.hex().upper()}")
|
|||
|
|
|
|||
|
|
# 执行开始旋转
|
|||
|
|
start_cmd = generate_fixed_command(8)
|
|||
|
|
print("发送开始指令:", start_cmd)
|
|||
|
|
ser.write(bytes.fromhex(start_cmd.replace(" ", "")))
|
|||
|
|
|
|||
|
|
# 延迟一段时间
|
|||
|
|
time.sleep(4)
|
|||
|
|
|
|||
|
|
# 执行停止
|
|||
|
|
stop_cmd = generate_fixed_command(0)
|
|||
|
|
print("发送停止指令:", stop_cmd)
|
|||
|
|
ser.write(bytes.fromhex(stop_cmd.replace(" ", "")))
|
|||
|
|
|
|||
|
|
print("[已完成一次响应]\n等待下一次信号...\n")
|
|||
|
|
|
|||
|
|
time.sleep(0.1) # 避免CPU占用过高
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"监听时发生错误: {e}")
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
# 配置参数
|
|||
|
|
PORT = "/dev/ttyACM0" # 修改为你的串口号
|
|||
|
|
BAUD_RATE = 115200 # 修改为你的设备波特率
|
|||
|
|
HEX_COMMAND = {
|
|||
|
|
"Clockwise_rotation":"7B 01 02 01 20 0E 10 00 64 23 7D", # 顺时针旋转360
|
|||
|
|
"Counterclockwise_rotation":"7B 01 02 00 20 0E 10 00 64 22 7D",
|
|||
|
|
"One_revolution_per_second":"7B 01 01 00 20 00 00 00 3F 64 7D", # 有问题
|
|||
|
|
"Ten_radin_per_second":"7B 01 01 00 20 00 00 00 64 3F 7D",
|
|||
|
|
"Eight_radin_per_second": "7B 01 01 00 20 00 00 00 50 0B 7D",
|
|||
|
|
"stop":"7B 01 01 00 20 00 00 00 00 5B 7D"
|
|||
|
|
}# 要发送的指令
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
# 生成并发送开始旋转指令(速度 = 8)
|
|||
|
|
start_cmd = generate_fixed_command(start_speed)
|
|||
|
|
send_hex_command(PORT, BAUD_RATE, start_cmd)
|
|||
|
|
|
|||
|
|
# 延迟一段时间(比如 4 秒)
|
|||
|
|
time.sleep(4)
|
|||
|
|
|
|||
|
|
# 生成并发送停止指令(速度 = 0)
|
|||
|
|
stop_cmd = generate_fixed_command(stop_speed)
|
|||
|
|
send_hex_command(PORT, BAUD_RATE, stop_cmd)
|
|||
|
|
|
|||
|
|
print("电机控制流程执行完成。")
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"运行错误: {e}")
|