Arduino Nano как ISP-программатор

05.12.2015 – Обновлены фотографии.

В предыдущей статье я показал, как собрать Arduino на макетной плате. Следующий шаг – программирование.

Использование Arduino Nano для программирования ATmega328P

Arduino Nano как ISP-программатор для ATmega328P

В интернете есть множество руководств по использованию Arduino для программирования чипа ATmega, два хороших:

Если загуглить «using Arduino as a programmer», большинство результатов будут для UNO, очень мало – для Nano. Одно руководство для Nano, которое я нашёл – на Lets Make Robots. Оно объясняет, как настроить Nano, но не показывает наглядно, как программировать автономный чип ATmega.

Arduino как программатор

Я предположил, что Nano аналогичен Duemilanove, и использовал руководство «Using an Arduino as an AVR ISP» с сайта Arduino. К сожалению, у меня это не сработало. После долгих поисков в Google я обнаружил, что нужно удерживать пин RESET на Arduino Nano в HIGH с помощью конденсатора между землёй и пином сброса. Позже я узнал, что это специфично только для определённых Arduino.

Создание программатора

Сначала нужно превратить Arduino Nano в программатор. Это делается загрузкой скетча ArduinoISP. Скетч ArduinoISP входит в состав программного пакета Arduino и находится в папке examples (примеры).

Подключите Nano к компьютеру по USB как обычно и загрузите скетч ArduinoISP в IDE. Если вы уже добавили конденсатор между RST и GND, его нужно убрать.

Скетч ArduinoISP в Arduino IDE

Если вы используете Arduino IDE версии 1.0 или новее, нужно изменить значение задержки в функции heartbeat. Найдите:

// this provides a heartbeat on pin 9, so you can tell the software is running.
uint8_t hbval=128;
int8_t hbdelta=8;
void heartbeat() {
  if (hbval > 192) hbdelta = -hbdelta;
  if (hbval < 32) hbdelta = -hbdelta;
  hbval += hbdelta;
  analogWrite(LED_HB, hbval);
  delay(40);
}

и измените delay(40) на delay(20). Затем скомпилируйте и загрузите скетч.

Статусные светодиоды

Если посмотреть на скетч, вы увидите, что он рекомендует добавить статусные светодиоды. Светодиоды необязательны, но я предпочитаю их иметь, чтобы видеть, что происходит.

// Put an LED (with resistor) on the following pins:
// 9: Heartbeat - shows the programmer is running
// 8: Error - Lights up if something goes wrong (use red if that makes sense)
// 7: Programming - In communication with the slave

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

Отключите питание (USB-кабель) и добавьте резисторы (220 или 330 Ом подойдут) и светодиоды.

Статусные светодиоды ArduinoISP

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

Если всё в порядке, отключите питание и добавьте соединения к чипу ATmega.

Подключение Arduino Nano ISP к ATmega328P

Схема подключения Arduino Nano к ATmega328P

Подключите Arduino к ATmega следующими соединениями:

  • Arduino D13 к ATmega пин 19 (SCK) – зелёный провод

  • Arduino D12 к ATmega пин 18 (MISO) – синий провод

  • Arduino D11 к ATmega пин 17 (MOSI) – оранжевый провод

  • Arduino D10 к ATmega пин 1 (RESET) – белый провод

  • VCC к VCC

  • GND к GND

Подключение ISP (вид 1) Подключение ISP (вид 2) ATmega на макетной плате с ISP (вид 1) ATmega на макетной плате с ISP (вид 2)

Подробнее о подключении ATmega см. Arduino на макетной плате.

Arduino переименовывает пины для удобства пользователя. Пины ATmega показаны ниже.

Распиновка ATmega 328P

Новые чипы ATmega настроены на использование внутреннего генератора на частоте 1 МГц. Нам нужно запрограммировать фьюзы, чтобы использовался внешний кварц 16 МГц. Самый простой способ – загрузить загрузчик (boot loader). Это установит фьюзы, а загрузчик можно будет перезаписать позже.

Добавление нового определения Arduino в файл boards.txt

При программировании чипа ATmega можно выбрать подходящую похожую плату в списке плат Arduino, но это будет предполагать наличие загрузчика и уменьшит доступный объём памяти для программы. Мы можем создать собственное определение платы, которое сообщит Arduino IDE использовать всю доступную память и соответствующие настройки фьюзов. Различные определения Arduino хранятся в файле boards.txt. В Windows этот файл находится в папке \hardware\arduino внутри папки установки Arduino. Обычно я ищу его через поиск.

Переименуйте файл в boards.BAK.

Откройте файл boards.BAK в текстовом редакторе (можно использовать Notepad) и сохраните его в той же папке (\hardware\arduino) как boards.txt.

Файл boards.txt содержит настройки для различных Arduino. Они расположены группами, и каждая модель Arduino разделена строками из символов #.

##############################################################

uno.name=Arduino Uno
uno.upload.protocol=arduino
uno.upload.maximum_size=32256
uno.upload.speed=115200
uno.bootloader.low_fuses=0xff
uno.bootloader.high_fuses=0xde
uno.bootloader.extended_fuses=0x05
uno.bootloader.path=optiboot
uno.bootloader.file=optiboot_atmega328.hex
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L
uno.build.core=arduino
uno.build.variant=standard

##############################################################

Мы хотим создать собственную запись для breadboard Arduino, и проще всего использовать одну из существующих. Скопируйте запись UNO и вставьте в начало файла.

Теперь отредактируйте раздел, который вы только что вставили:

  • Измените uno в начале каждой строки на что-то другое. Я использовал atmegasa16 (сокращение от «ATmega stand alone at 16MHz»).

  • Дайте ему новое имя (atmegasa16.name=) – я использовал «ATmega Stand Alone (Arduino as ISP)».

  • Поскольку я не использую загрузчик, можно использовать всю память программы, поэтому я изменил atmegasa16.upload.maximum_size на 32768.

  • Я использую ArduinoISP, поэтому изменил atmegasa16.upload.using на arduino:arduinoisp.

  • Измените atmegasa16.bootloader.extended_fuses=0x07 на atmegasa16.bootloader.extended_fuses=0x05. Это стандартная настройка Arduino.

В итоге должно получиться:

atmegasa16.name=ATmega328P Stand Alone (Arduino as ISP)
atmegasa16.upload.protocol=stk500
atmegasa16.upload.maximum_size=32768
atmegasa16.upload.speed=115200
atmegasa16.upload.using=arduino:arduinoisp
atmegasa16.bootloader.low_fuses=0xff
atmegasa16.bootloader.high_fuses=0xdf
atmegasa16.bootloader.extended_fuses=0x05
atmegasa16.bootloader.path=optiboot
atmegasa16.bootloader.file=optiboot_atmega328.hex
atmegasa16.bootloader.unlock_bits=0x3F
atmegasa16.bootloader.lock_bits=0x0F
atmegasa16.build.mcu=atmega328p
atmegasa16.build.f_cpu=16000000L
atmegasa16.build.core=arduino
atmegasa16.build.variant=arduino:standard

Чтобы прочитать новый файл boards.txt, Arduino IDE нужно перезапустить. После перезапуска у вас должна появиться новая запись:

Новая запись в списке плат

Теперь мы готовы программировать чип ATmega.

Подключите Arduino Nano к компьютеру.

Установка фьюзов через прошивку загрузчика

Чтобы чип ATmega использовал внешний кварц, нужно установить определённые фьюзы. Простой способ сделать это – прошить загрузчик (Burn Bootloader). Когда мы загрузим скетч позже, память программы будет перезаписана, но настройки фьюзов сохранятся.

Выберите плату, которую вы только что создали.

Выбор платы

Установите Arduino as ISP в качестве программатора.

Выбор программатора

Выберите Burn BootLoader (Записать загрузчик).

Burn Bootloader

Если всё в порядке, светодиод программирования на Nano ISP должен загореться (пин 10), а светодиод на пине 19 ATmega328P должен мигать по мере загрузки загрузчика.

Загрузка скетчей в ATmega328P

Загрузите пример скетча Blink.

Убедитесь, что выбрана плата ATmega Stand Alone, а программатор установлен на Arduino as ISP.

В главном меню выберите Upload Using Programmer (или нажмите Ctrl+Shift+U), и скетч Blink должен загрузиться.

Обратите внимание, что нужно использовать пункт меню, а не кнопку загрузки.

Upload Using Programmer

Ошибки

Две частые ошибки при программировании автономных чипов:

avrdude: stk500_getsync(): not in sync: resp=0x00 и

stk500_getsync(): not in sync: resp=0x15

resp=0x00 означает, что программатор не может связаться с чипом. Обычно это значит, что подключения неправильные (проверьте провода, особенно VCC и землю) или вы попытались загрузить скетч кнопкой Upload в IDE. Помните – используйте пункт меню File.

resp=0x15 – очень частая ошибка, когда Arduino ISP сбрасывается. Простое решение – добавить конденсатор 10 мкФ между пинами RESET и GND на Arduino Nano (не на чипе ATmega). Это удерживает пин RESET в HIGH и предотвращает сброс Nano. Другое решение – добавить резистор 120 Ом между RESET и +5V, но у меня это не сработало.

Конденсатор между RESET и GND

Я использовал несколько разных Nano в качестве программаторов: оригинальный, который не требует конденсатора, и клон (дешёвая китайская версия), которому конденсатор нужен.

Если вы получаете следующее сообщение об ошибке:

avrdude: stk500_program_enable(): protocol error, expect=0x14, resp=0x50
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.

avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

Это означает, что ATmega не сбрасывается. Проверьте соединение между Arduino пин 10 и ATmega пин 1.