Показаны сообщения с ярлыком V-USB. Показать все сообщения
Показаны сообщения с ярлыком V-USB. Показать все сообщения

24.11.2013

ARCAdaptor или Игра в Продукт

Сегодня будет не совсем обычная статья - уважаемый znoxx поделится опытом о том, как проделать путь от макета железки до полноценного коммерческого продукта. Быть может, он найдет единомышленников, или, что будет еще круче, вдохновит кого-то по его примеру поделиться с общественностью своей разработкой. Приятного чтения! -- ведущий блога MK90 - id. 



Наверное, каждый, кто увлекается разработкой различных железок на микроконтроллерах, задавался подобными вопросами:
  • А что дальше? 
  • Как сделать из прототипа законченный продукт?
  • Смогут ли им пользоваться другие люди?
  • Зачем мне вообще всё это?

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

10.11.2010

V-USB module

Идея проекта посетила меня после двух-трех успешных реализаций на библиотеке V-USB (для тех, кто не в курсе - это специальная библиотека для avr gcc, позволяющая почти любому МК из семейства AVR программно эмулировать USB в режиме low speed transfer).

Как известно, уже давно успешно существует проект Metaboard - плата, совместимая на 90% с Arduino и bootloader-ом на основе V-USB. Но у нее есть две чувствительных особенности - для загрузки скетча надо сначала замкнуть специальный джампер, а затем - нажать сброс. Второй недостаток - по понятным причинам (панелька) для экспериментов подходит только МК в 28-выводном корпусе. Вот что у меня получилось в поисках более универсального решения:



Девайс получил гордое название V-USB module for solderless breadboard и предназначен, как это следует из названия, для работы с беспаечной макеткой. Для этого в него впаяны вертикальные контактные штырьки:



Они позволяют "усадить" модуль поверх центрального желобка (туда обычно ставят микросхемы):



Одновременно они служат для подключения модуля к схеме - на них выведены D+, D-, +5V, и GND, согласно схеме:



Естественно, при наличии всех деталей в выводном исполнении, схема собирается на  макетке и без специального модуля. С другой стороны, его преимущества очевидны - во-первых, это экономия времени (как на втыкание самих деталей, так и на поиск ошибочно воткнутых), во-вторых - простая установка разъема, ибо никогда не видел разъем USB, который бы состыковался с макетной платой без паяльника и дополнительных проводков и вилочек; В-третьих, далеко не всегда под рукой оказывается выводной самовосстанавливающийся предохранитель: часто им вообще пренебрегают, а здесь он всегда в наличии.

И, конечно же - занимаемое место на самой беспаечной макетке. Плата довольно компактна - 33 х 18 мм, причем ее можно установить так, чтобы она частично выходила за пределы breadboard-а.

После установки остается только подключить микроконтроллер, согласно конфигурации. Сначала надо выяснить, где у МК будут расположены входы D+ и D-, по содержимому usbconfig.h:



...после чего подключить их к соответствующим контактам микроконтроллера по маркировке на модуле:



(на этом фото проект ребутера внешних модемов на ATtiny2313-20PU, использован внешний кварц 12МГц, пара конденсаторов 22пФ).

Своей цели я добился - с таким модулем можно довольно быстро собрать схему для V-USB на беспаечной макетке. Плата выполнена односторонним способом, не содержит перемычек и минимально требует сверления лишь четырех отверстий диаметром 1 мм для установочных штырьков.



Скачать файл проекта V-USB moule for solderless breadboard (лицензия CC-SA).

21.07.2010

AVR-Doper

До недавнего времени я пользовался для программирования своих МК USBasp и не знал никаких проблем. Но однажды приключилась необходимость запрограммировать ATmega1280 на плате Arduino Mega, и каково же было мое удивление, когда avrdude... выругался на несовпадение записанных и считанных данных в процессе верификации.


При этом зашитый в Mega бутлоадер функционировал корректно, скетчи заливались и исправно работали -  скорее всего ошибку можно было игнорировать, но - с другой стороны - а что, если при программировании случится настоящая ошибка? Как я об этом узнаю?

Пришлось лезть в интернет и искать что-то для самостоятельного изготовления. Честно говоря, мне хотелось двух вещей - программное управление скоростью прошивки и совместимости с AVRStudio. Первый пункт - весьма важная деталь, когда надо программировать партию МК: чтобы это произошло быстро, на USBasp надо сначала поставить перемычку "SLOW SCK", зашить фьюзы - чтобы МК перешел с внутренней RC-цепочки 1МГц на внешний кварц, потом снять эту перемычку и шить на нормальной скорости. Вот именно это "снять-поставить" слегка раздражало. Ну а про AVRStudio - тут все ясно, чтобы не страдало удобство работы в родной для МК ATMEL среде. Бывает нужно крайне редко, но все-таки полезная вещь.

В такой ситуации многие посоветовали бы мне схему Андрея Рыжкова, использующую libusb и релизующую функционал AVR910. Спору нет, отличная конструкция (даже в наборах МастерКит видел), но лично меня она в свое время опечалила скоростью работы. Однако стоит учесть тот момент времени, когда Андрей опубликовал свою разработку - это было очень сильно востребовано. Поэтому я еще раз мысленно поблагодарил его за труд, но поиски - продолжил.

К моему сильному удивлению, необходимое мне устройство нашлось на просторах все того же проекта V-USB, и называется это чудо техники  AVRDoper:


Первое и самое главное - он совместим с протоколом STK500 v2, а значит будет работать с AVRStudio. Далее, кроме внутрисхемного последовательного программирования, он умеет последовательное высоковольтное - было бы актуально, если бы я собирал схемы на ATtiny. Программное управление скоростью программирования - есть. Есть даже возможность считывания через USB отладочной информации с подключенного МК - именно это хотел сделать автор USBasp Thomas Fischl, но так у него, видать, руки и не дошли.

Вот схема с выброшенным из нее узлом высоковольтного программирования:



Программное обеспечение у него построено в любимом стиле Objective Development - блоками. То бишь, фичи можно включать и отключать выборочно, "втискивая" в доступный объем памяти МК необходимый набор. В классическом варианте есть режимы STK500 и USB-HID, но нет возможности обновить прошивку самого программатора без извлечения из схемы его МК. Однако, можно чем-то пожертвовать (например, функцией прозрачной передачи последовательных данных для отладки МК) и включить возможность обновления прошивки по USB через bootloader (требует навыков обращения с компилятором avr-gcc ;)

Кстати, это еще не всё ;) Предусмотрены программные конфигурации для работы AVRDoper-а внутри родственных ему проектов USBasp и metaboard. Правда, для этого надо, чтобы USBasp был собран на ATmega8. Готовые прошивки лежат в тарболле с исходниками - остается только залить и протестить ;)

Построить прототип на макетке, к сожалению, не представлялось возможным - авторы использовали микруху 74AC126, которую мне не удалось достать в DIP-корпусе. Так что сразу пришлось травить плату, которая, по счастью, оказалась полностью работоспособной.

Краткий итог: по скорости AVRDoper не уступает USBasp, шьет ATmega1280 "на ура", схема без  высоковольтной части влезла на одностороннюю плату под корпус GAINTA 403:


Единственное, не смог заставить работать в режиме STK500 под Linux - есть какие-то заморочки с  /dev/ttyACM0. Разбираться лень, тем более, что под Windows оно работает во всех режимах, а под Linux я пользую avrdude и меня вполне устраивает USB HID.

Основную часть скриптов уже переделал - наслаждаюсь отсутствием надобности передергивать SLOW SCK ;)

Купить AVRDoper можно, например, здесь.

15.07.2010

V-USB жив!

Почти год прошел с момента предыдущего релиза V-USB, драматически выросло число опубликованных гаджетов, улучшился раздел документации. Поэтому, встречайте новый релиз 2010-07-15, ChangeLog:
  • совместимость для новых МК с суффиксом "P" - например, ATmega328P
  • поддержка устройств, у которых более 64К флеша через USB_CFG_DRIVER_PAGE
  • теперь надо обязательно определять USB_CFG_CLOCK_KHZ в usbconfig.h
  • мелкие фиксы
Новую версию можно скачать здесь.

19.11.2009

LibUSB

Библиотека libusb и ее аналог libusb-win32 обычно используются совместно с устройствами, основанными на V-USB. Конечно, жесткой зависимости тут нет - одно может существовать без другого и наоборот. Однако, если Вы не хотите ставить DDK под Windows и изучать азы написания драйверов USB, лучше все-таки воспользоваться этой библиотекой: сэкономите кучу времени. Кроме того, логику работы со стороны PC-хоста вы можете писать и отлаживать как обычное приложение, не ломая голову над тем, как распечатать из ядра отладочную информацию.

I. Windows

libusb-win32 существует в двух вариантах.

А. Фильтр

Для установки фильтра надо запустить  libusb-win32-filter-bin-x.x.x.x.exe. Инсталляция выглядит довольно стрёмно: либа добавляется в цепочку обработчиков USB, и на некоторое время все USB-устройства в системе отваливаются. Именно поэтому никогда не пытайтесь установить фильтр с файловой системы, расположенной на USB-устройстве. В Vista надо перед установкой открыть свойства и указать режим совместимости с Windows XP. Перезагрузка не требуется.

Б. Драйвер

Когда аппаратное устройство отлажено, более разумным выглядит инсталляция в виде драйвера. Для установки потребуются привилегии администратора, но зато и никакого подвисания в процессе инсталляции не будет. Драйвер оседает в системе в виде inf-фала, особой процедуры удаления не предусмотрено.

Кстати, так будет нагляднее при просмотре диспетчера устройств: можно прописать соответствующие текстовые строки. В противоположность этому, при подключении нескольких устройств на V-USB в режиме фильтра, они будут выглядеть одинаково. Чтобы отличить их одно от другого, придется хитрить ;)

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

Итак, качайте и распаковывайте файл libusb-win32-device-bin-x.x.x.x.tar.gz. В каталоге bin есть inf-wizard.exe, он поможет нам создать персональный inf-файл для нашего устройства (получается, что libusb0.sys/dll едины для всех, а вот inf-файлов может быть сколь угодно много). Чтобы не вводить руками VID, PID и имя устройства, перед запуском мастера подключите его к USB:



При использовании кода V-USB на условиях бесплатной лицензии, VID и PID одинаковы у всех разработчиков, зато Description должен быть уникальный. За деньги, естественно, вам выделят персональные VID/PID, не вопрос ;)

После сохранения в отдельный каталог, мы получим:
  • *.inf - файл описания установки драйвера
  • *.cat и *_x64.cat - здесь должны быть цифровые подписи драйверов, но для этого надо быть сертифицированным Micro$oft-ом. А без этого придется увидеть предупреждение о том, что Windows "с камнем на сердце так и быть, заинсталлирует какой-то непонятный драйвер без подписи".
Что дальше?

Надо добавить в этот же каталог файлы libusb0.dll,  libusb0.sys,  libusb0_x64.dll и libusb0_x64.sys. После этого на него можно ссылаться в ответ на вопрос мастера установки драйверов, где же стоит пошукать драйвер "для неизвестного устройтва" или даже провести установку заранее - на *.inf по правой кнопке вызвать контекстное меню и выбрать "Установить".

Если надо позаботиться о пользователе, который программы запускает исключительно через ярлыки, а слово "распаковать" приводит его в суеверный ужас ;) можно сделать и полноценный инсталлятор. Рекомендую пользоваться надежной и при этом абсолютно бесплатной программой Inno Setup. Авторы libusb позаботились о таком развитии сюжета и положили в архив файл examples\install_driver_template.iss - это кусочек скрипта инсталляции файлов драйвера на языке Inno Setup. Предположим, выделенный каталог называется drivers, а inf-файл - MyCoolDevice.inf:

[Files]
Source: "driver\*.sys"; DestDir: "{app}\driver"
Source: "driver\*.cat"; DestDir: "{app}\driver"
Source: "driver\*.dll"; DestDir: "{app}\driver"
Source: "driver\*.inf"; DestDir: "{app}\driver"
Source: "driver\*.dll"; DestDir: "{win}\system32"; FLags: replacesameversion restartreplace uninsneveruninstall

[Run]

; invoke libusb's DLL to install the .inf file
Filename: "rundll32"; Parameters: "libusb0.dll,usb_install_driver_np_rundll {app}\driver\MyCoolDevice.inf"; StatusMsg: "Installing driver (this may take a few seconds) ..."

Добавив эти строки в соответствующие секции любого готового скрипта Inno Setup, мы обеспечиваем установку драйверов в систему.

II. Linux

В linux все выглядит схожим образом, но немного проще. Проверьте в вашем менеджере пакетов, установлен ли libusb, например для Debian/Ubuntu/etc:

dpkg -l | grep libusb

Если нет, можно поставить:

sudo apt-get libusb-0.1-4

Для разработки программ потребуется установить девелоперский пакет libusb-dev:


sudo apt-get libusb-dev



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

gcc -lusb myproject.c


Для разработчиков пакетов надо позаботиться о зависимости, например в файл debian/control добавить правило Depends:

Depends: libusb-0.1-4

Это вынудит менеджер пакетов ставить libusb с новым пакетом автоматически. Разумеется, потребуется правильно настроенный apt/sources.list.

25.08.2009

Доступ к СМП по USB (2)

Вторая версия USB-устройства чтения-записи СМП/МПО Электроника МК-90.

В схему добавлен резистор 22К, притягивающий вход измерения батарейки к GND. Он позволяет избежать чтения "ерунды", когда пин висит в воздухе – теперь будет стабильный ноль.

Также я задался риторическим вопросом о том, стоит ли тащить в схему ICSP-разъем, если и так уже есть USB. Все, что требуется - это bootloader, который будет принимать новую прошивку через USB и прошивать ее во flash-память. С одной стороны - пустяк, может и не пригодиться, с другой - доступный способ обновления, не требующий программатора.

Итак, теперь управление всегда передается bootloader-у, который опрашивает джампер JP1. Пользователь аккуратно разбирает корпус устройства (при наличии такового ;), устанавливает джампер, подключает кабель USB. По установленному джамперу bootloader понимает, что грядет обновление прошивки и ждет данных для записи. Пользователь должен запустить отдельную программу smpreader_updater.exe с единственноым аргументом - именем hex-файла с новой прошивкой. После успешного завершения программы, надо отключить устройство от USB, снять джампер и завинтить обратно.




Бутлоадер был создан на основе релиза V-USB 20090415, а также проектов AVRUSBBoot и USBaspLoader.

AVRUSBBoot мне понравился экстремальной простотой и укомплектованностью host-программой – ну просто бери и пользуйся! Не тут-то было: с момента первого (и последнего ;) релиза прошло довольно много времени, поэтому пришлось обработать напильником: учесть особенности последнего стандарта C++, обновить морально устаревшее ядро V-USB, немного подкорректировать алгоритм проверки условия активизации и корректность выхода (позаимствовал идеи из USBaspLoader).

Увы, размер необходимой памяти программ с учетом bootloader-а вырос на 2К и составил более 4К. В таком варианте ATTiny2313 использовать уже не получится, ATmega48 – только если выкинуть код измерения напряжения батарейки. Поэтому, практически безальтернативно проект собирается на ATmega8-16PU.

Схема, исходники и бинарники: smpreaderusb_2.0.zip.

Файлов с прошивками теперь стало два: сначала надо прошить программатором smpreaderboot.hex, а уже потом через USB можно заливать smpreaderusb.hex. Подробные инструкции на английском языке в виде README-файлов заботливо разложены мной по подкатагам ;)

Кстати, собрал прототип на макетной плате под пайку, выглядит так:



Вместо двух отдельных светодиодов Rx и Tx я использовал один двухвыводной, токоограничительные резисторы R3, R4 и R5 имеют номинал 330 Ом.

К моему огорчению, по-прежнему отсутствуют:

  • GUI, печатная плата
  • инсталлятор (или хотя бы inf-файлы для драйверов)
  • Makefile для консольной сборки
  • поддержка Linux (пока – только потенциальная)
Если руки дойдут, возможно - все это и появится, следите за новостями ;)

23.08.2009

Новый V-USB

Вчера вышла новая сборка V-USB - программной реализации USB 1.1 для микроконтроллеров ATmega (именно на ней основаны AVR910 by prottoss и мой SMPReaderUSB). ChangeLog гласит:
  • исправлена бага определения End Of Packet в режиме 16.8 МГц;
  • исправлена бага с битстаффингом и рассинхронизацией в режиме 16.0 МГц;
  • дескриптор конфигурации чуть подкорректирован для USB 1.1, чтобы был установлен старший бит в bmAttributes (там, где флажок SELF_POWERED);
  • процедура подсчета CRC заменена на более быструю - но по-прежнему, необходим кварц 18.0 МГц.
Буду иметь ввиду на будущее, хотя, на первый взгляд, изменения по отношению к апрельскому релизу - минимальные. Реализация для частоты 12 МГц пока что находится вне конкруенции ;)

07.08.2009

Доступ к СМП по USB

Итак, представляю устройство чтения-записи картриджей сменной памяти СМП/МПО для микроэвм Электроника МК-90.

Ключевые особенности разработанного устройства:
  • совместимо с шиной USB 1.0;
  • читает и записывает образы картриджа СМП;
  • измеряет напряжение внутренней батареи;
  • легко повторяется самостоятельно.
Основу устройства составляет МК ATmega8-16PU, для программной поддержки USB использована реализация V-USB от Objective Development. Для управления с PC используется хост-программа smpusb, которая позволяет:
  • читать содержимое СМП в файл
  • записывать образ из файла в СМП с проверкой
  • показывать напряжение батареи и предупреждать о разряде
  • работать через интерфейс командной строки
  • выводить сообщения на stdout (описаны все коды завершения)
  • работать с с Windows XP, Vista, потенциально переносима на Linux
Для Linux требуется установка libusb, для Windows - libusb-win32,

Предупреждение: на Vista ставить в режиме совместимости с Windows XP, иначе сразу "лишитесь" всех USB-устройств.

Как всегда, начинаю с результата: smpreaderusb_1.0.zip (исходники и бинарники firmware и software).

Схема:



Список деталей:

Part Value Device Package Library

C1 22 pF C5/2.5 C5B2.5 capacitor-wima
C2 22 pF C5/2.5 C5B2.5 capacitor-wima
C3 100 nF C5/2.5 C5B2.5 capacitor-wima
C4 47 uF CPOL-EUTT2D5 TT2D5 rcl
C5 100 nF C5/2.5 C5B2.5 capacitor-wima
D1 3V6 BZX55 DO35Z10 diode
D2 3V6 BZX55 DO35Z10 diode
D3 LM385-1.2 LM385-1.2 TO-92 lm385
IC1 MEGA8-P MEGA8-P DIL28-3 atmel
JP2 PINHD-1X6 1X06 pinhead
LED1 PWR LED3MM LED3MM led
LED2 RX LED3MM LED3MM led
LED3 TX LED3MM LED3MM led
Q1 12 MHz CRYSTALHC49U-V HC49U-V crystal
R1 10K R-EU_0204/7 0204/7 resistor
R2 68 R-EU_0204/7 0204/7 resistor
R3 1K R-EU_0204/7 0204/7 resistor
R4 1K R-EU_0204/7 0204/7 resistor
R5 1K R-EU_0204/7 0204/7 resistor
R6 68 R-EU_0204/7 0204/7 resistor
R7 1K5 R-EU_0204/7 0204/7 resistor
R8 1M R-EU_0204/7 0204/7 resistor
R9 22K R-EU_0204/7 0204/7 resistor
X1 PN61729 PN61729 con-berg
X3 PINHD-2X3 2X03 pinhead


Пояснения к схеме

Если под рукой нет ATmega8-16PU, без изменений в схеме можно использовать ATmega48-16PU, ATmega168-20PU, ATmega328P-PU (однако, потребуется перекомпиляция firmware и другие значения фьюз-битов). Важная особенность тактирования: подходит только кварц, заменять его на калиброванные RC-цепочки и керамические резонаторы нельзя. Если нет кварца на 12 МГц, можно использовать 16, 18 и 20, но в этом случае надо исправить значение константы F_CPU в файле make_config.h и перекомпилировать firmware.

Потенциально возможно использование ATtiny2313-20PU, если пожертвовать функцией измерения напряжения батареи (в этом МК нет АЦП, да и памяти у него всего 2К).

МК питается от напряжения +5В, при этом согласование с сигнальной шиной обеспечивают стабилитроны D1, D2, которые должны быть 3V6 и не более 0,5Вт. Перенебрежение этими условиями может сделать обнаружение и обмен по шине нестабильными, более подробно можно почитать здесь и еще рекомендую обратиться к стандарту USB.

Мощность всех резисторов – 0,25 Вт, допустима погрешность ±5%. Резисторы R3, R4 и R5 – токоограничительные, для обычных светодиодов подойдут 330, 470, 1К. Конденсатор C4 фильтрует помеху по питанию, при использовании внутреннего супервизора питания ATmega, его емкость может колебаться в пределах 10...100 мкФ, устанавливайте максимально близко к разъему USB.

Для формирования напряжения 1,235 В с точностью ±1% используется элемент D3, LM385-1.2. Будьте бдительны: микросхема выполнена в корпусе TO-92, использованы два вывода из трех. Тем не менее, в некоторых даташитах дано неверное расположение выводов, например нарисованы 1 и 2, а на самом деле надо брать 2 и 3 (можно легко определить при помощи вольтметра). Поскольку этот элемент способен работать при токах до 10 мкА, номинал R9 может быть 10..47К.

Разъем программирования ICSP стоит устанавливать исключительно по желанию: не исключаю, что будут обновления firmware. Поэтому, если паяете МК без панельки – настоятлельно рекомендую ;)

После прошивки МК не забудьте установить фьюзы согласно документации.

Пояснения к работе с host-программой

Если все собрано правильно, то после подключения к шине USB Windows радостно сообщит об обнаружении нового устройства. Самое время установить драйвер libusb-win32, который существует в двух вариантах (выбирайте один из двух!):

1. Фильтр. Скачиваете установочный файл libusb-win32-filter-bin-x.x.x.x.exe и запускаете его на выполнение – для Vista надо сначала открыть его свойства и выбрать "Режим совместимости с Windows XP SP2" и "запуск от имени Администратора". Если вы из тех, кто читает мануалы, когда что-то не получается, то сейчас должны наблюдать печальную картину: все устройства USB, как один, перестали работать. К счастью, это не смертельно: через меню программ можно сделать uninstall и повторить установку согласно описанию выше.

2. Драйвер. Скачиваете архив с драйвером libusb-win32-device-bin-x.x.x.x.tar.gz, распаковываете. Подключите готовое устройство к шине и запустите inf-wizard.exe, который выкинет список устройств, ищите в нем VendorId= 0x16c0 и ProductId=0x5dc. Пройдите все шаги до конца, сохранив необходимый inf-файл под каким-нибудь именем. Теперь зайдите в Device Manager, удалите устройства, которые обозначены вопросиком и вновь отсканируйте шину (или просто переподключите устройство). Вот тут-то на риторический вопрос Windows "Что делать?" по поводу нового устройства, предложите ему сделанный на предыдущих шагах inf-файл.

Совсем подробные инструкции расписаны в секции Installation, в будущем постараюсь включить драйвер в один архив с проектом.

Запустите команду чтения напряжения:

smpusb voltage

в ответ вы должны получить текущее значение, положительное число от 0 до 3 В. Далее, чтобы прочитать образ картриджа:

smpusb read –f mk90.bin

Соответственно, чтобы записать:

smpusb write –f mk90.bin

При записи и чтении горят соответствующие светодиоды RX и TX.

Возможные неприятности:

USB error – проверьте, установлено ли у вас libusb-win32 и насколько корректно это сделано.

Could not find USB device "SMPreader" with vid= 0x16c0 pid=0x5dc – проверьте еще раз корректность сборки устройства и надежность его подключения к шине USB.

Поскольку я лицензировал поддержку USB у Objective Development по бесплатной схеме, то используется общее для всех устройств VID и PID, хост-программа пытается выбрать то, у которого строка названия продукта возвращается как "SMPReader". Кстати, из этого вытекает, что два SMPReader-а нельзя использовать одновременно, но кому такое может понадобиться?..

Остальные ошибки связаны с файловым вводом-выводом и относительно понятны, длинные имена файлов, особенно с пробелами, надо заключать в двойные кавычки.

В случае необходимости, можно попробовать добавить ключ –d, выводящий дополнительные отладочные сообщения.

Производитель СМП указывает, что минимальное напряжение, которое гарантированно обеспечивает хранение информации в СМП составляет 2.6 В, поэтому программа будет выдавать предупреждение о том, что оно ниже 2.7 и 2.6 В. Но по практике у меня случалось, что оно опускалось и до 1.8 В с сохранением информации, поэтому можно выключить это предупреждение ключом –p.

Поскольку я являюсь поклонником командной строки, то предоставляю возможность написать GUI желающим, все коды выхода описаны исходнике программы.

Пользуясь случаем, хочу поблагодарить Piotr Piatek-а за хак и публикование алгоритма обмена с картриджем СПМ МК-90. Если вы находите мой вариант устройства сложноватым, можете попробовать более простой вариант, который подключается к LPT-порту. Более подробно можно почитать здесь и здесь.

В заключение пара слов про минусы проекта:
  • отсутствие GUI
  • нет печатной платы
  • драйвер надо ставить отдельно
  • недостаточная проработка вопроса совместимости c Linux
  • не помешал бы консольный Makefile для сборки через nmake.
Постараюсь постепенно добавить все это в будущем, но буду признателен за любую помощь от энтузиастов ;)

08.06.2009

USBasp

Когда писал статью про Metaboard, обратил внимание на программатор USBasp, по набору деталей и возможностям сильно напоминающий AVR910:



Ради интереса решил повторить на макетке:



По моим впечатлениям, обмен идет гораздо быстрее, чем с AVR910 от prottoss-а.

По причине прямой поддержки со стороны avrdude ( >= 5.2.0), программатор можно использовать с Arduino IDE. Для этого надо дописать несколько строк в файл arduino-0016\hardware\programmers.txt:
usbasp.name=USBasp
usbasp.communication=usb
usbasp.protocol=usbasp

После этого появляется соответствующее меню в ArduinoIDE:



Работает, что характерно ;)

Firmware с исходниками и чертежи печатных плат можно найти на сайте автора (Thomas Fischl).

Традиционные минусы дешевого программатора:
  • не умеет питаться от программируемой схемы
  • нет предохранителя на линии питания USB (ну, это легко добавить)
Как обычно, выложил комплект деталей на "молоток".

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.

13.03.2009

AVR910 на макетке

Недавно нашел точку, где можно незадорого обзавестись макетными платами без пайки. В дополнение к маленькой, купил еще одну - побольше, на 630 контактов:


Единственный программатор, который у меня есть - это Parallel Programmer, он экстремально дешев, но требует для работы машину с LPT-портом. Давно уже присматриваю что-то более человеческое, но не подступиться по цене. И дело даже не в том, что "мы бедные студенты" (с), просто отдавать за программатор 1000 рублей немного жалко: он же не универсальный. А универсальный стоит уже больше 5000 рублей, что опять дорого, потому что он каждый день не нужен. Ну и так далее ;)

Вот бы самому что-то смастерить! Чтобы для более распространенных шин, хотя бы и для USB. Схемы есть, но, как правило, на чипе FTDI232 (который, кстати, стоит и на Arduino), у него единственный минус: шаг ножек 0,65 мм и неизбежная необходимость в печатной плате (и в развлекательной пайке с лупой, разумеется).

Но не все так плохо, как кажется с первого взгляда. На просторах интернета выложен проект Андрея Рыжкова под названием "Программатор микроконтроллеров AVR / 89S совместимый с AVR910". Андрей обошелся без отдельного USB-чипа и выполнил схему на единственной ATmega8-16PI, интегрировав в микропрограмму код драйвера USB от Objective Development. Схема получилась такая:


Роль драйвера заключается в следующем: при условии тактирования МК от 12 МГц, этот фрагмент кода эмулирует протокол обмена USB "low speed device" (ровно в восемь раз медленнее - 1,5 МГц, не путать с FullSpeed и HiSpeed скоростями). Далее, Андрей добавил в микропрограмму протокол AVR910, и... получился полноценный программатор, который можно собрать за час на любой макетной плате, а комплект деталей ну никак не будет стоить больше 300 рублей (исключая покупку в Чип и Дип, в плане цены они способны на многое ;)

И главное - заметьте - макетная плата может быть беспаечной. Чем я и решил воспользоваться, чтобы обкатать свой экземпляр.

Все-таки немного непривычно собирать живую схему без паяльника, но через час медитаций получилось следующее:


Ради справедливости стоит отметить, что без паяльника все-таки не обойтись. Поскольку контакты соединены в рядах группами по пять, установить на эту макетку разъем USB-B-1J нельзя: четыре контакта хоть и на расстоянии 2,54мм, но собраны "в кучку", т.е. неизбежно будут замкнуты, куда не поставь. Тоже самое касается и ICSP-разъема PBS-06, а вот ATmega, как и все микросхемы в PDIP, устанавливается над желобком, по центру.

Светодиоды калечить не хотелось, поэтому некоторые детальки сильно приподняты над платой (что не сказывается на контакте, надо заметить):


Некоторые соединения вообще выглядят как "взрыв на макаронной фабрике":


Для токоограничительных резисторов 330 Ом не удержался и попробовал сделать "красиво" - благо, это не трудно:


Дальше аппаратная история как бы заканчивается, и начинается программная. В качестве испытуемого выступил все тот же Arduino Diecimila с ATmega328 на борту:


Для работы приложений надо установить драйвер виртуального COM-порта, причем некоторые приложения, типа AVRProg будут искать его исключительно в диапазоне COM1..COM4. Но это еще полбеды, на странице проекта упоминаются Windows XP и 2000, а вот про Vista - нет. Что неудевительно: по давней традиции Microsoft, в новой версии ОС поддержку bulk-transfer для lowspeed USB было решено упразднить. Понятно, что не по стандарту, но ведь работало же, зачем? (еще один риторический вопрос к Micro$oft).

После подключения программатора к Vista устройство опознается (если нет, то вы просто неверно собрали плату), но процесс инсталляции закончится полным провалом. Если вы уже наступили на эти грабли (как я), не расстраивайтесь, выход есть. Первым делом, надо снести под корень установленные inf-файлы для Windows XP (если вы все-таки решили попробовать их установить, см. выше). Под корень - это зайти в диспетчер устройств, отыскать там подключенный программатор и по правой кнопке "Удалить", не забыв поставить галочку про удаление драйверов:


Теперь надо вооружиться драйвером для Vista. Это будет именно драйвер, смотрите здесь для Vista 32. Повторите процесс установки, указав в качестве драйвера для "страшного и непонятного" винде устройства AVR910 каталог с распакованным драйвером для Vista. Может появиться сообщение:


Надо развеять сомнения винды и продолжать до победного конца, он выглядит так:


Победить COM19 довольно просто: идем в диспетчер устройств, находим наше устройство "USB SerialPort COMXX" (удобно искать, переключившись в режим просмотра "по подключению"), затем "свойства", "параметры порта", "дополнительно". Дальше можно выбрать любой номер, даже уже занятый.

В результате, у меня программа ChipBlasterAVR v.1.07 Evaluation благополучно заработала, правильно прочитав всю память ATmega328. Правда, происходило это небыстро, я даже успел выпить стакан чая ;)

Ссылки по теме:
  • prottoss.com - описание программатора AVR910 от Андрея Рыжкова aka prottoss
  • Objective Development - проект драйвера low-speed USB для avr
  • Osamu Tamura - Using Low-speed Bulk Transfer on Windows Vista
  • Arduino - решение для быстрой прототипизации электронных схем