Флэш-прошивка с шестнадцатеричным файлом по серийному номеру с 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, который обнаруживает новое устройство и передает прошивку? автоматически с подтверждением пользователя?
@John Hedengren, 👍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
- Можно ли загрузить скетч Arduino через последовательный порт (RX) вместо USB?
- Не удается связаться с ардуино с помощью python (Windows)
- Последовательная связь Arduino с Python: отправка массива
- Построение графика на Python с использованием Tkinter Canvas
- Как отправить целое число через pyserial с Python на Arduino и получить тот же результат?
- Сброс последовательного порта Arduino в последовательном мониторе и Python
- Отправка числа с плавающей запятой из python в arduino
- Программирование Arduino Micro через RX/TX
используйте скорость передачи 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