Статистика посещений и количество комментариев к моей статье про metaboard продолжает бить все рекорды, но ничего удивительного здесь нет. Людьми движет абсолютно здоровое желание собрать Arduino-совместимую железку своими руками за минимальные деньги. Практика показала, что в процессе всегда одни и те же грабли возникает ряд стандартных вопросов, поэтому возвращаюсь к этой теме повторно.
Напомню, Metaboard - это Arduino-совместимая плата, где нет дополнительного USB-чипа. Функции по загрузке скетчей через USB исполняет сам же МК, при помощи библиотеки V-USB от Objective Development (программная реализация USB для МК ATMEL). В качестве bootloader-а используется USBaspLoader, имитирующий программатор USBasp. Это дает возможность загружать скетчи стандартным способом через старый добрый ArduinoIDE, правда придется немного модифицировать boards.txt. Поддерживаются ATmega168, ATmega328 и даже ATmega8, но из-за пухлого двухкилобайтного бутлоадера в последнем остается всего 6К - особенно не развернешься (хотя часто и этого бывает более чем достаточно).
К сожалению, Metalab ограничился выпуском версии Metaboard 1.1, где на тыльной стороне есть перемычки под пайку для свопа линий D+ и D- (связано с некоторыми фичами и особенностями V-USB). К счастью, существует несколько производных проектов, самый документированный - это MHVBoard. Я просмотрел на все это безобразие и решил принять в нем участие создать собственный кит с печатной платой и гордо назвать его MKBoard R1.
Чем MKBoard отличается от metaboard?
- добавлен светодиод L на выводе 13. Думаю, все, кто работали с Arduino / Freeduino согласятся, что он в 85% случаев оказывается полезным;
- для защиты от перегрузки по питанию от USB, добавлен самовосстанавливающийся предохранитель 0,5А. Современные материнские платы почти всегда им снабжаются, но а) так надежнее б) о коротком замыкании при малейшем подозрении можно узнать просто прикоснувшись к этому фьюзу пальцем: он будет горячим;
- добавлена вилка ICSP - и это не только для программатора: хорошие версии Shield-плат, например EtherSD Shield, именно оттуда берут сигналы SPI;
- добавлены дополнительные дублирующие отверстия для цифровых пинов, расположенные строго на сетке 2,54 мм. Это значит, что при желании можно обойтись кусочком обычной макетной платы, а не искать протошилд;
- все сигналы имеют двойную нумерацию (для Arduino и для ATmega), а также маркировку с обоих сторон платы.
Думаю, излишне рассуждать о том, что наличие печатной платы с маской на порядок снижает ошибку при сборке даже для опытных ЛУТостроителей. Тем более, что есть пошаговое руководство с картинками.
ОК, допустим, что плата MKBoard / MHVBoard / Metaboard собрана, что дальше?
Шаг 1. Модификация ArduinoIDE
Добавьте секции MKboard в ArduinoIDE. Проще всего будет скачать готовый архив и развернуть его в каталог hardware - содержимое файла boards-add.txt можно добавить в существующий boards.txt или воспользоваться уже объединенным boards-0022.txt.
Шаг 2. Прошивка МК бутлоадером
Разумеется, МК в составе кита уже прошит, но если вы все собираете самостоятельно - придется запастись программатором и некоторым количеством терпения.
Найдите соответствующий вашему микроконтроллеру hex-файл и прошейте его в МК (можно пользоваться фьюзами из файла boards-add.txt). Пример для avrdoper в USB-HID режиме:
ATmega8:
avrdude -c stk500v2 -P avrdoper -p m8 -B 3 -e -u -U lock:w:0x3f:m -U hfuse:w:0xc0:m -U lfuse:w:0x9f:m
avrdude -c stk500v2 -P avrdoper -p m8 -B 1.1 -U flash:w:atmega8_16MHz.hex -U lock:w:0x0f:m
ATmega168:
ATmega328:
ATmega8:
avrdude -c stk500v2 -P avrdoper -p m8 -B 3 -e -u -U lock:w:0x3f:m -U hfuse:w:0xc0:m -U lfuse:w:0x9f:m
avrdude -c stk500v2 -P avrdoper -p m8 -B 1.1 -U flash:w:atmega8_16MHz.hex -U lock:w:0x0f:m
ATmega168:
avrdude -c stk500v2 -P avrdoper -p m168 -B 3 -e -u -U lock:w:0x3f:m -U hfuse:w:0xd6:m -U lfuse:w:0xf7:m -U efuse:w:0x00:m
avrdude -c stk500v2 -P avrdoper -p m168 -B 1.1 -U flash:w:atmega168_16MHz.hex -U lock:w:0x0f:m
avrdude -c stk500v2 -P avrdoper -p m328p -B 3 -e -u -U lock:w:0x3f:m -U hfuse:w:0xda:m -U lfuse:w:0xf7:m -U efuse:w:0x03:m
avrdude -c stk500v2 -P avrdoper -p m328p -B 1.1 -U flash:w:atmega328_16MHz.hex -U lock:w:0x0f:m
Если программатор поддерживается ArduinoIDE, то можно попробовать прошить через нее. Сначала надо выбрать тип платы, затем - порт, а затем зашить МК через Tools > Burn bootloader > w/ YourProgrammer.
Шаг 3. Установка драйвера
Пользователям Windows надо установить драйвера libusb и соответствующий inf-файл для USBasp, скачать их можно здесь.
Linux и MacOS поддерживают режим libusb на уровне ядра и, скорее всего, у вас он уже включен. Однако, в Linux иногда встречается проблема с доступом к устройству по USB, когда недостаточно прав. Чтобы не запускать ArduinoIDE из-под рута, добавтьие правило в udev и перезапустите его:
SYSFS{idVendor}=="16c0", SYSFS{idProduct}=="05dc", MODE="0660", GROUP="users"
SYSFS{idVendor}=="16c0", SYSFS{idProduct}=="05dc", MODE="0660", GROUP="users"
разумеется, вы должны состоять в группе users, при необходимости это легко исправить:
sudo adduser [username] users
restart udev
sudo adduser [username] users
restart udev
Шаг 4. Подключение и проверка
Подключите MKBoard к USB-шине, замкните джампер Upload и нажмите кнопку сброса. Светодиод L начнет помаргивать, сигнализируя о готовности принять скетч по USB. Находиться в этом состоянии плата может неограниченнго долго - пока вы не снимите джампер, либо пока не переподключите USB.
Выберите из примеров старый добрый blink и загрузите его привычным способом - Ctrl+U. Если все нормально - светодиод L начнет мигать.
Выберите из примеров старый добрый blink и загрузите его привычным способом - Ctrl+U. Если все нормально - светодиод L начнет мигать.
Как быть, если все-таки что-то пошло не так?
Пользователи Linux могут поинтересоваться о наличии устройства с VID = 16c0 и PID = 05dc через lsusb, а пользователи Windows - через диспетчер устройств. В случае проблем, проверьте еще раз, что:
Пользователи Linux могут поинтересоваться о наличии устройства с VID = 16c0 и PID = 05dc через lsusb, а пользователи Windows - через диспетчер устройств. В случае проблем, проверьте еще раз, что:
- вы правильно спаяли плату - при подключенной шине USB и в положении джампера JP5 1-2, прикоснитесь к предохранителю F1 - он не должен быть горячим;
- вы правильно запрограммировали ATmega, особенно фьюзы;
- вы вставили ATmega правильной стороной, соблюдая ключ;
- вы действительно замкнули джампер "Upload" (который рядом с кварцем);
- вы нажали после этого на сброс.
Вот, собственно, и всё - дальше можно работать, как с обычным Arduino. Единственное отличие - для загрузки скетча надо нажимать сброс. Джампер "Upload" трогать необязательно - после загрузки USBasploader передает управление скетчу и получит вновь управление только после нажатия на кнопку сброса (подача питания - это другое событие).
И учтите - USB-соединение активно только во время работы бутлоадера, поскольку тот содержит в себе V-USB. Загруженному скетчу, к сожалению, это недоступно - весь обмен по Serial будет происходить через пины RX и TX (или digital1 и digital0), которые ни к чему не подключены.
В заключении по поводу бутлодера: я его немного модифицировал, чтобы он моргал светодиодом L при активизации. Если вы взяли стандартный USBasploader, то там никакой "цветомузыки" не ожидайте.
Исходники проекта можно скачать у меня или на github: https://github.com/mk90/MKBoard.
Готовую плату MKBoard или кит для самостоятельной сборки можно купить здесь.
И учтите - USB-соединение активно только во время работы бутлоадера, поскольку тот содержит в себе V-USB. Загруженному скетчу, к сожалению, это недоступно - весь обмен по Serial будет происходить через пины RX и TX (или digital1 и digital0), которые ни к чему не подключены.
В заключении по поводу бутлодера: я его немного модифицировал, чтобы он моргал светодиодом L при активизации. Если вы взяли стандартный USBasploader, то там никакой "цветомузыки" не ожидайте.
Исходники проекта можно скачать у меня или на github: https://github.com/mk90/MKBoard.
Готовую плату MKBoard или кит для самостоятельной сборки можно купить здесь.
Аппетитные железки у Вас получаются ;) Успехов Вам в этом направлении.
ОтветитьУдалитьНа github я выложил разводку - надеюсь, кому-нибудь пригодится ;)
ОтветитьУдалитьСпасибо, отличная статья, особенно порадовала строчка "вы нажали после этого на сброс" это вообще первым пунктом должно идти =))))))))))
ОтветитьУдалитьКстати резистор R4, на своей плате, я припаял не к середине перемычке JP5, а между перемычкой и первым выводом USB. Ибо если подключить питание через Jack, то на 6 выводе Atmega единица и на цифровом выводе 4 соответственно. Или это только у меня так, так как я не стал припаивать загадочную деталь именуемый на схеме SJ1 и SJ2. =)
Загадочная деталь "SJ1 и SJ2" - это джамперы под пайку, необходимые для того, чтобы иметь возможность перекинуть местами D+ и D-.
ОтветитьУдалитьПри прошивке atmega328p hex-файликом с github вот такой результат:
ОтветитьУдалитьavrdude: ERROR: address 0x8010 out of range at line 129 of mega328p_16MHz.hex
Размер файла 5932.
Оригинал usbasploader имеет размер 5660. Он прошивается и работает без проблем.
Да, все верно - при компиляции для ATmega328 и 168 результат не укладывается в размер бутлоадера. И мы это уже обсуждали в форуме.
ОтветитьУдалитьТеперь понятно, спасибо. Жалко, очень удобное моргание.
ОтветитьУдалитьНадо в этой статейке упомянуть и стереть с github hex-ы или положить правильные.
Да, надо бы. Но я все надеюсь - может быть у кого-то получится затолкать код в размер бутлоадера...
ОтветитьУдалить