Прошивка Arduino через USB (UART) / AVR ISP разъём (USBasp программатор)
Эта заметка нацелена на изложение основных действий для перепрошивки Arduino как при помощи встроенного бутлодера, так и с помощью программатора. В первых двух разделах я коротко изложу техническую базу и особенности использования двух методов, а в третьем разделе среду разработки и утилиты необходимые для прошивки.
Прошивка с помощью встроенного bootloader (через последовательный порт)
Все платы Arduino (основная линейка) построены на базе чипа Atmega с архитектурой AVR. AVR – это семейство микроконтроллеров, их прошивка, а именно запись постоянной памяти и выставление Fuse битов реализовано через ICSP порт очень похожий на SPI. Однако наиболее распространенным способом прошивки является прошивка через USB. Точнее через UART, тк на самом деле на плате разведён USB-RS232 преобразователь.
RS232 это надстройка над UART. UART содержит только пины RX , TX . Тогда как RS232 содержит ещё и другие линии (подробнее на UART, COM-порт, RS-232, что это и как они связаны?):
Для перепрошивки через UART требуется выполнение двух условий:
- Наличие загрузчика в МК (его вполне может и не быть там, тогда остается только вариант с прошивкой через программатор)
- Для начала загрузки прошивки необходимо перезагрузить МК в очень узкое временное окно и затем начать передавать прошивку через UART. На некоторых платах отсуствует встроенный USB-RS232 преобразователь, например Arduino Pro Mini . В этом случае вы можете попробовать перезагрузить МК с кнопки на плате Arduino (у меня это получилось раза 20го). Как альтернатива, если вы используете внешний USB-RS232 преобразователь с линией DTR . Вы можете подключить этот вывод на пин RESET Arduino. Аналогичным способом подключен встроенный преобразователь на Arduino.
Для начала разберемся с тем, что нужно постоянно искать – пинами на программаторе.
Прошивка с помощью программатора
Также в качестве программатора можно использовать ещё одну плату Arduino со специальной прошивкой.
Все сложность в прошивки этим способом обеспечить корректное подключение программатора к Arduino. Также обратите внимание, что лучше запитать Arduino непосредственно от программатора.
Основная проблема в том, что на большинстве программаторов ICSP-разъём содержит 10 пинов, тогда как на всех платах Arduino, и не только, он 6ти пиновый.
Для прототипирования небольших проектов, я люблю использовать Arduino Nano , ниже описание выводов:
На некоторых программаторах, в том числе на USBasp выведены также I2C, UART-линии:
Для облегчения процесса перепрошивки, может быть сделан переходник. Подробнее в статье AVR ISP Разъемы (webarchive).
- Плохой контакт тактирующего сигнала SCK .
- Устаревшая прошивка на программаторе, подробнее как её обновить тут Прошивка USBasp.
Среда разработки и прошивка
Стандартная среда разработки Arduino IDE включает в себя:
- Магазин библиотек
- Текстовый редактор
- Набор драйвером для сериал портов (последовательных портов)
- Монитор последовательного порта
- Обертку над avrdude
- Компилятор
По сути весь процесс прошивки заключается в запуске avrdude с разными аргументами. Мне не нравится среда Arduino IDE ввиду крайне неудобного редактора при открытии нескольких файлов.
Я использую в качество основного редактора кода VSCode, для него есть замечательный плагин Platformio , который позволяет производить сборку, а также прошивку устройств через встроенный загрузчик. Однако для перепрошивки, а также для работы с последовательным интерфейсом я предпочитаю использовать напрямую утилиты avrdude и screen . Для этого я добавляю в репозиторий примерно следующий Makefile :
all: upload upload: platformio run --target upload clean: platformio run --target clean build: platformio run list: ls -l /dev/tty.* monitor: screen /dev/tty.usbserial-AH05WAKX 115200 usbasp: avrdude -c usbasp -p m328p -P usb -U flash:w:.pio/build/ATmega328P/firmware.hex:i -FD direct: avrdude -c arduino -p m328p -U flash:w:.pio/build/ATmega328P/firmware.hex:i -P /dev/tty.usbserial-AH05WAKX info: avrdude -c usbasp -p m328p -P usb -v setup: brew install avrdude screen
Адрес последовательного интерфейса может отличаться, также цель setup использует пакетный менеджер brew для установки зависимостей на macOS.
Библиотеки я предпочитаю лично контролировать включением их в репозиторий, для этого в проекте Platformio необходимо создать папку lib .
Небольшое обновление: я сделал репозиторий-шаблон на Github, который можно взять за основу при написании кода под МК Atmega.
Пожалуй, это основные лайфхаки которые я использую для прошивки Arduino. Я умышленно упростил и недосказал некоторые моменты, возможно я допишу это когда-нибудь.
Прошивка Arduino через USBasp
Прошить Arduino с помощью USBasp не сложно, но нужно понимать, для чего необходима данная процедура и как ее произвести в домашних условиях. Разберем по порядку все аспекты, связанные с этим простым программатором.
Пройдемся немного по терминологии. Прошивка контроллера – это своего рода запись программного кода в память устройства. Применяется в тех случаях, когда была произведена замена микрочипа либо отдельные его компоненты начали окисляться (попросту вышли из строя).
В глобальной сети Интернет можно отыскать много статей по этой тематике, но некоторые из них запутанны и не совсем понятны. Мы решили обобщить всю информацию и собрали для вас подробный мануал. Итак, приступим.
Прошивка Ардуино через USBasp
Для работы нам понадобятся два устройства: плата расширения Arduino Uno (Nano, Mega) и сам ASP-программатор. Подключаем платформу к компьютеру, запускаем среду IDE. Выбираем сначала в разделе «Инструменты» название платформы (например, Уно), тип программатора, а потом загружаем стандартный скетч ArduinoISP:
Переходим в меню «Скетч» — команда «Загрузить через программатор». Проверили – индикатор мигает зеленым, значит, функционирует. Пока можно отключить, ведь теперь у нас другая задача – задействовать и провести программирование по ISP-технологии. Следуйте подсказкам скриншота:
Обратите внимание на соответствие сигналов подключения:
Для дальнейшей прошивки USBasp следует инсталлировать джампер JP2:
- Скачиваем последнюю версию ПО: https://www.fischl.de/usbasp/
- В архиве ищем файлы согласно типу своего микроконтроллера. Распаковываем, открываем.
- Запускаем Проводник Windows, переходим в каталог Arduino_dir\hardware\tools\avr\bin\, где Arduino_dir — это путь к IDE Arduino. Сюда переносим файл, о котором писали выше. Тут же вводим команду cmd, кликаем Enter.
- В командную строку следует внести: avrdude -C ..\etc\avrdude.conf -p m8 -c arduino -P com18 -b 19200 -U flash:w:usbasp.atmega8.2011-05-28.hex, где первая часть – путь к файлу (например, на диске С), p m8 – тип чипа, com – номер порта и U flash – ваше действие.
- Снова подключаем Ардуино к ПК, щелкаем Enter в интерпретаторе командной строки. Отображается процесс заливки данных, должно появиться системное сообщение: avrdude done.
С программированием всегда непросто работать, но надеемся наши подсказки и скриншоты вам помогли справиться с поставленной целью. На этом пока все! До новых встреч!
Прошиваем Arduino программатором USBASP
При замене чипа на arduino или при изготовлении самодельной Arduino часто возникает необходимость в прошивке чистого чипа Atmega328/168. У многих возникают с этим проблемы, опишу процесс по пунктам.
Для прошивки нам понадобится сама Arduino с распаянным / установленным чипом и программатор USBASP.
Из софта нужны будут следующие файлы:
Загрузчик (Bootloader) ATmegaBOOT_168_atmega328 (скачать)
Программа для прошивки и установки правильных fuse битов , я использую AVRDUDE_PROG, это таже AVRDUDE только с GUI интерфейсом. (скачать)
Теперь подключаемся к Arduino по IСSP.
Замыкаем JP3 на USBASP, так как частота нового контроллера слишком мала.
Открываем AVRDUDE_PROG, и сразу переключаемся на вкладку FUSES выставляем все как на картинке
В примере на картинке FUSES установленны для ARDUINO NANO 328!
Вот список для остальных контроллеров:
Фьюзы установленные по умолчанию в Arduino (только с ATmega328)
Arduino Uno
Low Fuse 0xFF
High Fuse 0xDE
Extended Fuse 0x05
Arduino Duemilanove or Nano w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05
Arduino BT w/ ATmega328
Low Fuse 0xFF
High Fuse 0xD8
Extended Fuse 0x05
LilyPad Arduino w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05
Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05
После прошивки FUSES прошиваем загрузчик.