Можно ли загрузить скетч Arduino через последовательный порт (RX) вместо USB?
Другими словами, можно ли разработать собственный загрузчик, чтобы скетчи можно было загружать через последовательное соединение, выполненное с использованием контактов RX/TX, а не через разъем USB (я использую платы Pro Micro)? Спасибо!
@Olivier, 👍1
Обсуждение3 ответа
Да. Вы можете разработать загрузчик для ATmega32u4, который будет получать прошивку через любой интерфейс (UART, SPI, I2C и т. д.).
Загрузка через UART — решаемая проблема. Найдите загрузчик AVR109.
Да, существует форк Optiboot, поддерживающий ATmega32U4, поддерживающий аппаратный UART для загрузки скетчей Arduino.
Кроме того, подробная инструктивная публикация, объясняющая, как использовать это с помощью Arduino Pro Micro.
Нет необходимости иметь специальный загрузчик. Базовый загрузчик может это сделать (в Arduino это так, поэтому я надеюсь, что этот ответ применим и в вашем случае. Но если нет, принцип, безусловно, тот же).
После выполнения сброса на плате загрузчик в течение короткого времени проверяет последовательный порт. Если что-то приходит, он проверяет, является ли это шестнадцатеричным файлом, и если да, отправляет его на прошивку. USB просто использует вход RX.
Таким образом, вы можете отправлять данные, используя прямое соединение или, например, Bluetooth, например HC-05. Я делаю это для какого-то проекта, чтобы выполнить обновление через Android: приложение Android отправляет заказ на Arduino через Bluetooth. Получив это, сам Arduino RESET, а затем приложение Android немедленно отправляют данные.
На стороне Arduino: подключите, например, A0 к PIN-коду RESET и выполните digitalWrite(PIN_RESET,HIGH); Также ознакомьтесь с Сброс кода Arduino Uno
После СБРОСА плата ответит 0x14 0x10 (поэтому она отправит это в TX, и поэтому, если у вас есть модуль Bluetooth, вы получите это в своем приложении Android (например))
Затем вы должны отправить на плату 0x50 0x20, чтобы сообщить ей, что вы вошли в режим программирования. Затем отправьте 0x75 0x20, чтобы получить идентификатор платы, чтобы быть уверенным, что вы отправите HEX-файл для правильного оборудования. Вы получите 0x14 XXX 0x10, где XXX = идентификатор платы
Затем вы можете отправить HEX-файл.
Для этого вы будете отправлять его блоками по 128 байт
Итак, начните с деления HEX, чтобы узнать количество блоков, а затем выполните цикл по этому числу: Начните с ADR=0 (адрес назначения во флэш-памяти) и отправьте:
Для каждого блока:
1) Отправьте 0x55, младший байт ADR, старший байт ADR, 0x20
2) проверьте ответ (должен быть 0x14 0x10)
3) Отправьте 128 байт: 0x64, 0x00, 0x80, 0x46, затем 128 байт и закончите 0x20 (0x80 – это размер)
4) проверьте ответ (должен быть 0x14 0x10)
5) обновить ADR. Будьте осторожны: ADR — это указатель на слово (2 байта). Таким образом, ADR = ADR+0X40
Цикл по количеству блоков
Завершите задание, отправив 0x51 0x20 (выход из режима программирования)
Некоторые подробности:
0x46 перед 128 байтами говорит о том, что вы хотите записать во флэш-память. Доступны и другие коды, например, для проверки, получения данных и т. д.
- Кажется обязательным отправлять каждый раз 128 байт. Поэтому, если ваш последний блок меньше, вам нужно добавить немного '\0', чтобы получить в общей сложности 128. Мне не удалось получить хорошие результаты, пытаясь изменить значение 0x80 и отправить меньше байтов. :(
Это не очень просто, и для получения хорошего кода нужны тесты, но очень хорошо иметь возможность обновлять Arduino, которую пользователь может обновить.
Надеюсь, это поможет.
- Флэш-прошивка с шестнадцатеричным файлом по серийному номеру с Python (без avrdude, Arduino IDE)
- Загрузчик работает только один раз с модулем usb для последовательного подключения
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Максимальная последовательная скорость CH340
- Может ли Arduino Leonardo одновременно использовать USB-порт и последовательные контакты RX TX?
- Внешнее питание 5 В и последовательный порт USB
- Программирование Arduino Micro через RX/TX
- Можно ли использовать Serial.print(сообщение), когда USB-кабель не подключен к хост-компьютеру?
Это определенно возможно. Загрузчик — это просто программа, которая может связываться с любым доступным оборудованием, записывать память и переходить к ней., @Eugene Sh.
Это должно быть возможно путем адаптации последовательного загрузчика, обычно используемого в ATmega328p (и т. д.), к вашему ATmega32u4. Однако подробности этого не совсем подходят для вопроса на сайте Stack Exchange *если вы не объясните конкретную трудность*. Обязательно поищите, вполне возможно, что кто-то уже реализовал этот проект. Также подумайте, может ли переход на плату типа Arduino, которая просто имеет ATmega328p (особенно компактную без второго чипа в качестве USB-моста, хотя вы можете обойти это), самым простым способом удовлетворить ваши потребности., @Chris Stratton