Arduino ISP программатор для ATtiny, Минимальная Arduino

image

  • Цена: $5.00

Какое-то время у меня валялась Arduino Uno. И вот нашлось ей применение. Сделал удобный шилд для прошивки ходовых контроллеров в разных корпусах. Теперь данная отладочная плата активно используется. Шилд позволяет прошивать довольно много контроллеров от ATMEL, которые все еще популярны среди самодельщиков по многим параметрам. Итак, под катом изготовление шилда для прошивки микроконтроллеров Atmega8 (168/328), Attiny13(45/85), причем, как в DIP корпусах, так и в QFP и SOIC, используя адаптеры. Ссылку я дал на похожую отладочную плату Arduini Uno, поскольку уже и не помню где брал свою. Моя платка с закосом под оргинал (конечно же это копия — поскольку брал в Китае): image Собственно, тут уже было немало обзоров на эту плату, поэтому перейдем сразу к шилду. Схема шилда, довольно простая: Конденсатор C4 позволяет не перезагружаться самой Arduino Uno во время прошивки, без него такое бывает и прошить не удается. На схеме видно два разъема для подключения контроллеров в корпусах dip28 и dip8. Для dip28 предусмотрен кварц с конденсаторами С2 и С3. Также на плате предусмотрен стандартный разъем ICSP для подключения, например, своих плат и их прошивки. Как и при типовом использовании, вывод 10 Arduino соединен с RESET программируемых контроллеров. Выводы 11, 12,13, представляющие ICSP соединены с аналогичными на подключаемых микроконтроллерах. На подключаемые контроллеры подается питание и земля от Arduino Uno. К выводам Arduino 7,8,9 через токоограничительные резисторы в 1КОм подключены индикационные светодиоды. Наш шилд позволит прошивать популярные контроллеры: Atmega8 (168/328), Attiny13(45/85), причем, как в DIP корпусах, так и в QFP и SOIC, используя адаптеры. Платка получилась такая: Желающие могут скачать файл платы, в формате для Sprint Layout. Также можно скачать готовые для заказа в Китае (или на местном производстве) gerber-файлы. На плате видны две версии отверстий для dip28 в узком и широком корпусе, это сделано для подключения адаптера QFP32 в DIP28, обзор которого я делал здесь. Кроме того, если припаять разъем для узкой версии контроллера, то в отверстия для широкой версии можно припаять линейки штырьков и сразу тестировать прошитый контроллер. Для dip8 я также предусмотрел, помимо адаптера, отверстия для штырьков. Также имеются две версии ICSP разъемов широкий (10 контактов) и узкий (6 контактов), ну и все остальные детали, присутствующие на схеме. Светодиоды, резисторы и конденсаторы (22пФ) я использовал SMD 1206. Светодиоды распределил так: Зеленый — READY, Красный — ERROR, Желтый — PROG. Также предусмотрел штырьки для дополнительного питания и земли, которые могут потребоваться при тестировании прошиваемого контроллера. Платы я заказывал в dirtypcbs.com, скорее всего я бы изготовил их ЛУТ-ом, но данный сервис разрешает панелизацию, а у меня как раз нашлось подходящее место на плате в заказе, да и спешки особой не было. Заводская плата выглядит все-таки гораздо лучше. Вот так они выглядят: Припаиваем детали, я изготовил 2 версии, для широкого dip28: Здесь я не стал припаивать штырьки и разъемы, так как планирую эту плату использовать для прошивки контроллеров с помощью адаптеров в корпусах SOIC и QFP. Для узкого dip28: Как видно из фото, для подключения микросхем в dip корпусах я использовал цанговые разъемы, мне они нравятся больше. Адаптер QFP32 в DIP28 для подключения в широкую версию шилда: Встает отлично: Весь бутерброд, включая Arduino Uno: Для узкой версии со вставленным контроллером ATtiny85: Для прошивки контроллеров в SOIC8 корпусе я использую также адаптер: Для того чтобы наша конструкция стала программатором, следует без шилда загрузить в Arduino Uno прошивку ArduinoISP, идущую в комплекте с любой версией Arduino IDE: С таким шилдом стало очень удобно и быстро прошивать и тестировать контроллеры в различных корпусах, не боясь нарушить соединения как здесь: Пример загрузки программы мигания диодом с помощью шилда и проверка его работы на месте: На этом заканчиваю. Спасибо всем, кто дочитал до конца! Надеюсь, что кому-то приведенная информация окажется полезной. Всех со странным праздником: Старым Новым Годом! Есть у меня пара идей для будущих публикаций, но в них будет использоваться программатор. Поэтому сегодня я расскажу о том, как превратить Ардуино в ISP программатор, для чего он нужен и как им пользоваться. А в качестве примера будет описана процедура прошивки загрузчика в Ардуино.

Что такое ISP?

ISP (In-System Programming) расшифровывается как внутрисхемное программирование. Это технология, которая позволяет программировать микроконтроллер, установленный в устройство. До появления этой технологии микроконтроллеры программировались перед установкой в устройство, а для их перепрограммирования требовалось их извлечение из устройства. Существует 2 основных подхода внутрисхемного программирования:

  • С использованием программатора. В этом случае программатор работает напрямую с памятью микроконтроллера, самостоятельно размещая байты прошивки по нужным адресам. Микроконтроллер в этом процессе не участвует.
  • С использованием загрузчика. Загрузчик, он же бутлоадер (от английского bootloader) — это программа, записанная обычно в конце ПЗУ микроконтроллера, которая берет на себя функции программатора. При включении микроконтроллера управление сначала передается загрузчику. Он проверяет наличие определенных условий, сообщающих о необходимости перейти в режим программирования. Если условия не выполнены, то управление передается основной программе, в противном случае загрузчик принимает данные по заранее определенному интерфейсу и размещает их в ПЗУ. Таким образом микроконтроллер перепрограммирует сам себя.

Одной из важнейших особенностей Ардуино является возможность программирования непосредственно через USB порт, без дополнительного программатора. Сразу после включения Ардуино запускается загрузчик, который работает несколько секунд. Если за это время загрузчик получает команду программирования от IDE по последовательному интерфейсу UART, то он принимает и загружает новую программу в память микроконтроллера. Использование загрузчика существенно упрощает процесс перепрограммирования микроконтроллера, что особенно полезно при отладке. Но за удобство приходится платить. Во-первых, загрузчик занимает часть ПЗУ и для программы пользователя остается меньший объем памяти. Во-вторых, загрузчик не может изменить Fuse-биты и Lock-биты (в отличие от программаторов). Ну и, конечно, не обойтись без программатора, если вы хотите обновить бутлоадер или загрузить его в чистый МК. Таким образом существует ряд задач, которые могут быть выполнены только с использованием программатора. Если же у вас нет аппаратного программатора, то вместо него можно воспользоваться Ардуино, о чем и будет рассказано дальше.

Arduino as ISP. Прошивка загрузчика в Ардуино.

Итак, мы решили превратить Ардуино в программатор. Для примера попробуем прошить загрузчик в целевую плату Ардуино. Сначала подготовим плату, которую будем использовать в качестве программатора. Для этого загрузим в нее скетч ArduinoISP, его можно найти в стандартных примерах: Теперь подсоединим к ней плату, в которую хотим прошить загрузчик. При прошивке используются линии SPI (Serial Peripheral Interface — последовательный периферийный интерфейс). Выводы MOSI, MISO и SCK обеих плат должны быть соединены, а вывод SS Ардуино-программатора подключается к выводу Reset целевой платы. И еще 2 провода нужны чтобы запитать целевую плату. Также может потребоваться предотвратить автоматическую перезагрузку платы-программатора, для этого между ее выводами Reset и GND нужно установить электролитический конденсатор на 10мкФ. Сначала можно попробовать без конденсатора, если же прошивка не начнется, то попробуйте добавить в схему конденсатор. По моим наблюдениям конденсатор нужен при использовании дешевых Ардуино-клонов (без контроллера ATmega8u2) в качестве программатора. Если мы работаем с двумя платами Arduino Uno, то схема их подключения может выглядеть следующим образом: Если используются не Uno, а другие платы Ардуино, то перед подключением программатора к целевой плате необходимо уточнить расположение на них выводов MOSI, MISO и SCK. Их расположение для различных плат приведено ниже в таблице. Как вы можете видеть, не на всех платах Ардуино линии SPI мультиплексированны с цифровыми выводами, поэтому для подключения к данному интерфейсу необходимо использовать разъем ICSP. Ниже показан пример подключения Uno в качестве программатора к плате Nano через ICSP разъем.

Плата Ардуино MOSI MISO SCK Уровень
Uno, Duemilanove 11 или ICSP-4 12 или ICSP-1 13 или ICSP-3
Nano 11 или ICSP-4 12 или ICSP-1 13 или ICSP-3
Pro Mini 11 12 13 3.3В или 5В
Mega1280, Mega2560 51 или ICSP-4 50 или ICSP-1 52 или ICSP-3
Leonardo ICSP-4 ICSP-1 ICSP-3 
Due ICSP-4 ICSP-1 ICSP-3  3.3В
Zero ICSP-4 ICSP-1 ICSP-3 3.3В
101 11 или ICSP-4 12 или ICSP-1 13 или ICSP-3 3.3В
Подключение Uno в качестве программатора к плате Nano через ICSP

Обратите внимание на нумерацию выводов ICSP платы Nano: она начинается с правого нижнего угла. Поэтому на приведенной схеме Arduino Nano перевернута. Теперь необходимо вернуться в Arduino IDE и изменить в ней параметры:

  1. В меню Инструменты > Плата выбираем вариант, соответствующий нашей целевой плате.
  2. В меню Инструменты > Программатор выбираем Arduino as ISP.

Подключаем плату-программатор к компьютеру, открытый в данный момент скетч значения не имеет, выбираем пункт меню Инструменты > Записать загрузчик и дожидаемся сообщения об успешном завершении операции. На этом прошивка бутлоадера в Ардуино завершена. Кроме того процедура прошивки бутлоадера включает в себя установку фьюзов микроконтроллера. Подробнее о фьюзах будет рассказано в следующей публикации. Резюмируя вышеописанное, выделим основные шаги для прошивки загрузчика с использованием Ардуино в качестве ISP программатора:

  • Запускаем Arduino IDE, открываем из примеров скетч ArduinoISP и загружаем его в плату Ардуино, которую будем использовать как программатор.
  • Подключаем к Ардуино-программатору целевую плату по приведенной схеме.
  • Меняем плату в Arduino IDE на целевую.
  • Выбираем в IDE программатор Arduino as ISP.
  • Записываем загрузчик в целевую плату командой из меню IDE.

Прошивка скетча с использованием Arduino as ISP

Еще один пример использования программатора — это загрузка скетча в целевую плату. Разумеется, это проще сделать привычным способом, подключив ее напрямую к компьютеру, но это может оказаться невозможным, например, при выходе из строя контроллера ATmega8u2/ATmega16u2 или преобразователя USB/UART. Если при этом основной микроконтроллер Ардуино остался рабочим, то мы можем прошить его, используя программатор. Для этого выполняем все шаги, описанные выше, но на последнем этапе вместо записи загрузчика необходимо:

  • Открыть в Arduino IDE интересующий скетч.
  • Загрузить скетч в целевую плату командой из меню IDE: Скетч > Загрузить через программатор.

Таким образом можно подарить вторую жизнь плате Ардуино, которую компьютер уже не видит через USB.

Итак, в предыдущем уроке мы наконец то доделали простенький автомат освещения. В принципе осталось всего ничего- заливаете скетч в любую Ардуину, собираете схему и… все! Все работает! Но! Давайте теперь попробуем посчитать денежный эквивалент самого устройства. Будем исходить из самой низкой стоимости деталей.

  1. Собственно сам контроллер Ардуино. Естественно для такого небольшого устройства нужно брать что то небольшое, тоже Nano или Pro-Mini. По сравнению с Ардуино Уно они стоят почти в 3 раза дешевле. Нано кроме того имеет контроллер интерфейса и является полной копией Ардуино Уно только небольшого размера. Очень удобно заливать прошивку без всяких сторонних программаторов и переходников (об этом чуть ниже). Итого стоимость Ардуино Нано около 120 руб вместо 300 руб Ардуино Уно.
  2. Модуль реле KY-019. Цена всего около 50-60 рублей за блок с одним реле.
  3. Блок питания (БП) на 5В. На Али есть БП мощностью несколько Ватт и стоимостью около 40 руб. Стоит посчитать мощность БП для устройства. Реле потребляет около 200 мА, Ардуино- берите еще 50 мА, ну и светодиоды, допустим 3 штуки по 20 мА=3х20=60 мА. Т.е. потребляемый ток будет равен 200+50+60=310 мА. Значит БП нужен мощностью  не менее 5В х 0,31 А=1,55 Вт. Стоит учесть еще потери самого БП, т.е по идее БП на 3 Вт должно хватить. Итого еще 50 руб. Можно конечно поставить старый зарядник от сотового телефона с током не менее 0,3 А. Это будет более правильно и, кроме того, бесплатно.

Кнопки считать не будем т.к. их можно где нибудь выковырять. Вместо кнопок можно поставить различные датчики но это будет в следующем уроке, когда мне придут датчики из Китая. Вобщем посчитаем стоимость только одной Ардуины. 130 рублей. Немного. Но давайте также прикинем другие варианты. Скетч занимает 1,63 кБ. В Ардуино на 328 контроллере находится 32 кБ памяти. Это больше требуемого в 32/1,63=19,6 раз. Почти в 20 раз!!! Мне лично жаль тратить такой контроллер на такой небольшой скетч. Какой же выход можно найти из сложившейся ситуации? Взять контроллер с меньшим объемом памяти и прошить его так же как и Ардуино! Давайте посмотрим какие еще контроллеры есть в семействе Атмега.

Микроконтроллеры семейства TinyAVR

Тип

Напр.

Такт.

I/O Flash EEPROM SRAM АЦП Таймеры ISP Корпус
 ATtiny11 2.7-5.5 6 6 1K 1x8bit PDIP8 SOIC8
 ATtiny12 1.8-5.5 6 6 1K 64 1x8bit I PDIP8 SOIC8
 ATtiny13 1.8-5.5 20 6 1K 64 64 4x10bit I PDIP8 SOIC8
 ATtiny15L 2.7-5.5 6 6 1K 64 4x10bit 2x8bit I PDIP8 SOIC8
 ATtiny2313 1.8-5.5 20 15 2K 128 128 I PDIP20 SOIC20 MLF32
 ATtiny24 1,8…5,5 20 12 2K 128 128 8x10bit S PDIP14 MLF20 SOIC14
 ATtiny25 2,7…5,5 20 32 2K 128 128 4x10bit I PDIP8 SOIC8
 ATtiny25 Automotive 2,7…5,5 16 32 2K 128 128 4x10bit I SOIC8
 ATtiny25V 1.8 — 5.5 10 32 2K 128 128 4x10bit I PDIP8 SOIC8
 ATtiny26 2.7-5.5 16 16 1K 128 128 11x10bit 2x8bit I PDIP20 SOIC20 MLF32
 ATtiny261 1.8-5.5 20 16 2K 128 128 11x10bit I PDIP20 SOIC20 MLF32
 ATtiny461 1.8-5.5 20 16 4K 256 256 11x10bit I PDIP20 SOIC20 MLF32
 ATtiny28L 1.8-5.5 4 20 2K 1x8bit PDIP28 TQFP32 MLF32
 ATtiny44 1,8…5,5 20 12 4K 256 256 8x10bit S PDIP14 MLF20 SOIC14
 ATtiny45 2,7…5,5 20 32 4K 256 256 4x10bit I PDIP8 SOIC8
 ATtiny45 Automotive 2,7…5,5 20 32 4K 256 256 4x10bit I SOIC8
 ATtiny45V 1.8 — 5.5 10 32 4K 256 256 4x10bit I PDIP8 SOIC8
 ATtiny84 1,8…5,5 20 12 8K 512 512 8x10bit S PDIP14 MLF20 SOIC14
 ATtiny85 2,7…5,5 20 32 8K 512 256 4x10bit I PDIP8 SOIC8
 ATtiny85 Automotive 2,7…5,5 20 32 8K 512 256 4x10bit I SOIC8
 ATtiny85V 1.8 — 5.5 10 32 8K 512 256 4x10bit I PDIP8 SOIC8
 ATtiny861 1.8-5.5 20 16 8K 256 256 11x10bit I PDIP20 SOIC20 MLF32

Классические AVR-микроконтроллеры

Тип

Напр.

питания, В

Такт. Частота, МГц I/O Flash EEPROM SRAM АЦП Таймеры ISP Корпус
 AT90PWM1 2.7-5.5 16 19 8K 0.5 512 8x10bit I SO24
 AT90PWM2 2.7-5.5 16 53 8K 512 512 8x10bit 2 I SO24
 AT90PWM3 2.7-5.5 16 53 8K 512 512 11x10bit 2 I SO32, QFN32
 AT90S1200 15 1K 64 1x8bit I DIP20 SO20 SSOP20
 AT90S2313 15 2K 128 128 UART I DIP20 SO20
 AT90LS2323 2.7-6.0 4 3 2K 128 128 1x8bit I DIP8 SO8
 AT90S2323 4.0-6.0 10 3 2K 128 128 1x8bit I DIP8 SO8
 AT90LS2343 2.7-6.0 4 5 2K 128 128 1x8bit I DIP8 SO8
 AT90S2343 4.0-6.0 10 5 2K 128 128 1x8bit I DIP8 SO8
 AT90LS4433 2.7-6.0 4 20 4K 256 128 6x10bit I DIP28 TQFP32
 AT90S4433 4.0-6.0 8 20 4K 256 128 6x10bit I DIP28 TQFP32
 AT90LS8515 2.7-6.0 4 32 8K 512 512 I DIP40 TQFP44 PLCC44
 AT90S8515 4.0-6.0 8 32 8K 512 512 I DIP40 TQFP44 PLCC44
 AT90LS8535 2.7-6.0 4 32 8K 512 512 8x10bit I DIP40 TQFP44 PLCC44
 AT90S8535 4.0-6.0 8 32 8K 512 512 8x10bit I DIP40 TQFP44 PLCC44

Микроконтроллеры семейства MegaAVR

Тип Напр. питания, В Такт. Частота, МГц I/O Flash EEPROM SRAM АЦП Таймеры ISP Корпус
 ATmega406 4.0 — 25 1 18 40K 512 2K LQFP48
 ATmega48 1.8-5.5 20 23 4K 256 512 UART SPI I2C S DIP28 TQFP32 MLF32
 ATmega48 Avtomotove 2.7-5.5 16 23 4K 256 512 UART SPI I2C S TQFP32 MLF32
 ATmega88 1.8-5.5 20 23 8K 512 1k UART SPI I2C S DIP28 TQFP32 MLF32
 ATmega88 Avtomotove 2.7-5.5 20 23 8K 512 1k UART SPI I2C S TQFP32 MLF32
 ATmega168 1.8-5.5 20 23 16K 512 1k UART SPI I2C S DIP28 TQFP32 MLF32
 ATmega168 Avtomotove 2.7-5.5 20 23 16K 512 1k UART SPI I2C S TQFP32 MLF32
 ATmega8 2.7-5.5 16 23 8K 512 1k 8x10bit S DIP28 TQFP32 MLF32
 ATmega16 2.7-5.5 16 32 16K 512 1k 8x10bit S DIP40 TQFP44 MLF44
 ATmega32 2.7-5.5 16 32 32K 1K 2K 8x10bit S DIP40 TQFP44 MLF44
 ATmega64 2.7-5.5 16 53 64K 2K 4K 8x10bit S TQFP64 MLF64
 ATmega640 86 64K 4K 8K 16x10bit I TQFP100
 ATmega128 2.7-5.5 16 53 128K 4K 4K 8x10bit S TQFP64 MLF64
 ATmega1280 86 128K 4K 8K 16x10bit I TQFP100
 ATmega1281 54 128K 4K 8K 8x10bit I TQFP64
 AT90CAN32 2.7-5.5 16 53 32K 1K 2048 8x10bit S MLF 64 LQFP 64
 AT90CAN64 2.7-5.5 16 53 64K 2K 4K 8x10bit S MLF 64 LQFP 64
 AT90CAN128 2.7-5.5 16 53 128K 4K 4K 8x10bit S TQFP64 MLF64
 AT90CAN128 Automotive 2.7-5.5 16 53 128K 4K 4096 8x10bit S MLF64 LQFP64
 ATmega103 4.0-5.5 6 48 128K 4K 4K 8x10bit I TQFP64
 ATmega161 2.7-5.5 8 35 16K 512 1K S DIP40 TQFP44
 ATmega162 1.8-5.5 16 35 16K 512 1K S DIP40 TQFP44 MLF44
 ATmega163L 2.7-5.5 8 32 16K 512 1K 8x10bit S DIP40 TQFP44 MLF44
 ATmega164P/V 1.8-5.5 16 32 16K 512K 1024 8x10bit S MLF44 PDIP40 TQFP44
 ATmega165 53 16K 512 1K 8x10bit S TQFP64 MLF64
 ATmega165P 1.8-5.5 16 54 16K 0.5 1024 8x10bit S MLF64 TQFP64
 ATmega169 1.8-3.6 4 16K 512 1K 8x10bit S TQFP64
 ATmega169P 1.8-5.5 16 54 16K 0.5 1024 8x10bit S MLF64 TQFP64
 ATmega8515 2.7-5.5 16 35 8K 512 512 S PDIP40 PLCC44 TQFP,MLF
 ATmega8535 2.7-5.5 16 32 8K 512 512 8x10bit S PDIP40 PLCC44 TQFP MLF
 ATmega2560 86 256K 4K 8K 16x10bit I TQFP100
 ATmega2561 54 256K 4K 8K 8x10bit I TQFP64
 ATmega324P/V 1.8-5.5 20 32 32K 1K 2048 8x10bit S MLF44 PDIP40 TQFP44
 ATmega325 1.8-5.5 16 53 32K 1K 2K 8x10bit S TQFP MLF
 ATmega3250 1.8-5.5 16 68 32K 1K 2K 8x10bit S TQFP MLF
 ATmega325P 1.8-5.5 20 54 32K 1K 2048 8x10bit S MLF64 TQFP64
 ATmega3250P 1.8-5.5 20 54 32K 1K 2048 8x10bit S TQFP100
 ATmega329P 1.8-5.5 16 54 32K 1K 2048 8x10bit S MLF64 TQFP64
 ATmega3290P 1.8-5.5 16 54 32K 1K 2048 8x10bit S TQFP100
 ATmega644P/V 1.8-5.5 20 32 64K 2K 4096 8x10bit S MLF44 PDIP40 TQFP44
 ATmega645 1.8-5.5 16 53 64K 2K 4K 8x10bit S TQFP MLF
 ATmega6450 1.8-5.5 16 68 64K 2K 4K 8x10bit S TQFP MLF
 ATmega644 32 64K 2K 4K 8x10bit S PDIP40 TQFP44 MLF44
 ATmega329 1.8-5.5 16 32K 1K 2K 8x10bit S TQFP MLF
 ATmega3290 1.8-5.5 16 32K 1K 2K 8x10bit S TQFP MLF
 ATmega649 1.8-5.5 16 64K 2K 4K 8x10bit S TQFP MLF
 ATmega6490 1.8-5.5 16 64K 2K 4K 8x10bit S TQFP MLF
  1. Объем памяти. Действительно, если представить что нам нужно 4 кБ памяти и взять, например, ATtiny25 то памяти просто не хватит т.к. этот МК имеет всего 2 кБ памяти. Поэтому лучше брать все таки побольше. Я бы выбрал  ATtiny85. Там уже 8 кБ памяти и, если будет доработка функционала, есть некоторый буфер для программы.
  2. Количество выводов. Это наверное даже поважнее чем п.1. Все упирается в количество портов ввода-вывода. На выводы конечно можно подключать устройства I2C и поадресно их опрашивать и выводить информацию. Но с I2C такие МК работают достаточно медленно. В нашем случает с  ATtiny85 есть 8 выводов (корпус PDIP8 SOIC8, т.е. 8 выводов), из которых 2 питание а остальные 6 мы смело можем использовать! Нам при изготовлении нужно: 1 вывод на кнопки, 1 вывод на светодиоды, 1 вывод на реле. Свободными остаются еще 3 вывода! Т.е. нам хватит и памяти и выводов. Тем более её размер. В корпусе PDIP8 их уместится несколько штук на ногте! Цена вопроса. Тиньки (ATtiny контроллеры так называют радиолюбители) вместе с контроллером для программирования через USB порт стоят около 80 руб. Уже дешевле. Но что странно. В Китае просто МК стоят дороже чем готовое устройство! Нонсенс!
  3. Напряжение питания. Дальше мы рассмотрим работу с фьюзами. Так вот именно эти внутренние переключатели указывают как будет работать МК.  С чем это можно сравнить. Например вы написали программу на компьютере. Включаете компьютер и.. компьютер не включился. Почему спросите вы? Ну причин может быть много: неисправный БП (1 причина), процессор (2), память (3) и т.д… а может быть просто слетел БИОС. Так вот именно фьюзы и работают как БИОС на компьютере- они указывают как будет работать собственно ядро МК. Можно выставить частоту работы ядра, от какого генератора синхронизируется МК, внешнего или внутреннего, пределы допустимого напряжения питания при которых МК будет работать. Ту же 85 тиньку можно питать напряжением от 2,7 до 5,5 В. Достаточно просто правильно выставить фьюзы.

Вобщем будем выбирать контроллер с Flash- памятью (туда именно и записывается наш код программы) не менее 8 кБ и как можно дешевле (здесь не говорится о минимизации, если нужно миниатюрное устройство то стоит поискать МК для поверхностного монтажа в корпусах TQFP и SO). Возьмем мой любимый МК ATmega8. Его достоинства: 8 кБ памяти, 28 выводов (из них около 20- наши), имеется 512 байт энергонезависимой памяти в которую мы можем сохранять и считывать необходимые данные. Цена- около 50-60 руб за штуку в Китае. Итого мы удешевили наш проект только по МК уже не менее чем в 2 раза. Осталось научиться запрограммировать МК.

Мы рассмотрим 3 программы для программирования МК. Это будет собственно сама оболочка Arduino IDE, AVRDUDESHELL и Sinaprog. Самая простая- Sinaprog но ей необходимо подготовить hex- файл в Arduino IDE. Самая навороченная- AVRDUDESHELL. Но начнем мы все таки с  Arduino IDE т.к. без нее никуда и ей просто надо уметь пользоваться. Приступаем к программированию.

Как запрограммировать Atmega с помощью Arduino и Arduino IDE

Итак открываем  Arduino IDE и прежде всего нужно загрузить библиотеки нужных контроллеров в саму  Arduino IDE. Это делается следующим образом: Нажимаем Скетч- Подключить библиотеку- Управлять библиотеками. В открывшемся окне в верхнем правом поле наберите MiniCore (можете прямо отсюда скопировать). Кликаете на данный пакет и жмете кнопку Установка. Пакет установится и теперь при выборе платы в меню Инструменты в самом низу появится еще целых 5 типов контроллеров (возможно в новых обновлениях будет больше выбор)! Выбираете какой вам нужен и можете переходить к более точной настройке. Т.е. в меню инструменты вам становятся доступны менюшки по настройкам фьюзов. Значение Bootloader предлагает вам записать ардуиновский загрузчик. Можете выбрать Да или Нет. Загрузчик тоже занимает место. Учтите это. BOD- это минимальное напряжение питания при котором контроллер отключится. Можете выбрать 2,7v и тогда МК будет работать от, например, элемента 18650. Особое внимание обратите на значение Clock. В данном меню указывается частота ядра МК и тип задающего генератора. Например запись 20MHz external предписывает МК работать от ВНЕШНЕГО кварцевого резонатора с частотой 20 МГц. Т.е. для запуска МК вам придется подключить такую схему,

Подключение кварцевого резонатора к Атмега

причем кварцевый резонатор должен быть на 20 МГц. Иначе МК работать не будет. Для Атмега 8 кварц нужно подключать на 9 и 10 выводы (см. даташит ниже). В случае если укажете, например, 1MHz internal то вы запускаете внутренний генератор самой атмеги и, таким образом, МК начинает работать с указанной частотой. Обратите внимание что внутренний генератор включается только на 1 и 8 МГц, чего вполне достаточно для бытовых целей. LTO (Link Time Optimization)- оптимизатор кода, позволяет сделать код более компактным, т.е. уменьшит размер  занимаемой памяти, по умолчанию отключен. Можете включить но работает он непредсказуемо. Так что лучше все таки отключить. Еще добавлю общие советы. Самое главное- постарайтесь НИКОГДА НЕ ЗАНИМАТЬ ВЫВОД RESET. Если вы неудачно прошьете, решите дописать что то в новую прошивку, что то изменить в коде для удобства и решите после переписать МК с запрограммированным выводом RESET- вы вряд ли сможете записать новый код в запрограмированный МК, т.к. при программирований используется именно этот вход. А так как он занят программно то работать он, естественно, не будет. Есть конечно вариант сбросить МК к заводским настройкам с помощью AVR Doctor но опять же нужно будет делать данное устройство. Если вы довольно плотно подсели на МК Атмега то данное устройство просто необходимо вам в вашей работе. У меня МК немного но я уже несколько раз «лочил» (от англ. lock- запирать, закрывать) МК и только это устройство помогло мне реанимировать 3 Атмега8. Вроде немного но зато теперь я уверен- если что случится то всегда могу все вернуть на исходные позиции. Это не реклама а просто констатация факта. А что вы будете делать- решать только Вам.

Теперь делаем следующее. Находим картинку с названием выводов нашего МК. Например для Атмега 8 есть вот такая картинка- даташит (напомню что 328 и 8 атмеги различаются объемом памяти).

Распиновка 328 атмеги

По ней находим выводы MISO, SCK, MOSI, GND, 5V, RESET. Теперь подключаемся таким образом:

Назначение ARDUINO Atmega 8
RESET 10 1
MOSI 11 17
MISO 12 18
SCK 13 19
5V +5V 7
GND GND 8, 22

Как вы поключитесь абсолютно не имеет никакого значения, можете сделать переходник и включаться напрямую в Ардуино, можете все соединить на макетной плате- не важно. Главное- правильно все подсоединить. Другие МК программируются абсолютно так же. Качаете даташит, находите указанные выше выводы и подсоединяете вывод RESET Ардуино (10 вывод) к выводу RESET МК, вывод MOSI Arduino (11 вывод) к выводу MOSI МК и т.д.  Единственное что нужно- указать тип МК и прописать нужные значения в MiniCore.

Теперь подключаем Ардуино к компьютеру (Arduino ISP уже должна быть залита в Ардуино, если нет то выбираете плату Ардуино, указываете порт, заливаете Arduino ISP, переключаетесь на нужный МК, прописываете фьюзы), выбираем нужный скетч и заливаем его в МК. Разные версии программы Ардуино по разному позволяют записывать скетч в МК. В одних версиях нужно открыть меню Файл- Записать с помощью программатора. В моей версии 1.6.8 для записи через программатор достаточно нажать Shift и нажать стрелку как для заливки скетча в Ардуино. После непродолжительного перемигивания светодиодов на Ардуино скетч будет записан в МК. На этом запись закончена и можно переходить к сборке готового устройства. Хочу так же обратить ваше внимание что при указывании портов ввода- вывода на Ардуино следует учитывать что значение цифрового порта D1 не является первым выводом Атмеги. Для этого вам опять же необходимо ознакомится с картинкой расположения выводов на Атмеге. По распиновке смотрим что порт D1 находится на 3 выводе Атмеги 328 (или 8 Атмеги). Вообще выводы IDE отмечены розовым цветом. Поэтому при разводке платы следует учитывать расположение выводов микросхемы.

Загрузка скетча или прошивка контроллера Ардуино – основная операция, с которой рано или поздно сталкивается любой ардуинщик. Именно возможность быстро и без лишних проблем загрузить в память контроллера управляющую программу и стала одной из основных причин успеха платформы Arduino. В этой статье мы узнаем, как прошиваются Arduino Uno, Nano, Mega и другие платы на основе Atmega с использованием Arduino IDE, программатора или другой платы Ардуино.

Загрузка скетча в плату Ардуино

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

Что происходит, когда мы жмем кнопку «Загрузить»

Плата Ардуино – это микроконтроллер AVR (Atmega8/168/328 или Atmega1280/2560), который прошивается загрузчиком. В микроконтроллер записывается программа, называемая прошивкой, которая позволяет получать сигналы с датчиков, обрабатывать нажатия кнопок, общаться с различными устройствами через интерфейсы, управлять исполнительными процессами.

Обычно прошивка записывается в кристалл микроконтроллера при помощи специальных устройств, называемых программаторами. Для разных микроконтроллеров существуют различные программаторы – от специализированных до универсальных. Важным отличием Ардуино от других контроллеров является возможность залить прошивку через обычный USB кабель. Это достигается при помощи специальной программы – загрузчика (Bootloader). Для прошивки не требуются лишние провода, не нужно подключать дополнительные устройства или нажимать что-то на плате. Также при работе через загрузчик нельзя добраться до опасных настроек, которые выведут из строя Ардуино.

При подключении платы Ардуино к источнику питания, внутри него начинается активная деятельность микропрограмм. При запуске микроконтроллера управление получает загрузчик. Первые 2 секунды он проверяет, поступил ли новый код от пользователя.  Кроме того загрузчик подает импульсы на пин, к которому подключен светодиод, и он начинает мигать. Это означает, что загрузчик установлен и работает исправно. Когда подается скетч, загрузчик записывает его во флеш-память микроконтроллера. Затем эта программа подается на выполнение.  Если данные не поступили, загрузчик запускает предыдущую программу. Во время выполнения программы внутри Ардуино выполняется ряд операций по инициализации и настройке среды окружения, и только после этого начинается выполнение кода.

Вызов setup и loop при загрузке

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

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

Функция void loop – в нее помещаются команды, которые должны выполняться, пока включена плата. Микроконтроллер начнет выполнять программы, начиная с первой, и когда дойдет до конца, сразу вернется в начало, чтобы повторить эту же последовательность бесконечное число раз.

Загрузка скетча в Arduino IDE

В Ардуино IDE компиляция скетча начинается при нажатии кнопки Verify, после этого скетч может быть загружен в память Ардуино через USB с помощью кнопки Upload. Перед загрузкой кода программы нужно установить все параметры в меню Tools. В этом меню выбираются порт, к которому подключена плата, и платформу. В окне Arduino IDE внизу будет отображен ход компиляции скетча. При успешной выгрузке скетча будет получено сообщение «Done uploading».  Запуск скетча начинается сразу после окончания загрузки. Для расширения возможностей можно подключать дополнительные внешние библиотеки, разработанные командой Ардуино или сторонними авторами.

Обзор возможных вариантов загрузки скетча

Кратко весь алгоритм можно записать следующим образом: Написание кода >> компиляция >> загрузка в микроконтроллер. При загрузке скетча используется Bootloader (Загрузчик). Он представляет собой небольшую программу, которая загружается в микроконтроллер на Ардуино. С помощью этой программы можно загружать скетч, не используя дополнительные аппаратные средства. При работе загрузчика на плате будет мигать светодиод.

1. Загрузка в Arduino IDE. Самый простой и удобный вариант загрузки кода. Все, что        нужно сделать – это написать или найти нужный скетч и загрузить его.

  1. Ускоренная загрузка скетча в Arduino IDE. С помощью этого метода можно увеличить скорость загрузки в микроконтроллер в два раза. Для этого нужно лишь зайти в Настройки и снять галочку с пункта Проверка кода. Пропуская шаг проверки, будет уменьшено количество байтов, которые передаются во время загрузки. При этом все равно некоторые из видов проверок будут осуществлены, но они не занимают долгого времени. Отключать проверку кода не рекомендуется, если Ардуино помещается в какой-либо ответственный проект (например, в спутник). Также можно провести проверку, если подключение производится через очень длинный USB кабель (порядка 10 метров).

Уменьшение времени загрузки при помощи отключения проверки работает с любой платой Ардуино, которая использует USB соединение. Все эти микроконтроллеры используют загрузчик avrdude. Платы, которые используют загрузчик Catarina, не нуждаются в отключении проверки кода, так как этот загрузчик работает быстрее.

  1. Загрузка скетча в Ардуино через Bluetooth. Этот способ используется, когда нужно обойтись без физического соединения Ардуино и компьютера – например, в силовых цепях или радиочастотных цепях. Для реализации загрузки потребуется Bluetooth-модуль, который оснащен платой-адаптером для Ардуино. Этот модуль нужно подключить к компьютеру через переходник USB-UART-TTL. Работа с модулем осуществляется с помощью AT-команд.
  2. Загрузка при помощи Андроид-устройства. Для осуществления такого типа загрузки кода понадобятся провода USB-A – USB-B и USB-Host (OTG-кабель), Ардуино и устройство на базе Андроид с поддержкой режима host. На Андроид-устройство нужно установить программу ArduinoDroid или ArduinoCommander из Google Play. Все устройства нужно соединить при помощи кабелей, после этого можно включать Ардуино и загружать на него код. Нужно запустить установленную программу. При включении начнется обновление IDE, на что понадобится некоторое время.

Сначала работа будет рассмотрена на примере программы ArduinoCommander. После ее запуска нужно нажать USB-Device. Затем нужно наддать Autodetect, чтобы Андроид-устройство выполнило поиск Ардуино и отобразило его на экране. Как только Ардуино появится на экране, нужно на него нажать. Чтобы перейти в меню, нужно щелкнуть в нижнем правом углу. В этом меню можно загрузить скетч с SD-карты.

ArduinoDroid представляет собой среду разработки, компилятор и загрузчик одновременно. Начать компиляцию скетча нужно нажав на кнопку Lightning-Button. После завершения компиляции нужно нажать на кнопку загрузки. Загрузка занимает несколько секунд. По окончании загрузки ардуино запустит на выполнение новый код.

  1. Программирование при помощи Raspberry Pi. Можно загружать скетчи двумя способами – при помощи Arduino IDE и при помощи пакета arduino-mk. Пакет позволяет собирать и загружать скетчи Ардуино из командной строки.

Структура памяти Ардуино, где располагается скетч и данные

На микроконтроллере Ардуино имеется 3 вида памяти – флеш-память, которая используется для хранения скетчей, ОЗУ для хранения переменных и EEPROM для хранения постоянной информации. Из этих типов памяти флеш-память и EEPROM являются энергонезависимыми, то есть информация сохраняется при выключении питания. ОЗУ используется только для хранения данных, которые имеют отношение к исполняемой программе.

Микроконтроллер ATmega168, который используется на части плат Ардуино, имеет 16 Кб флеш-памяти, 1024 байта для ОЗУ и 512 байт EEPROM. Важно обратить внимание на малый объем ОЗУ. Большие программы могут полностью ее израсходовать, что приведет к сбою в программе. По этой причине нужно следить за тем, сколько строк занимает программа, и по возможности удалять лишнее. Уменьшить объем кода можно несколькими способами:

  • Можно отправить часть информации на компьютер.
  • Для таблиц и других крупных массивов использовать минимальный тип данных для хранения.
  • Данные, которые остаются неизменными, можно объявить константами при помощи слова const перед объявлением переменной.
  • Меньше использовать рекурсию. При ее вызове в памяти, называемой стеком, выделяется фрагмент, в котором хранятся различные данные. Если часто вызывать рекурсию, стеки будут занимать большой объем памяти и могут израсходовать ее.
  • Неизменяемые строки можно сохранять во флеш-памяти во время работы программы. Для этого используется функция PROGMEM.

На объем памяти не влияют размер имени переменных и комментарии. Компилятор устроен таким образом, что не включает эти данные в скомпилированный скетч.

Для измерения объема занимаемой памяти ОЗУ используется скетч из библиотеки MemoryFree. В ней имеется специальная функция free­Memory, которая возвращает объем доступной памяти. Также эта библиотека широко используется для диагностики проблем, которые связаны с нехваткой памяти.

Оптимизация флеш-памяти. Как только будет окончена процедура компиляции, в окне появится информация о занимаемой памяти кодом. Если скетч занимает большую часть памяти, нужно произвести оптимизацию использования флеш-памяти:

  • Использование констант. Аналогично как и для ОЗУ задавать неизменяющиеся значения константами.
  • Удалить ненужные Serial.println. Эта команда используется, когда нужно увидеть значения переменных в разных местах программы, нередко эта информация просто не нужна. При этом команды занимают место в памяти, поэтому, убедившись в корректной работе программы, некоторые строки можно удалить.
  • Отказ от загрузчика – можно программировать микроконтроллер через контакты ICSP на плате с использованием аппаратных программаторов.

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

EEPROM память используется для хранения всех данных, которые потребуются после отключения питания. Для записи информации в EEPROM нужно использовать специальную библиотеку EEPROM.h, которая входит в число стандартных библиотек в Arduino IDE. Чтение и запись информации в EEPROM происходит медленно, порядка 3 мс. Также гарантируется надежность хранения данных для 100000 циклов записи, потому лучше не выполнять запись в цикле.

Варианты прошивки Ардуино

Прошивка с помощью Arduino IDE

Прошить плату при помощи среды разработки Arduino IDE можно в несколько шагов. В первую очередь нужно скачать и установить саму программу Arduino IDE. Также дополнительно нужно скачать и установить драйвер CH341. Плату Ардуино нужно подключить к компьютеру и подождать несколько минут, пока Windows ее опознает и запомнит.

После этого нужно загрузить программу Arduino IDE и выбрать нужную плату: Инструменты – Плата. Также нужно выбрать порт, к которому она подключена: Инструменты – Порт. Готовая прошивка открывается двойным кликом, чтобы ее загрузить на плату, нужно нажать кнопку «Загрузить» вверху панели инструментов.

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

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

Одни из самых простых способов прошивки платы – при помощи программатора. Заливка будет производиться в несколько этапов.

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

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

Затем нужно выбрать программатор, к которому подключен контроллер. В данном случае используется USBasp.

Последний шаг – нажать на «записать загрузчик» в меню Сервис.

После этого начнется загрузка. Завершение произойдет примерно через 10 секунд.

Прошивка Arduino через Arduino

Для того чтобы прошить одну плату с помощью другой, нужно взять 2 Ардуино, провода и USB. В первую очередь нужно настроить плату, которая будет выступать в качестве программатора. Ее нужно подключить к компьютеру, открыть  среду разработки Arduino IDE и найти в примерах специальный скетч ArduinoISP. Нужно выбрать этот пример и прошить плату.

Теперь можно подключать вторую плату, которую нужно прошить, к первой. После этого нужно зайти в меню Инструменты и выставить там прошиваемую плату и тип программатора.

Можно начать прошивать устройство. Как только прошивка будет открыта или написана, нужно перейти в меню Скетч >> загрузить через программатор. Для заливания прошивки не подходит стандартная кнопка загрузки, так как в этом случае прошивка будет загружена на первую плату, на которой уже имеется прошивка.

Заключение

В этой статье мы рассмотрели различные аспекты загрузки скетчей в Arduino Uno и Nano. Прошивка плат на базе микроконтроллеров ATmega328 и ATmega256, как правило, не сложна и может выполняться одним нажатием кнопки в Arduino IDE. За эту простоту мы должны благодарить встроенную программу-загрузчик, выполняющую за нас все основные действия на низком уровне.

Еще одним вариантом перепрошивки контроллера является использование другой платы адуино или специальных программаторов, использующих микросхемы CP2102 CH340, FTDI и другие. Этот метод требует дополнительных усилий и затрат, но позволяет гибко изменять параметры прошивки. Какой из двух вариантов выбрать – решать вам. Для новичков, безусловно, первым шагом станет использование Arduino IDE, благо, ее создатели сделали все, чтобы упростить этот процесс.

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий