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.

13.11.2009

Вариант USBasp

Вдохновленный освоением ЛУТ ;) я решил потренироваться и развести печатную плату для своего любимого программатора USBasp. Кроме тренировки, я преследовал две цели:

  1. Разместить в программатор в корпусе Ganita, дабы не сверлить боковухи под разъемы;
  2. Сделать легкие модификации в схеме.
Вот оригинал:



Из него я решил исключить R7 и посадить выводы 6 и 7 разъема X2 на землю. Автор собирался сделать поддержку отладки, но за несколько лет как руки у него до этого не дошли. Разводить плату без них проще, тем более, что для Arduino гораздо удобнее иметь 6-ти контактный разъем ICSP в дополнение к 10-контактному. Ну и давно хотел добавить во все решения на USB самовосстанавливающийся предохранитель. Стандартный плавкий 5x20 и места больше занимает, и замены требует при перегорании. Финальная схема:



На гетинаксе это выглядит так:



Предохранитель попался фирмы Bourns, на 300 мА. Специально посмотрел, как это работает - при коротком замыкании за 1-2 секунды ток в цепи питания падает практически до единиц мА, сам элемент ощутимо нагревается. Правда, на выбранном для бесчеловечных экспериментов лаптопе тоже самое происходило и без предохранителя, что указывает на то, что он уже и так установлен и в цепи питания USB-хоста. Тем не менее, пусть будет - так спокойнее:



Внутри добавилась вилка ICSP:



А вот десятиконтактную вилку программирования пришлось взять угловую (BH10R), как и джамперы - чтобы они были доступны с торцов. Вид в корпусе:



Виды с торцов:





Итак, джамперов там три, напоминаю, что:

  • JP1 подает питание в разъем программирования (программируемая схема питается от программатора);
  • JP2 устанавливается для режима программирования самого программатора при первой прошивке или последующих ее обновлениях;
  • JP3 устанавливается для МК, у которых низкая (менее 1,5 МГц) частота тактирования. Например, таковыми являются все чистые МК Arduino - фьюз-биты в них установлены по умолчанию на внутреннюю калиброванную RC-цепочку. Я в этом случае обычно программирую в два приема - сначала с этим джампером ставлю фьюзы для "быстрого" внешнего кварца, затем снимаю джампер и заливаю микропрограмму. Даже ATmega8 шить на пониженной скорости очень тоскливо, а для ATmega328 вообще можно уходить пить чай.

Кстати, одна очевидная деталь, которая обычно ускользает от внимания: чтобы запрограммировать МК этого программатора, надо не только установить JP2, но и позаботиться о питании - например, получить его с разъема программирования, замкнув JP1.

Вот одним таким программатором я прошиваю другой:



В остальном - никаких хитростей, программатор поддерживается avrdude и работает как часы, совместим с Windows и Linux.

Ссылки на Молоток.ру для желающих обзавестись готовым программатором или набором деталей. В отдельной статье я подробно расписал для новичков нюансы работы на этом ресурсе.

05.11.2009

ЛУТ: какой утюг лучше?

Перед вами два утюга.

Казалось бы, причем здесь Лужков какая разница для ЛУТ?



Для интересующихся поясню - слева самый дешевый китайский утюг, специально купленный за 450 рублей, мощность 2200 Вт. Справа - любимый инструмент жены, Braun средней пальцовости, мощность 1900 Вт.

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

Таким образом, становится понятным, что хоть китайский hrenznaetktoname и мощнее по паспорту, но нагрев-то больше у Braun.

Что лучше?

Если на вашем шаблоне дорожки достаточно толстые, или же он вообще выполнен в стиле минимальной поверхности травления (травятся изолирующие канавки между проводниками, остается максимум меди) - тогда китаец удобнее, проще смывать тонер после травления. При обратной ситуации выигрывает Braun - он позволяет и дорожки рисовать потоньше, и отмачивать бумагу после отутюживания без особой нежности.

03.11.2009

Что такое Arduino?

Последний раз изменялось: 23.01.2012

После очередного вопроса о том, что это за Arduino, о котором я периодически здесь пишу, наконец с ужасом понял, что почему-то всегда считал, что это должно быть и так всем известно. Исправляюсь ;)

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

Для работы потребуется Arduino-совместимая плата. Такую плату можно купить или изготовить самостоятельно, в ней нет ничего сложного. Она состоит из микроконтроллера и порта для последовательного подключения к компьютеру. Есть варианты для USB и COM.


Далее, необходимо скачать и установить бесплатную ArduinoIDE - интегрированную среду разработки, позволяющую редактировать, компилировать и загружать результат компиляции в плату Arduino.

По большому счету - это всё, остальное - детали.

Приходилось слышать, как люди, неплохо разбирающиеся в электронике, довольно снисходительно отзываются об Ардуино: дескать, копеечная вещь, ничего стоящего.

Действительно, именно так и кажется на первый взгляд. Контроллер ATmega168-20PU из семейства 8-битных RISC-процессоров ATMEL способен выполнять одну инструкцию за такт. Тактируется он, кстати, от кварцевого резонатора 16 МГц. Все его порты ввода-ввода выведены наружу, называются "пины" и разделены на цифровые и аналоговые (согласно  их назначению в самом микроконтроллере). Цифровые пины 0 и 1 помечены как "RX" и "TX" и  являются одновременно последовательным портом для связи с компьютером - к ним подключена микросхема FT232RL (мост с USB) или MAX232CPE (мост с COM). Реже встречается сопряжение с COM-портом на транзисторных ключах или полное отсутствие такового - тогда надо использовать внешнюю плату-переходник. На цифровом выходе 13 как правило расположен тестовый светодиод "L", который может быть использован разработчиком микропрограммы (ее часто называют скетчем - от англ. sketch - набросок) на свое усмотрение.

Так что, как видите, ничего сверхъестественного - напротив, все выглядит элементарно. На мой взгляд, секрет популярности скрыт в следующем:
  • открытые схемы и рисунки печатных плат
  • простота применения непрофессионалами
  • низкая стоимость Arduino-совместимой платы
  • поддержка сообщества

А теперь FAQ - немного вопросов и ответов, которые обычно задают в первую очередь..

(просмотреть полностью)

01.11.2009

Сборка Arduino Severino

Для сборки Arduino Severino потребуются следующие детали:
  • Печатная плата - 1 шт.
  • Микроконтроллер ATmega8/168/328P - 1 шт.
  • Панелька SCS-28 - 1 шт.
  • Стабилизатор напряжения L7805CV - 1 шт.
  • Кварц 16 МГц - 1 шт.
  • Емкость керамическая 22пФ - 2 шт.
  • Емкость керамическая 100нФ - 4 шт.
  • Емкость электролитическая 100мкФ х 16В - 2 шт.
  • Емкость электролитическая неполярная 10мкФ х 16В - 1 шт.
  • Диод 1N4148 - 2 шт.
  • Диод 1N4007 - 1 шт.
  • Транзистор BC547C - 1 шт.
  • Транзистор BC557С - 1 шт.
  • Резистор 1 КОм - 5 шт.
  • Резистор 10 КОм - 5 шт.
  • Резистор 4,7 Ом - 1 шт.
  • Дроссель 100 мкГн - 1 шт.
  • Вилка PLD06 2x3 - 1 шт.
  • Светодиод - 4 шт.
  • Тактовая кнопка - 1 шт.
  • Разъем DRB-9FА угловой на плату - 1 шт.
  • Гнездо питания 2.1мм на плату - 1 шт.
  • Гнездо PBS-08 1x8 - 2 шт.
  • Гнездо PBS-06 1x6 - 2 шт.
Из инструментов потребуются:
  • паяльник
  • припой (подойдет стандартный ПОС-61)
  • флюс (самая обычная канифоль)
  • кусачки
  • пинцет
Сильно облегчает работу также держатель с лупой и крокодилами.

Печатная плата выполнена на основе технологии ЛУТ и может быть изготовлена самостоятельно. Обычно, она уже просверлена, залужена в сплаве Розе и покрыта специальным канифольным лаком, предотвращающим окисление и способствующим пайке (плавится при t=85C, при необходимости легко удаляется спиртом).

1. Устанавливаем пять резисторов - R1, R2, R3, R4 и R6 (не выбрасывайте ножки, они нам еще пригодятся! ;) Отличить их можно по порядку цветов - коричневый, черный, красный, золотистый.



2. Устанавливаем пять резисторов 10К - R5, R7, R8, R10, R11. Сочетание цветов - коричневый, черный, оранжевый, золотистый.



Золотистая полоска на краю обозначает точность, в данном случае 5%. Если не доверяете цветам, всегда можно измерить омметром (мультиметром в режиме изменения сопротивления), но учтите, что теоретические 10К могут "плавать" в диапазоне 9,5...10,5 КОм. Arduino этого вполне достаточно, а для схем, требующих бОльшую точность, есть и более точные резисторы. Но и стоят они, естественно, дороже.

3. Ставим последний резистор 4К7 - R9



Я ориентирую все резисторы золотистой полоской в одну сторону - вверх или вправо -  исключительно из эстетических соображений. Как-то крайне неопытный Arduino-любитель поинтересовался у меня, как правильно включать резистор - он думал, что его ножки неравнозначны. Теперь вы понимаете, почему я все время в своих статьях говорю о том, что с Arduino может разобраться человек, ничего не смыслящий в схемотехнике?

4. Устанавливаем диоды D2, D3 - 1N4148. Они выполнены в стеклянном корпусе-капельке, по размеру еще меньшем, чем резистор. Устанавливать их надо так, чтобы совпала полоска не шелкографии и черненькая полоска на диоде (на фото полоска - справа):



5. Внизу слева монтируем защитный диод D1 - 1N4007 (допустима замена на 1N4004).
Не забываем про полоску (она снова справа):



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



Плата Arduino Severino - односторонняя (или ОПП, как говорят профи ;), в таких случаях разводка далеко не всегда получается без перемычек. Поверьте, три штуки - более чем гуманная плата за избавление от возни с изготовлением двухсторонней платы и переходными отверстиями.

7. Установим угловые джамперы JP0 и JP4:



Эти джамперы переключают режимы работы с COM-портом и бывают нужны нечасто. Старайтесь припаивать так, чтобы между одетым джампером и платой был зазор:



8. Устанавливаем кварц Q1 - 16000 Гц



Если кварц будет в другом корпусе, например "высокий" HC-48U, его надо "положить" на плату - благо место имеется. В противном случае, он может помешать стыковке Arduino с  Shiel-платами, т.к. находится аккурат внутри зоны стыковки.

9. Ищем емкости C1 и C2 - 22 пФ, на них обычно написано 220:



И аккуратно паяем их рядом с кварцем:



10. Теперь надо найти дроссель L1 - 100 мкГн. Обычно, он выглядит как резистор:



Правильный порядок цветов: коричневый, черный, коричневый (далее идет полоса точности - золотистая или серебристая). Дроссель выполняет в цепи питания микроконтроллера помехоподавляющие функции, и включен он между питанием Vcc и питанием АЦП - AVcc. И без него будет работать, но с ним - надежнее ;)



11. Находим емкости 100 нФ (на них написано "104"):



... и устанавливаем все четыре штуки: С3, С4, С6, С7:



12. Теперь можно поставить панельку SCS-28:



13. Установим светодиоды - их в комплекте 4 штуки. Основное правило - длинной ножкой в плюс. Все светодиоды на этой плате сориентированы одинаково - плюс вверху:



(обычно на светодиодах делают "лыску", спрямляя часть окружности корпуса - это соответствует минусу).

Выбор цветов может быть произвольным. Я обычно выбираю светодиод L (LED13) поярче, потому что именно он более всего нагружен в информативном плане. Rx и Tx мигают в момент загрузки скетча из ArduinoIDE, а PWR индицирует подачу питания. Вариант:



14. Устанавливаем электролиты 100 мкФ С5 и C8, тоже длинной ножкой в плюс. Но смотреть она будет уже вниз:



15. А вот электролит 10 мкФ C9 - неполярный. И хотя у него тоже одна ножка длиннее, не верьте! ;)  На то он и неполярный: как хотите, так и устанавливайте.



16. Установим транзисторы: T1 - BC547, T2 - BC557.

Для начала отформуйте пинцетом их ножки, чтобы они выстроились в одну линию:



Далее, можно установить, ориентируя корпус по шелкографии:



Только не перепутайте BC547 и BC557 - у них разная проводимость. А вот буква на конце значения не играет - BC557B будет работать так же хорошо, как и BC557C.

17. Устанавливаем тактовую кнопку сброса



(тактовая - это от английского tactile - осязаемая).

18. Рядом ставим гребенку ICSP 2x6 - PLD06:



Паять её надо осторожно: если перегреете ножки, они могут "поехать" в пластиковом корпусе и вместо аккуратной гребенки может получиться "ежик с иголками врастопырку" ;)

Гребенка ICSP ( in circuit serial programming ) потребуется для двух ситуаций: 1. Зашивание bootloader-а в "свежий" микроконтроллер 2) Работа через AVRStudio. Чтобы ее использовать, Вам потребуется программатор.

19. Теперь устанавливаем IC2 - стабилизатор напряжения +5В - L7805CV:



Если подогнуть ножки заранее, на плате будет выглядеть чуть более аккуратно (хотя, дело вкуса):



В процессе пайки среднюю ножку придется погреть подольше, с ней соединен радиатор.

Если собираетесь питать Arduino от источника питания более +9В например, от +12В, стоит позаботиться о дополнительном радиаторе - для этого придется впаять стабилизатор вертикально и соединить его при помощи винта с этим самым радиатором. Иначе есть риск обжечься - на 12В греться он будет прилично.

20. Теперь надо запаять колодки выводов PBS - две по 8 выводов и две по 6. Удобно пользоваться для этого готовой shield-платой: она переворачивается ножками вверх, на них одеваются колодки PBS:



... а затем плата Arduino / Freeduino, на которую надо установить эти колодки:



Убедившись, что нет перекосов, смело паяйте. В результате должно получиться приблизительно так:





21. Устанавливаем разъем COM-порта DRB-9:



22. Устанавливаем гнездо питания 2,1/5,5 мм:



Рекомендую перед установкой очистить контакты от окислов, например слегка пройтись по ним надфилем. При пайке лучше использовать жидкий флюс (например, тот же ЛТИ-120). Ну и олова придется капнуть чуть побольше, если надо закрыть трехмиллиметровые отверстия в плате.

23. При необходимости, аккуратно подогните ножки микроконтроллера ATmega:



... и установите его в панель SCS-28, совмещая ключ на корпусе, на панельке и шелкографии (в данном случае, он смотрит направо):



Готово! Тем, кто уже имел дело с Arduino, рекомендую изучить руководство по этой плате, там подробно объясняется смысл всех схемотехнических решений и джамперов (на английском).

Поскольку микроконтроллер из комплекта уже прошит, можно сразу и протестировать: для этого надо подключить источник питания и соединить COM-порт с компьютером.

Запустите ArduinoIDE, убедитесь, что она сконфигурирована для нужного типа платы "Tools | Board | ... " и для нужного COM-порта "Tools | Serial Port | ... ". Тип платы в случае с Severino зависит от микроконтроллера:

  • ATmega8-16PU = "Arduino NG o older w/ ATmega8";
  • ATmega168-20PU = "Arduino Diecimila, Duemilanove, or Nano w/ ATmega168";
  • ATmega328P-PU = "Arduino Duemilanove or Nano w/ ATmega328".
Загрузите исходник тестового sketch-а из комплекта: "File | Examples | Digital | Blink".

Откомпилируйте программу (Ctrl+R, круглая кнопка со стрелкой, "Sketch | Verify/Compile"), затем "залейте" sketch (Ctrl+U, квадратная кнопка со стрелкой вправо, "File | Upload to I/O board"). По окончании должно появиться сообщение об успешной загрузке в плату Arduino.

Светодиод L должен начать стабильно мигать (для Atmega8 подождите 10-15 секунд, так уж устроен его bootloader).