09.07.2011

MKBoard R1

Статистика посещений и количество комментариев к моей статье про 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:

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

ATmega328:

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"

разумеется, вы должны состоять в группе users, при необходимости это легко исправить:

sudo adduser [username] users
restart udev

Шаг 4. Подключение и проверка

Подключите MKBoard к USB-шине, замкните джампер Upload и нажмите кнопку сброса. Светодиод L начнет помаргивать, сигнализируя  о готовности принять скетч по USB. Находиться в этом состоянии плата может неограниченнго долго - пока вы не снимите джампер, либо пока не переподключите USB.

Выберите из примеров старый добрый blink и загрузите его привычным способом - Ctrl+U. Если все нормально - светодиод L начнет мигать. 

Как быть, если все-таки что-то пошло не так?

Пользователи 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 или кит для самостоятельной сборки можно купить здесь.

8 комментариев:

  1. Анонимный20 июля 2011 г., 01:03

    Аппетитные железки у Вас получаются ;) Успехов Вам в этом направлении.

    ОтветитьУдалить
  2. На github я выложил разводку - надеюсь, кому-нибудь пригодится ;)

    ОтветитьУдалить
  3. Спасибо, отличная статья, особенно порадовала строчка "вы нажали после этого на сброс" это вообще первым пунктом должно идти =))))))))))

    Кстати резистор R4, на своей плате, я припаял не к середине перемычке JP5, а между перемычкой и первым выводом USB. Ибо если подключить питание через Jack, то на 6 выводе Atmega единица и на цифровом выводе 4 соответственно. Или это только у меня так, так как я не стал припаивать загадочную деталь именуемый на схеме SJ1 и SJ2. =)

    ОтветитьУдалить
  4. Загадочная деталь "SJ1 и SJ2" - это джамперы под пайку, необходимые для того, чтобы иметь возможность перекинуть местами D+ и D-.

    ОтветитьУдалить
  5. При прошивке atmega328p hex-файликом с github вот такой результат:
    avrdude: ERROR: address 0x8010 out of range at line 129 of mega328p_16MHz.hex
    Размер файла 5932.
    Оригинал usbasploader имеет размер 5660. Он прошивается и работает без проблем.

    ОтветитьУдалить
  6. Да, все верно - при компиляции для ATmega328 и 168 результат не укладывается в размер бутлоадера. И мы это уже обсуждали в форуме.

    ОтветитьУдалить
  7. Теперь понятно, спасибо. Жалко, очень удобное моргание.
    Надо в этой статейке упомянуть и стереть с github hex-ы или положить правильные.

    ОтветитьУдалить
  8. Да, надо бы. Но я все надеюсь - может быть у кого-то получится затолкать код в размер бутлоадера...

    ОтветитьУдалить