Arduino Nano как ISP-программатор
05.12.2015 – Обновлены фотографии.
В предыдущей статье я показал, как собрать Arduino на макетной плате. Следующий шаг – программирование.
Использование Arduino Nano для программирования ATmega328P
В интернете есть множество руководств по использованию Arduino для программирования чипа ATmega, два хороших:
Если загуглить «using Arduino as a programmer», большинство результатов будут для UNO, очень мало – для Nano. Одно руководство для Nano, которое я нашёл – на Lets Make Robots. Оно объясняет, как настроить Nano, но не показывает наглядно, как программировать автономный чип ATmega.
Я предположил, что 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, его нужно убрать.
Если вы используете 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 Ом подойдут) и светодиоды.
Подключите питание снова, и если всё работает правильно, светодиоды должны быстро мигнуть, а затем светодиод на пине 9 должен плавно пульсировать.
Если всё в порядке, отключите питание и добавьте соединения к чипу ATmega.
Подключение Arduino Nano ISP к 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
Подробнее о подключении ATmega см. Arduino на макетной плате.
Arduino переименовывает пины для удобства пользователя. Пины ATmega показаны ниже.
Новые чипы 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 (Записать загрузчик).
Если всё в порядке, светодиод программирования на Nano ISP должен загореться (пин 10), а светодиод на пине 19 ATmega328P должен мигать по мере загрузки загрузчика.
Загрузка скетчей в ATmega328P
Загрузите пример скетча Blink.
Убедитесь, что выбрана плата ATmega Stand Alone, а программатор установлен на Arduino as ISP.
В главном меню выберите Upload Using Programmer (или нажмите Ctrl+Shift+U), и скетч Blink должен загрузиться.
Обратите внимание, что нужно использовать пункт меню, а не кнопку загрузки.
Ошибки
Две частые ошибки при программировании автономных чипов:
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, но у меня это не сработало.
Я использовал несколько разных 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.