Programming, robotics, traveling

26 Feb 2022

Прошивка 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, что это и как они связаны?):

image

Для перепрошивки через UART требуется выполнение двух условий:

  1. Наличие загрузчика в МК (его вполне может и не быть там, тогда остается только вариант с прошивкой через программатор)
  2. Для начала загрузки прошивки необходимо перезагрузить МК в очень узкое временное окно и затем начать передавать прошивку через UART. На некоторых платах отсуствует встроенный USB-RS232 преобразователь, например Arduino Pro Mini. В этом случае вы можете попробовать перезагрузить МК с кнопки на плате Arduino (у меня это получилось раза 20го). Как альтернатива, если вы используете внешний USB-RS232 преобразователь с линией DTR. Вы можете подключить этот вывод на пин RESET Arduino. Аналогичным способом подключен встроенный преобразователь на Arduino.

Для начала разберемся с тем, что нужно постоянно искать – пинами на программаторе.

Прошивка с помощью программатора

Есть множество различных программаторов, я использую USBasp (USBASP: USB AVR программатор для микроконтроллеров ATmega, ATtiny).

image

Также в качестве программатора можно использовать ещё одну плату Arduino со специальной прошивкой.

Все сложность в прошивки этим способом обеспечить корректное подключение программатора к Arduino. Также обратите внимание, что лучше запитать Arduino непосредственно от программатора.

Основная проблема в том, что на большинстве программаторов ICSP-разъём содержит 10 пинов, тогда как на всех платах Arduino, и не только, он 6ти пиновый.

image

Для прототипирования небольших проектов, я люблю использовать Arduino Nano, ниже описание выводов:

image

На некоторых программаторах, в том числе на USBasp выведены также I2C, UART-линии:

image

Для облегчения процесса перепрошивки, может быть сделан переходник. Подробнее в статье AVR ISP Разъемы (webarchive).

Иногда при прошивке с помощью программатора возникает ошибка avrdude: warning: cannot set sck period, please check for usbasp firmware update, при этом она может вызвана двумя причинами:

  1. Плохой контакт тактирующего сигнала SCK.
  2. Устаревшая прошивка на программаторе, подробнее как её обновить тут Прошивка USBasp.

Среда разработки и прошивка

Стандартная среда разработки Arduino IDE включает в себя:

  1. Магазин библиотек
  2. Текстовый редактор
  3. Набор драйвером для сериал портов (последовательных портов)
  4. Монитор последовательного порта
  5. Обертку над avrdude
  6. Компилятор

По сути весь процесс прошивки заключается в запуске 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. Я умышленно упростил и недосказал некоторые моменты, возможно я допишу это когда-нибудь.