Невозможно связаться с контроллером Phytron MCC-1 W-USB через Raspberry Pi с использованием последовательного интерфейсаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно связаться с контроллером Phytron MCC-1 W-USB через Raspberry Pi с использованием последовательного интерфейса

Сообщение Anonymous »

Я пытаюсь управлять шаговым двигателем Phytron ZSH 57/2 с помощью контроллера MCC-1 W-USB, подключенного к Raspberry Pi 5< /strong> через соединение USB типа B. Я использую сценарий Python с библиотекой pyserial для отправки команд через последовательный интерфейс, но не получаю ответа от контроллера MCC-1.
Детали настройки:
  • Контроллер: MCC-1 W-USB
  • Двигатель: Phytron ZSH 57/2
  • Микроконтроллер: Raspberry Pi 5
  • Подключение: кабель USB типа A — типа B между Raspberry Pi и MCC-1 (порт X5 Com).
  • Настройки серийного номера:

    Скорость передачи данных: 57600
  • Биты данных: 8
  • Паритет: Нет
  • Стоповые биты: 1
  • Тайм-аут: 2 секунды

Проблема:
  • Когда я запускаю этот код, я постоянно получаю "Нет ответа" из драйвера MCC."
  • Я также пробовал запустить minicom вручную проверяет связь, но сообщает, что устройство автономно, и я не получаю ответа при вводе команд.
Шаги по устранению неполадок на данный момент:
  • Проверка проводки: Все проводка проверена и надежно подключена.
  • Правильное заземление: подключите контакт GND Raspberry Pi к разъему GND на MCC-1, чтобы обеспечьте правильное заземление.
  • Установите переключатель R/L: Переключатель R/L > на MCC-1 установлено значение R (Удаленно).
  • Набор адреса: установите набор адреса, соответствующий адресу в коде Python ('0').
  • Разрешения: добавлен мой пользователь в дозвон. группу для обеспечения доступа к последовательному порту.
  • Настройки Minicom: настроен minicom с использованием скорости передачи данных. ставка 57600, 8N1, нет контроль потока. Он отображается как офлайн.
Вопросы:
< ol>
[*]Нужно ли что-нибудь еще сделать, чтобы установить правильную связь между Raspberry Pi и контроллером MCC-1 W-USB?
[*]Есть ли конкретные действия, выходящие за рамки руководства, необходимые для правильное соединение USB с MCC-1?

[*]Правильно ли я структурирую свою команду с помощью и ? В руководстве упоминается формат данных, но я не уверен, что код Python полностью ему соответствует.

[*]Может ли потребоваться обновление драйвера или прошивки для MCC-1? правильно работать с Raspberry Pi через USB?


Будем благодарны за любую помощь. Заранее спасибо!
import serial
import time

MCC_PORT = '/dev/ttyUSB0' # Adjust as per your connection
BAUD_RATE = 57600 # Usually default, adjust if needed

try:
ser = serial.Serial(MCC_PORT, BAUD_RATE, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=5, rtscts=False)
if ser.is_open:
print(f"Serial port {MCC_PORT} opened successfully.")
else:
print(f"Failed to open serial port {MCC_PORT}.")
except serial.SerialException as e:
print(f"Error opening serial port: {e}")
exit(1)

def calculate_checksum(command):
checksum = 0
for byte in command:
checksum ^= ord(byte)
return f"{checksum:02X}" # Return the checksum as a two-character hex string

def send_command(address, command, use_checksum=False, retries=3):
try:
if use_checksum:
checksum = calculate_checksum(f"{address}{command}")
full_command = f"\x02{address}{command}{checksum}\x03"
else:
full_command = f"\x02{address}{command}\x03"

for attempt in range(retries):
ser.write(full_command.encode())
print(f"Sent command: {full_command}") # Debug message
time.sleep(2) # Allow more time for the motor to react
response = ser.readline().decode().strip()
if response:
if response == '\x06': # ACK
print("Command acknowledged.")
return True
elif response == '\x15': # NAK
print("Command not acknowledged. Retrying...")
else:
print(f"Unexpected response: {response}")
return False
else:
print("No response from MCC driver. Retrying...")
print("Failed to get a response after multiple attempts.")
except Exception as e:
print(f"Error sending command: {e}")
return False

# Function to initialize motor controller
def initialize_motor(address):
"""
Initializes the motor by setting up necessary parameters and performing a reference search run.
"""
# Test communication with a simple status command
if not send_command(address, "ST"):
print("Failed to communicate with MCC driver. Check connections and settings.")
return False

# Set P17 Boost Current to 1 (Enable boost during motor run)
if not send_command(address, "XP17S1"):
return False

# Set P41 Run Current and P42 Boost Current
if not send_command(address, "XP41S50"): # Example value, adjust as needed
return False
if not send_command(address, "XP42S70"): # Example value, adjust as needed
return False

# Set P45 Step Resolution (example: full step)
if not send_command(address, "XP45S1"):
return False

# Set P46 Current Shaping to 1 (Activate Current Shaping)
if not send_command(address, "XP46S1"):
return False

# Perform Reference Search Run
if not send_command(address, "X0+"):
return False

# Activate Power Stage
if not send_command(address, "XMA"):
return False

# Set R/L Switch to Remote (handled physically on MCC-1)
print("Ensure the R/L switch is set to 'R' (Remote) for external control.")

# Check Address Setting (address dial should match address used in code)
print(f"Ensure the address dial on the MCC-1 matches the address '{address}' used in the code.")

# Simulate Limit Switches if not in use (X2/X1 should be bridged if not connected)
print("If limit switches are not connected, bridge the X2/X1 terminals to simulate active switches.")

print("Motor initialized successfully.")
return True

# Function to control motor
def control_motor(address, direction, speed, action):
"""
address: Address of the MCC controller ('0'-'9', 'A'-'F')
direction: 'CW' or 'CCW'
speed: in RPM
action: 'start' or 'stop'
"""
if direction.upper() == 'CW':
if not send_command(address, "MA+"):
return # Exit if command fails
elif direction.upper() == 'CCW':
if not send_command(address, "MA-"):
return # Exit if command fails
else:
print("Invalid direction. Use 'CW' or 'CCW'.")
return

if not send_command(address, f"V{speed}"):
return # Exit if command fails

if action.lower() == 'start':
send_command(address, "S") # Start rotation
elif action.lower() == 'stop':
send_command(address, "E") # Stop rotation
else:
print("Invalid action. Use 'start' or 'stop'.")

# Example usage
try:
# Initialize the motor
if initialize_motor('0'):
# Rotate Clockwise at 30 RPM and start
control_motor('0', 'CW', 30, 'start')

# Run motor for 5 seconds
time.sleep(5)

# Stop motor
control_motor('0', 'CW', 30, 'stop')

except KeyboardInterrupt:
# Handle the interrupt and stop motor safely
control_motor('0', 'CW', 30, 'stop')

finally:
# Close serial port
ser.close()

send_command("\x02E\x03") # Stop rotation
else:
print("Invalid action. Use 'start' or 'stop'.")

# Example usage
try:
# Rotate Clockwise at 30 RPM and start
control_motor('CW', 30, 'start')

# Run motor for 5 seconds
time.sleep(5)

# Stop motor
control_motor('CW', 30, 'stop')

except KeyboardInterrupt:
# Handle the interrupt and stop motor safely
control_motor('CW', 30, 'stop')

finally:
# Close serial port
ser.close()


Подробнее здесь: https://stackoverflow.com/questions/792 ... y-pi-using
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»