30.11.2009

Новый опрос

Близится Новый Год - счастливое время непрерывных выходных, когда можно с головой погрузиться в проектирование роботов, написание скетчей и травление плат.

Поэтому, добавил новый опрос на правую панель: о том, на какие темы статьи от меня ждут читатели.

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

27.11.2009

SMPReaderUSB - финальная версия

Финальная версия устройства чтения / записи модулей памяти Электроника МК-90. От начальной идеи, оно неспешно эволюционировало в законченный девайс:



Файлы:

  • Для тех, кто в море под Windows: скачайте программу-инсталлятор, она установит драйвер, необходимые dll-ки и саму программу чтения/записи;
  • Полный архив с исходниками firmware и software, схемой и разводкой односторонней печатной платы в Eagle (последние под лицензией Creative Commons Attribution-Share Alike 3.0 Unported);
  • Для тех, кто хочет изготовить печатную плату: файл eps (extended postscript). Загрузите его с разрешением 720 dpi в Photoshop или Gimp, что гарантированно даст качественный отпечаток.
Поддерживается также и Linux (он теперь всегда поддерживается, живу я теперь в нём ;)  В архиве бинарники, собранные под Ubuntu 9.10. Искренне прошу прощения, что не сделал полноценный пакет .deb, но компиляция элементарна: надо поставить libusb-dev и g++, а потом запустить make.sh.

Использование:
  • Чтение образа СМП: smpusb read -f filename.bin
  • Запись образа СМП: smpusb write -f filename.bin
  • Проверка батареи: smpusb voltage

Если вдруг возникает необходимость обновить прошивку, надо:
  • Скачать новое firmware с http://mk90.blogspot.com
  • Отключить питание (отключить и от компьютера, и от СМП)
  • Поставить джампер JP1 в положение PGM
  • Подключить к компьютеру
  • Запустить программу обновления:
    smpreader_updater smpreaderusb_atmega8.hex
  • Вернуть JP1 в прежнее положение, отключить питание.
При следующем включении заработает новая прошивка.

Предупреждаю, что схема несовершенна, поэтому при подключении модуля начинает слегка расходоваться его батарея. Посчитав усложнение схемы неоправданным, предлагаю взять за правило: попользовался - отключи! Тем более, что модуль в большинстве случаев используется именно для хранения данных или их переноса между PC и МК-90.

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

Кстати, уважаемый smallkaa в комментах уверял меня, что low speed bulk-transfer mode под Linux неработоспособен. Мне кажется, что это мнение все-таки устарело ;)

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).