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

Введение

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

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

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

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

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

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

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

Нам потребуется:

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

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

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

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

Возьмите заведомо рабочую Arduino UNO (с прошитой Атмегой на борту), подключите к компьютеру, проверьте, что всё работает. А именно – в Arduino IDE —
Убедитесь, что в Инструменты — Плата написано «Arduino/Genuino UNO”
Убедитесь, что в Инструменты – Порт указан порт с примечанием Arduino. Если это не так, выберите другой порт, проверьте, что светодиоды на плате моргают когда вы подключаете плату.
Залейте любой тестовый скетч. Например File – Примеры – Basics – Blink, залейте и убедитесь, что светодиод на схеме мигает.
Залейте на эту рабочую Arduino скетч Arduino ISP. Его можно найти в примерах в Arduino ISP: 


С этого момента эту плату можно использовать как программатор. Не переживайте – Arduino ISP это обычный скетч, вы можете прямо сейчас перезаписать его обратно на Blink и светодиод сможет мигать дальше. Ничего непоправимого не происходит. Отключим эту плату от компьютера, во избежание всяких замыканий в процессе подготовки.
Теперь нам нужно подготовить вторую плату, в которую мы будем втыкать Атмеги и прошивать им загрузчики. Возьмем вторую плату и воткнем в неё новую Atmega. На микросхеме есть такой вдавленный полукружок, он должен быть обращен в сторону, противоположную штекеру питания, вот так: 


Теперь подключаем две платы друг к другу (напоминаю, питание сейчас подавать не нужно) по такой схеме:
Порт 11 программатора соединяем с портом 11 жертвы.
Порт 12 программатора соединяем с портом 12 жертвы.
Порт 13 программатора соединяем с портом 13 жертвы.
Порт 5V программатора соединяем с портом 5V жертвы.
Порт GND программатора соединяем с портом GND жертвы.
Порт 10 программатора соединяем с портом RESET жертвы.
Фото (программатор – тот, куда USB-кабель воткнут):   

 
Теперь подключаем плату-программатор через USB (если всё правильно подключили, должны светодиоды загореться на двух платах) и в Arduino IDE устанавливаем программатор Arduino AS ISP: 


Плату и порт менять не нужно, т.к. в нашем случае и та, и другая платы – UNO, но если прошиваете что-то другое, то плату нужно изменить на плату жертвы.
Даёте команду записать загрузчик – неважно, какой скетч у вас открыт: 


Плата-программатор мигает, загрузчик успешно прошивается в плату-жертву и вы видите такое в Arduino IDE – запись завершена и avrdude не пишет ни о каких ошибках: 


Ура. Теперь вы можете записывать на микроконтроллер любые скетчи! Отключите программатор и подключите плату-жертву напрямую через USB, запишите Blink, проверьте (не забудьте в Arduino IDE сменить порт и, возможно, программатор на AVRISP mkll). Так же можете вытащить микроконтроллер из платы-жертвы и воткнуть его в плату-программатор. Ничего менять в IDE не придется, просто прошейте нужный вам скетч.
В случае, если загрузчик не установлен, при попытке заливки скетча вы можете увидеть сообщения вида «avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp 0xe0». В таком случае советую пройти все шаги по установке загрузчика заново.

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

avrdude: Device signature = 0x000000

avrdude: Yikes! Invalid device signature

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

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

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

Нет комментариев