03.06.2009

Metaboard

Название: Metaboard
Процессор: ATmega8/88/168/328P
Тактовая частота: 16МГц
Совместимость с Shield-платами: нет
Совместимость с Arduino IDE: есть, неполная
Страница проекта: http://metalab.at/wiki/Metaboard



Metaboard - Arduino-совместимая плата с USB, но без USB-чипа. USB реализовано в микропрограмме ATmega, код основан на драйвере V-USB от Objective Development ( я касался этого вопроса, когда писал про AVR910 на USB ). Принципиальная схема:



Специально для этой платы был разработан bootloader, который принимает по USB скомпилированный скетч от Arduino IDE, а потом запускает его. Получается весьма симпатичное и экстремально дешевое решение для Arduino с USB, которое можно собрать своими руками. Вот что у меня получилось на беспаечной макетной плате за четверть часа:



На странице проекта можно скачать схему и чертеж односторонней печатной платы в формте Eagle: обратите внимание, что практически все простарнство между колодками входов и выходов Arduino пустое - там насверлили дырок и устроили макетное поле. Кстати, не ищите ICSP-разъем - автор предлагает желающим припаять его на макетное поле, если уж им так его недостает ;)

Однако, не спешите радоваться :( В этой жизни за все приходится расплачиваться.

1. Размер bootloader-а для ATmega8 вырос до 2К. Оригинальный занимал 1К и оставлял для скетча 7168 байт, теперь же будет доступно 6144. Это все еще весьма много, но будет сильно ограничивать при подключении библиотек. Так что надо брать сразу ATmega168 - тем более, что в этом случае размер доступной памяти не изменится. Правда, придется забыть и про фокус с +1К к свободной памяти, про который я как-то уже писал.

2. Аппаратный последовательный порт, обитающий на пинах Rx/Tx ATmega, остается "как бы" незадействованным. То есть, использовать-то его можно, но, в отличие от Diecimila / Duemilanova, он никак не связан с USB. Код Objective Development работает по прерывыаниям и обязательным условием является заведение сигнала D- на пин ATmega, поддерживающий прерывания. Таким образом, вместо обычных PD0 и PD1 для загрузки скетчей используются PD2 и PD4.

3. Автосброса - нет. Обычно, Arduino IDE "опускает" перед загрузкой скетча DTR, чтобы сформировать сигнал сброса на МК. Для приложения (в данном случае - ArduinoIDE) это выглядит довольно просто - надо вызвать соответствующую функцию Win32 API. После этого управление получит драйвер FT232RL, который сформирует соответствующий служебный пакет данных и передаст его по USB, далее его примет FT232 и переведет свою специально выделенную ножку "DTR" в состояние логического нуля, что, в свою очередь, вызовет сброс на МК.

Но в Metaboard нет отдельного внешнего чипа, который играл бы роль внешней цепи сброса. Сброс возможен только по нажатию кнопки на плате. По сбросу запускается bootloader, который опрашивает PD7 ( digital 7 по обозначениям Arduino ). Если там логический ноль, то bootloader начинает ожидать ( бесконечно долго! ) заливание скетча, а по окончании передает ему управление. В противном случае управление сразу передается по нулевому адресу.

На первый взгляд кажется, что вы теряете digital 7, но его заземление требуется только на время заливки скетча ( вы еще не успели забыть, что здесь по USB нельзя общаться через Hardware Serial? ). В любом случае, придется стараться собирать схему так, чтобы digital 7 не использовался на вход и был по крайней мере притянут к Vcc.

Кстати, чтобы код Objective Development работал, надо обязательно ставить кварц, никаких керамических или внутренних RC-цепочек использовать нельзя.

Для тех, у кого еще не успело пропасть желание собрать из комплекта деталей и макетки практически полноценный Arduino, для достижения этой цели надо еще чуть-чуть поработать. Разберем на примере ATmega8.

Скачайте и распакуйте bootloader: http://www.obdev.at/products/vusb/usbasploader.html.

Нам потребуется hex-файл firmware\hexfiles\mega8_16mhz.hex, поместим его в дерево файлов Arduino IDE, в каталог arduino-0015\hardware\bootloaders\atmega8\.

Поскольку этот bootloader работает не по протоколу stk500, то придется заводить отдельную секцию в boards.txt:

meta8.name=Metaboard w/ ATmega8

meta8.upload.protocol=usbasp
meta8.upload.maximum_size=6144
meta8.upload.speed=19200

meta8.bootloader.low_fuses=0xdf
meta8.bootloader.high_fuses=0xc8
meta8.bootloader.path=atmega8
meta8.bootloader.file=mega8_16mhz.hex
meta8.bootloader.unlock_bits=0x3F
meta8.bootloader.lock_bits=0x0F

meta8.build.mcu=atmega8
meta8.build.f_cpu=16000000L
meta8.build.core=arduino


Как видите, кое-что изменилось: название протокола - usbasp, уменьшился на 1К upload.maximum_size, bootloader.file указывает на скачанный на предыдущем шаге бутлоадер, а bootloader.high-fuse задает размер бутлоадера, равный . Теперь можно перестартовать Arduino IDE, выбрать в списке плат "Metaboard w/ ATmega8". Если МК не прошит, то теперь это можно сделать через стандартное Tools->Burn Bootloader->w/ Parallel Programmer ( разумеется, вилка ICSP должна быть установлена ;).

Теперь надо скачать драйвер USBasp, иначе устройство будет обнаружено, но использовать его не получится. Идем на страницу http://www.fischl.de/usbasp/, качаем и распаковываем самый последний архив. При подключении Metaboard, на запрос об обновлении драйверов, подсовываем каталог bin\win-driver\libusb_0.1.12.1.

Все, теперь можно работать, только не забудьте выставить какой-то номер COM-порта, Arduino IDE формально требуется его определить, хотя в данном случае он ну никак не нужен.

UPD: совместимый с Metaboard вариант MKBoard R1 можно купить здесь (в виде набора деталей или в сборе). 

Резюме: самый дешевый способ собрать Arduino с USB самостоятельно. Особенно актуально, если скетчу не надо обмениваться с PC информацией через библиотеку Serial.

34 комментария:

  1. Интересная статья, вроде все просто и легко, вот решил начать изучение ардуино, поэтому спаял такую плату и.... и в итоге ничего не получилось =((

    Подскажите плиз плиз плиз что ж не так я делаю.
    1) Спаял плату, запихнул в папку C:\arduino-0022\hardware\arduino\bootloaders\atmega8 вот этот файл mega8_16mhz.hex
    В boards.txt вписал новые строки.
    2) Подключил СOM программатор Громова, питание, включил Arduino IDE, выбрал Metaboard w/ ATmega8
    в итоге пишет: Error while burning bootloader и ещё 7 строк ругательств ниже.
    3) Я не унывал, хоть и всплакнул немного, ведь это первый опыт в создании платы и он провалился =(
    4) Интуитивно решил что нужен LPT программатор, спаял тот который представлен на официальном сайте ардуино, вновь начал мучить Arduino IDE и вновь ответил он мне той же ошибкой.
    5) Подумав решил проверить работоспособность программаторов через программу uniprof, COM программатор работает, LPT программатор - нет.
    6)Пошел другим путем через uniprof прошил атмегу этим хексом: mega8_16mhz.hex
    7) Включаю USB порт в итоге просит драйвера даю те которые скачал с сайта http://www.fischl.de/usbasp/ и вот те на!!! не берет подлец!!! говорит не подходят!!!
    8) Совсем приуныл.... начал думать что не моё это... тем не менее очень хочу разобраться и понять подскажите кто чем может!!!!!!

    ОтветитьУдалить
  2. Так какой VID/PID в итоге получился у вашего устройства? Он соответствует тем, что в inf-файле драйвера, который "не подходит"?

    ОтветитьУдалить
  3. VID/PID по нулям почему то... прошивал хексом из http://www.fischl.de/usbasp/ и вот отсюда http://www.obdev.at/products/vusb/usbasploader.html, результат один и тот же, неизвестное устройство и VID_0000&PID_0000

    ОтветитьУдалить
  4. Так не работает USB-шина-то. Возможно, компьютер "чует" изменение сопротивления, которое указывает на подключение, но - увы, обмен не запускается.

    Кварц - соответствует прошивке (обычно 12МГц)? Фьюзы выставили корректно?

    ОтветитьУдалить
  5. 1)Кварц стоит согласно схеме 16 Мгц, и хекс такой: mega8_16mhz.hex
    2) Фьюсы выставил вот так вот: http://easyelectronics.ru/img/AVRProgrammator/Fuses-m8.jpg
    3) А на счет USB ... светодиод питания горит, в компе неопознанное устройство.
    4) Вообще решил отпоять USB порт, и воткнуть взамест него вот такой переходник http://easyelectronics.ru/preobrazovatel-usb-uart-na-ftdi-ft232rl.html
    Как вы думаете получится?

    ОтветитьУдалить
  6. Могу только пожелать успехов ;)

    А в случае metaboard - либо с ошибками собрана схема, либо залита не та прошивка, либо косяк с тактированием. Больше вариантов нет.

    Как ставить фьюзы - надо читать в том же месте, где брали прошивку. Так надежнее.

    ОтветитьУдалить
  7. Добрый день!
    Собрал Metaboard, загрузил bootloader, все как описано в статье. При подключении определяется неизвестное устройство, но драйвер не подхватывается, залить скетч не могу. В чем может быть проблема?

    ОтветитьУдалить
  8. Надо посмотреть, как определяется операционной системой ваше устройство после подключения. В частности, какие у него VID и PID?

    ОтветитьУдалить
  9. Сведения о драйвере VID_0000&PID_0000

    ОтветитьУдалить
  10. Классика. Не завелся обмен по USB, драйвер тут не при чем.

    1) поищите ошибку в схеме - прозвоните хотя бы линии D+ и D- от разъема к ногам МК 2) МК неверно запрограммирован - обратите внимание на соответствие кварца прошивке, а также на фьюзы 3) МК неверно запитан (проверьте вольтметром присутствие питания на его ногах) 4) МК неверно затактирован (проверьте кварц и емкости).

    ОтветитьУдалить
  11. Спасибо за помощь, вечером все еще раз перепроверю. Собирал все по схеме, кварц и емкости такие как указаны. Правда стабилитроны D1, D2 заменил на 3,2В, так как 3,6В не было, может проблема в этом?

    ОтветитьУдалить
  12. Возможно, хотя и не факт. Там важно не столько напряжение, сколько импенданс. Привожу цитату от авторов решения (отсюда):

    Instead of reducing the AVR's power supply, we can limit the output voltage on D+ and D- with Zener diodes. We recommend 3.6 V low power types, those that look like 1N4148 (usually 500 mW or less). Low power types are required because they have less capacitance and thus cause less distortion on the data lines. And 3.6 V is better than 3.3 V because 3.3 V diodes yield only ca. 2.7 V in conjunction with an 1.5 kΩ (or more exactly 10 kΩ) pull-up resistor. With 3.3 V diodes, the device may not be detected reliably.

    ОтветитьУдалить
  13. У Вас в описании написано, что для D- используется прерывание, а INT0 заходит на D+. Может в этом проблемма? Потому что у меня тоже не определяется устройство (VID_0000&PID_0000), а то что винда видит, но не определяет, то это резистор 1,5к он вроде говорит, что какое то устройство подключено на низкой скорости.

    ОтветитьУдалить
  14. Проблема с нулевым VID/PID - это когда хост-контроллер действительно "почуял" устройство по изменению импенданса на линиях D+/D-, но не может начать с ним диалог.

    Наличие прерывания на D- - это условие работы библиотеки V-USB в дефолтной конфигурации. К началу диалога оно отношения не имеет: если прошивка в МК не стартовала, то вот именно такая ситуация и будет наблюдаться.

    ОтветитьУдалить
  15. Хм... у всех одна и та же проблема VID_0000&PID_0000.
    Сделал эту плату на макетке, обрывов нет, питание на МК есть, пробовал с атмегой 8 и 168, ставил разные кварцы 12,15,16 Мhz, прошивки ставил соответствующие mega8_12mhz.hex, mega8_15mhz.hex, mega8_16mhz.hex. даже с разными компьютерами и шнурами пробовал,
    а результат все один и тот же VID_0000&PID_0000

    может автор ещё какие нибудь манипуляции делал? ну там в бубен бил, заклинания говорил особые, храму денег пожертвовал или душу дьяволу продал?

    ОтветитьУдалить
  16. Надо наконец сделать набор деталей для этого дела, а то схема уже вдоль и поперек изъезжена, а несчастные, у которых она не завелась - всё подтягиваются и подтягиваются :(

    Да, и отвечая на Ваш вопрос - душу Дьяволу автор не продавал. Ни я, ни автор metaboard, насколько мне известно.

    ОтветитьУдалить
  17. есть какой нибудь способ проверить правильную работоспособность части МК-кварц? осциллографом возможно?

    ОтветитьУдалить
  18. осциллографом пощупал кварцы, все работают исправно, выдают нужную частоту.

    Есть ещё кто нибудь у кого она заработала кроме авторов и id?

    ОтветитьУдалить
  19. Гри, а это случайно не первый Ваш опыт с ATMEGA? Если да, то я бы рискнул предположить, что дело не в кварцах, а в прошивке и фьюзах.

    Кстати, вот ветка на форуме авторов:

    forums.obdev.at/viewforum.php?f=8

    ОтветитьУдалить
  20. не совсем, прошивал ранее оригинальную Arduino Diecimila, ставил фьюзы, работает отлично.

    а с этой платой совсем не ладится, фьюзы ведь ардуиновские в этой metaboard?
    ну а прошивку беру как написанно в этой статье
    http://www.obdev.at/products/vusb/usbasploader.html.

    я в эту плату впился только потому что хочу включить её в дипломную работу как методический материал, для обучения программированию AVR. но похоже мне самому обучиться не мешало бы)

    ОтветитьУдалить
  21. Что значит "ардуиновские фьюзы"?! Там "метабоардовские фьюзы", очень подробно расписанные в Makefile к bootloader-у.

    ОтветитьУдалить
  22. Во, уже что то проясняется, что это за файл? чем открыть? куда вставить? и как с ним работать?

    ОтветитьУдалить
  23. Открываете текстовым редактором, внимательно изучаете и подставляете оттуда значения фьюзов в параметры программатора.

    ОтветитьУдалить
  24. выставил, не помогло.

    Начал вначале выставлять с помощью AVRDUDE, но вовремя вспохватился когда чуть незанулил RSTDISBL, не доверяю теперь этой проге.
    Выставил через uniprof она как то по честнее с пользователем.

    ОтветитьУдалить
  25. Если фьюзы и прошивка - правильные, а в схеме все ОК, то должно работать. Правда, надо заземлить PD7 и нажать сброс - надеюсь, не забыли?..

    ОтветитьУдалить
  26. Знаете, Илья, в начале февраля я наткнулся на эту страничку, решил собрать эту схему и промучился с ней до конца мая, за это время я понял кое что об ЛУТе, фьюзах, тактирование, прошивках, наделал кучу плат с USB чипами и без них.... бесценно.

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

    Спасибо Вам Илья =) что помогли мне, да и вообще со всеми кто просит помощи) побольше бы таких людей как ВЫ =)

    наконец то все работает, теперь я думаю напишу самое подробнейшее описание для школьников по созданию этой платы и работы с ней

    P.S. извиняюсь за оффтоп

    ОтветитьУдалить
  27. Фуф, наконец-то. Честно говоря, я тоже пришел к выводу, что надо еще что-то написать про Metaboard, видимо эта статья не столь удачна как мне хотелось бы :(

    ОтветитьУдалить
  28. Могу прислать разводку под ЛУТ в формате .lay она правда предельно дилетантская и выводы от атмеги не на местах, но зато с толстенными дорожками. а размеры самой платы точно такие же.

    Пришлось создать её так как в той разводке которая шла от разработчиков, тонкие дорожки, после хлорного железа они либо замыкались, либо обрывались в самых неожиданных местах

    ОтветитьУдалить
  29. Присылайте! С удовольствием размещу их здесь и, думаю, многие скажут Вам спасибо. Моя почта - general@idanilov.ru, обязательно укажите атрибуты авторства для публикации (имя, ссылка на сайт и тому подобное).

    ОтветитьУдалить
  30. Обалдеть, несколько раз видел этот Metaboard - думаел еще одна serial мини-платка с разъемом на питание от USB. Оказывается, она и говорит по USB ;-). Спасибо вам за блог!

    ОтветитьУдалить
  31. А я в итоге даже создал свой собственный вариант: вот.

    ОтветитьУдалить
  32. Здравствуйте. Купил комплект для сборки Metaboard, собрал все очень аккуратно и по схеме, проверял каждый контакт мультиметром. После подключения к USB - пишет "Устройство работает неправильно и Windows не может опознать его". Драйвера не устанавливаются. VID и PID - нулевые. Пробовал переводить USB в режим 1.1 - ничего не изменилось. Подскажите, пожалуйста, в чем может быть дело?

    ОтветитьУдалить
  33. Ну уж точно дело не в USB 1.1!

    Комменты и статью внимательно читали? Замыкать джампер и нажимать на сброс пробовали?

    Посмотрите еще вики, на всякий случай.

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