Флэш-прошивка с шестнадцатеричным файлом по серийному номеру с Python (без avrdude, Arduino IDE)

Я пытаюсь создать функцию Python в пакете TCLab для прошивки прошивки на Arduino Leonardo (32u4). Я могу скомпилировать TCLab ino (прошивку) и развернуть с помощью Arduino. IDE или с пакетом Python avryp. Пакет Python avr_helpers выглядит как возможное решение, но поддерживается только в более старой версии Python 2.7. Сообщения на форуме например, это, как можно Я загружаю шестнадцатеричный файл в Arduino Uno?, а другие предлагают avrdude загрузить шестнадцатеричный файл. Однако мне нужно решение Python, которое можно использовать на любой платформе (MacOS, Windows, Linux и т. д.) без необходимости установки пакетов (avrdude, Arduino IDE и т. д.).

У меня есть шестнадцатеричный файл от успешного Arduino строить. Вот неудачная попытка загрузить шестнадцатеричный файл с помощью последовательного интерфейса:

import serial
import time
import os

# open and close COM8 to activate bootloader
ser = serial.Serial('COM8',baudrate=1200)
print(ser.isOpen()); ser.close()
time.sleep(2)

# load hex file on COM9
filesize = os.path.getsize('tclab_v2.ino.hex')
fid = open('tclab_v2.ino.hex','rb')
offset = 0; MTU = 20
ser2 = serial.Serial('COM9',115200)
while (offset < filesize):
    fid.seek(offset, 0)
    ser2.write(fid.read(MTU))
    offset = offset + MTU
ser2.close()

Сценарий может активировать загрузчик на другом порту и подключиться. Если я переношу все сразу с помощью ser2.write(fid.read()), это полублокирует Arduino, и я восстанавливаю его, нажимая кнопку сброса непосредственно перед тем, как Arduino IDE установит прошивку. Я использую максимальную единицу передачи (MTU) 20, но не могу проверить, есть ли она для Leonardo. Я могу написать функцию Python для идентификации портов и использовать здесь COM8 и COM9 просто для проверки. Хотя прошивка TCLab предварительно загружена для Python, иногда пользователи меняют прошивку для использования MATLAB, Octave или Java, а затем хотят вернуться к Python. Я хотел бы сделать это как можно проще, не добавляя дополнительные шаги или инструкции в Часто задаваемые вопросы по устранению неполадок. . Могу ли я обновить прошивку, например пакет поддержки MATLAB Arduino, который обнаруживает новое устройство и передает прошивку? автоматически с подтверждением пользователя?

, 👍1

Обсуждение

используйте скорость передачи 9600... это должно исключить возможность того, что 115200 не поддерживается, @jsotola

Спасибо за предложение. Я только что попробовал скорость 9600 бод с ser2 = serial.Serial('COM9',9600), но результат тот же., @John Hedengren

@jsotola, у загрузчика установлена скорость передачи данных. Загрузчик 32u4 использует скорость 57600 бод., @Juraj

Leonardo использует протокол AVR109, а не STK500., @Majenko

http://ww1.microchip.com/downloads/en/AppNotes/doc1644.pdf, @Majenko

@Majenko, да, я отредактировал комментарий, как вы написали свой, @Juraj

дело в том, что в спецификации протокола описано некоторое согласование. вы не можете просто сбросить шестнадцатеричный код на com-порт, @Juraj


1 ответ


1

Это не точный ответ, но он помогает.

Загрузка без avrdude сложна и обычно медленна. Лучшее решение не использовать IDE — открыть и закрыть порт, а затем использовать команду avrdude, которую обычно использует IDE.

from serial import Serial
from time import sleep
from subprocess import run

while input('Press enter to upload ') == '':
    Serial('COM5',baudrate=1200).close()
    sleep(1)
    run(["C:\\Progra~2\\Arduino\\hardware\\tools\\avr/bin/avrdude", "-CC:\\Progra~2\\Arduino\\hardware\\tools\\avr/etc/avrdude.conf", "-v", "-patmega32u4", "-cavr109", "-PCOM6", "-b57600", "-D", "-Uflash:w:C:\\Users\\USER\\Desktop\\Python\\tclab_v2/tclab_v2.ino.hex:i"])
,

Спасибо - это полезно, потому что это намного быстрее, чем использование Arduino IDE. Я могу посмотреть на источник AVRDUDE (хотя это может быть некрасиво): https://stackoverflow.com/questions/37713905/flash-hex-file-to-arduino-via-terminal-without-avrdude, @John Hedengren