Как сделать копию прошивки ардуино

Добавил пользователь Morpheus
Обновлено: 04.10.2024

Работать с электроникой сложнее, чем программировать. Когда программируешь, можно написать код и так, и этак, и самое страшное, что может случиться, это то, что код работать не будет. Хотя вру, страшнее, если код работать будет, но не совсем так, как задумано. В любом случае, вы всегда можете переписать кусочек кода, можете обложить его тестами или попросить знакомого проверить.

В случае с электроникой всё не так – если что-то вы не рассчитали или припаяли не туда, то свист или белый дымок сообщат вам, что пора бежать в магазин за новыми комплектующими. А если закупаете с алиэкспресса, то придется отложить эксперимент на пару недель.

Ошибаться в программировании – дешево, в электронике – дорого. К сожалению.

К счастью, в Arduino UNO используется микроконтроллер Atmega328P-PU, который, в случае выхода из строя, можно вытащить и заменить. При этом сам микроконтроллер стоит около 100 рублей (при цене оригинального Ардуино – 2 000р, хорошего клона – 500 рублей.) Вот он:

Заливаем загрузчик для Arduino UNO с помощью другой UNO

Вы можете заказать себе пачку таких микросхем, и в дальнейшем в своих решениях не пихать везде целую ардуину, а только вытаскивать и использовать запрограммированный микроконтроллер. Это удешевит вашу разработку и сделает размеры более компактными, что иногда ну очень хорошо.

К сожалению, нельзя взять нулевую Атмегу 328, вставить в ардуино и залить скетч – сначала нужно залить на неё загрузчик. По сути это означает, что некоторые перемычки внутри схемы должны быть установлены в нужные положения. Завод изначально этого не делает, т.к. загрузчик все-же занимает ценные байты памяти, и взрослые дяди во взрослых производствах не прошивают ардуины скетчами. Но нам то надо! Поэтому давайте разберемся, как подготовить микроконтроллер к работе с ардуино с помощью самодельного загрузчика.

Заливка загрузчика (он же Bootloader)

  1. Arduino UNO – 2 шт
  2. Atmega328P-PU с загрузчиком – 1 шт
  3. Atmega328P-PU новая – 1 и больше, по вкусу

В каждое Arduino (я не определился с полом этого устройства, так что мужской, женский и средний род в статье легко меняет друг-друга) можно заливать сценарии двумя способами – непосредственно напрямую и через другую ардуину.

Непосредственно напрямую заливать, вы, наверное, умеете, раз читаете эту статью – подключаем Arduino через USB, запускаем Arduino IDE, скачанное с официального сайта, пишем нужный скетч (или выбираем File – Примеры – Basics – Blink), нажимаем Скетч-Загрузка (или стрелку сверху), и вуаля – светодиод мигает.

Но наша цель – записать загрузчик на нулевую Атмегу, так что придется выполнить несколько действий.

Заливаем загрузчик для Arduino UNO с помощью другой UNO

  1. Возьмите заведомо рабочую Arduino UNO (с прошитой Атмегой на борту), подключите к компьютеру, проверьте, что всё работает. А именно – в Arduino IDE -
    1. Убедитесь, что в Инструменты - Плата написано «Arduino/Genuino UNO”
    2. Убедитесь, что в Инструменты – Порт указан порт с примечанием Arduino. Если это не так, выберите другой порт, проверьте, что светодиоды на плате моргают когда вы подключаете плату.
    3. Залейте любой тестовый скетч. Например File – Примеры – Basics – Blink, залейте и убедитесь, что светодиод на схеме мигает.
    1. Порт 11 программатора соединяем с портом 11 жертвы.
    2. Порт 12 программатора соединяем с портом 12 жертвы.
    3. Порт 13 программатора соединяем с портом 13 жертвы.
    4. Порт 5V программатора соединяем с портом 5V жертвы.
    5. Порт GND программатора соединяем с портом GND жертвы.
    6. Порт 10 программатора соединяем с портом RESET жертвы.
    7. Фото (программатор – тот, куда USB-кабель воткнут):

    Так же, при попытке заливки загрузчика вы можете увидеть ошибки вида:

    avrdude: Device signature = 0x000000

    avrdude: Yikes! Invalid device signature

    В редких случаях это может означать, что загрузчик уже установлен (и вы можете это проверить, попробовав залить скетч напрямую), либо что Атмега, увы, мертвая. Ну, или вторая плата UNO работает как-то не так, что вряд-ли, но тоже можно проверить.

    Кстати говоря, у меня есть такая UNO – я не могу заливать через неё скетчи напрямую, получаю ошибку stk500_getsync, на ней не работают прошитые скетчем атмеги, она вообще практически не пашет, но зато её можно использовать как жертву для программатора – вот такие дела)

    Надеюсь, информация оказалась для вас полезной, для обсуждения/дополнения и просто так добро пожаловать в комментарии!


    Начиная с версии 0018, в Arduino IDE нет возможности сохранять .hex файл в папку с скетчем. Но не стоит отчаиваться - выход естественно есть)
    Запускаем нашу Arduino IDE, и открываем наш "любимый" скетч, нажимаем Verify:

    Дальше, открываем проводник и пишем там %temp%\ и нажимаем Enter:


    Находим там папки с именами buildXXXXXXXXXXXXXXX.tmp:



    В каждой из этих папок будет куча файлов, нас интересует файл Blink.cpp.hex - это и есть наш скомпилированный Blink, который можно заливать на микросхему (или, скормить Proteus-у ))))

    Примечание
    Когда вы производите изменения с исходным текстом скетча, то папка buildXXXXXXXXX.tmp очищается автоматически, и вам надо заного нажать Verify, чтобы в ней появились файлы. На самом деле, даже удобно, если сделали изменения, но не сохранили - протеус, к примеру, начинает сразу кричать вопить, мол, файла то нету, куда файл дели)

    Комментарий от RA3TOX

    Для записи я использую программатор USBASP и программу AVRDUDE_PROG v.3.3.

    Для микропроцессора с кварцем на 16 МГц фьюзы выставляются следующим образом:


    Можно скомпилировать скетч для работы микропроцессора с внутренней синхронизацией (без кварцевого резонатора). Данные для этого проекта можно взять здесь: ArduinoToBreadboard.
    Для микропроцессора без кварцевого резонатора фьюзы выставляются так:

    Некоторые проекты для Arduino распространяются не в виде файлов скетчей (*.ino), а в виде hex-файлов (*.hex). Я расскажу, как прошить такой файл в Arduino.

    Получение hex-файла

    Arduino Экспорт бинарного файла

    Как получить hex-файл для своего проекта или скачанного скетча? Для получения hex-файла, соответствующего требуемому скетчу, необходимо открыть этот скетч (например, bike.ino) в Arduino IDE (я использую версию 1.6.6) и выбрать в меню Скетч (Sketch) команду Экспорт бинарного файла (Export Compiled Binary):

    Arduino hex-файлы

    После этого происходит компиляция и в папке скетча появляются два hex-файла (для скетча bike.ino - bike.ino.eightanaloginputs.hex и bike.ino.with_bootloader.eightanaloginputs.hex):

    Hex-файл имеет текстовый формат и состоит из строк вида
    :100020000C94DF030C94DF030C94DF030C94DF03C8

    Arduino загрузчик

    Отличие этих двух файлов заключается в наличии в файле *.ino.with_bootloader.eightanaloginputs.hex загрузчика Arduino:

    Прошивка hex-файла

    Arduino номер порта

    Как же прошить имеющийся hex-файл? Сначала необходимо подключить прошиваемую плату (я использую Arduino Nano 3.0) к USB-порту компьютера и узнать COM-порт подключения. Номер порта можно посмотреть в Arduino IDE в меню Инструменты (Tools):

    Для прошивки hex-файла *.ino.eightanaloginputs.hex (для рассматриваемого скетча - bike.ino.eightanaloginputs.hex) в микроконтроллер платы Arduino используется программа AVRDude - AVR Downloader-Uploader, предназначенная для прошивки микроконтроллеров AVR.

    Arduino прошивка avrdude

    В результате в папке avrdude содержатся три файла:

    В эту же папку следует скопировать прошиваемый hex-файл (в рассматриваемом примере - файл bike.ino.eightanaloginputs.hex).

    avrdude версия

    В Arduino IDE версии 1.6.6 представлена программа avrdude версии 6.0.1

    avrdude команда

    Затем в консоли требуется ввести команду:

    -v : вывод подробной информации
    -patmega328p : указание типа микроконтроллера
    -c arduino : указание программатора - программатор, используемый Arduino IDE
    -P com11 : указание номера COM-порта (COM11)
    -b 57600 : указание скорости COM-порта (57600 бод)
    -D : не выполнять очистку FLASH-памяти микроконтроллера.
    -U flash:w:"bike.ino.eightanaloginputs.hex":i : w - запись flash - во FLASH-память i - файла в формате Intel Hex

    Arduino hex-файлы

    После ввода команды выполняется прошивка hex-файла в Arduino:

    Готово!

    Давайте немного отвлечемся от создания нашего робота и поговорим о том, как мы будем записывать прошивку в Arduino.

    Нас, прежде всего, интересуют три платы Arduino:
    — Arduino Uno – как самый распространенный вариант
    — Arduino Nano – компактный вариант, удобный для применения в небольших конструкциях
    — Arduino Pro Mini – дешевый компактный вариант без встроенного USB-UART преобразователя (для работы с ним понадобится внешний USB-UART преобразователь), но удобный в случае применения сети устройств.

    Во всех вышеописанных платах используется микроконтроллер ATmega328 (в более старых версиях ATmega168).

    Одной из главных причин выбора платы Arduino для проекта робота была возможность записывать прошивку устройства в МК не применяя программатора и каких либо дополнительных устройств. Все что нужно для прошивки микроконтроллера Arduino – это стандартный USB шнур (который входит в комплект Arduino).


    Это значит, если Вы имеете Ардуину – Вы имеете любое устройство ZiChip!

    Запись программы в МК через USB происходит через специальный загрузчик (Bootloader), который записан в МК при изготовлении платы. Вообще, загрузчик предназначен для работы со своим специальным программным обеспечением Arduino IDE, но в случае, когда необходимо прошить в Ардуину что-то постороннее (свой Hex-файл), есть программки позволяющее это реализовать.

    Начнем, конечно, с моей программы загрузчика
    GC-Uploader


    Программа интересна тем, что выбранный HEX-файл будет заливаться в Ардуину автоматически после каждого его изменения. Это удобно, так как при разработке проекта каждая компиляция (обновление хекса) будет инициировать прошивку Ардуины — Вам ничего не придется делать самому! Кроме того в программе есть и ручной режим прошивки.

    Следующая — маленькая и удобная
    XLoader (Arduino HEX uploader)


    Программка имеет аскетичный интерфейс и работать с ней предельно просто:
    — подключаем Arduino в USB-порт (отдельного питания не нужно)
    — выбираем Hex файл
    — выбираем тип Вашего Arduino
    — выбираем COM порт, который создался при подключении Arduino к USB (скорость порта автоматически подставится при выборе типа Arduino)
    — жмем Upload

    Это все! Ничего сложного. Прошивка через несколько секунд будет записана в МК и автоматически запустится. Один минус – программа никак не сообщает о том, что прошивка уже записана, но это можно увидеть по прекращению мерцания светодиодов RXD и TXD на Ардуине.

    XLoader использует для записи прошивки AVR Dude и в качестве протокола программирования используется STK500. Но, похоже, в настройках AVR Dude, произведена коррекция, так как использование стандартного AVR Dude с такими же настройками не дает результатов.

    Автоматизация XLoader.


    Как и предыдущая, программка имеет простой интерфейс.
    Процесс прошивки тот же:
    — подключаем Arduino в USB-порт (отдельного питания не нужно)
    — выбираем Hex файл
    — выбираем тип Вашего Arduino
    — выбираем COM порт
    — жмем Upload

    Программа при записи открывает дополнительные окна и визуально отображает свои действия, что позволяет следить за процессом записи.

    Автоматизация ARP Uploader.
    ARP Uploader как и XLoader работает через AVR Dude, но, в отличие от XLoader, показывает командную строку. Это дает возможность использовать AVR Dude напрямую в Make или Bat файле.

    Дополнительные материалы.
    Драйвера Arduino.

    Загрузчики Arduino

    Если Вы решите собрать свою плату Arduino (а сложного там ничего нет, фактически, это голый ATmega328 или ATmega168), Вам понадобится загрузчик Bootloader который должен содержать МК для работы со средой (или программками для заливки Hex-файлов). Конечно, Вам для записи Hex-файлов в чистый МК понадобится программатор и придется выставить фьюзы.

    Схемы Arduino

    Фьюзы установленные по умолчанию в 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

    Читайте также: