Pull to refresh

Создание USB-гаджета с нуля или еще одна лампа настроения

DIY
Как-то на глаза попалась статья про лампу настроения. Будучи очень далеким от электротехники и абсолютно незнакомым с принципом работы микроконтроллеров, полученных из топика данных ну никак не хватало для понимания всех необходимых действий для создания лампы. Со временем на глаза попадались другие интересные проекты на микроконтроллерах, потому в один прекрасный момент появилось желание потратить часть свободного времени на покорение сей стихии.

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

Цель


Изучать работу микроконтроллеров я решил на практике: делать что-то реальное куда интереснее, чем гонять десяток светодиодов в симуляторе.
В первую очередь было необходимо определиться, что хочется сделать. Я остановился на вышеупомянутой лампе настроения. Дабы не создавать полный аналог было решено расширить функционал лампы и добавить управление с ПК.

Микроконтроллер


Выбор микроконтроллера был прост.
Работать с ПК через COM порт — несовременно, потому был выбран вариант связи через USB. Дабы не начинать с микропайки, было решено использовать только компоненты в DIP корпусе. Подходящих микроконтроллеров осталось немного: или любой AVR с программной эмуляцией USB, или PIC серии 18F с аппаратной поддержкой USB 2.0.
Кто-то может решить по другому, но мой выбор пал на последний вариант, в данном проекте я использовал МК PIC18F2455.
18F2455 можно заменить без последствий на 18F2550, разница лишь в объеме памяти.
С минимальными изменениями можно так же использовать:
18F4455/4550 — при необходимости большего количества ног (40 вместо 28)
18F14K50 — 20 ног, немного обрезанный функционал, зато немного дешевле


Схема


Самая простая схема для подключения PIC18F2455 выглядит так:

По неизвестной мне причине на схеме переставлены местами 25 и 26 ноги МК.

Отталкиваясь от нее можно составить схему для лампы. Из изменений потребуется:
Питание 5В и землю взять от USB.
Соединить D+ и D- USB с соответствующими ногами МК.
Подключить к одному цифровому входу кнопку.
К трем цифровым выходам подсоединить транзисторы для управления светодиодом.



На схеме не отображены только мощные резисторы к катодам светодиода.

Программатор


Перед сборкой микроконтроллер необходимо прошить. Умные люди скажут, что нет ничего лучше PicKit для прошивки пиков. Но кому хочется тратить 1000-2000 руб. для разовой прошивки МК?
Существуют множество схем самодельных программаторов различной сложности исполнения, но не у всех выходит заставить работать их с первого раза.

Мною были опробованы два самых простых программатора: один работает через LPT порт, другой — через COM. Удивительно, но все заработало без особых проблем.

Схема art2003 (читать подробнее):



LPT разъем, 8 диодов, конденсатор и резистор. Только список поддерживаемых МК не радует.

Схема универсального программатора (работает как JDM):



Такой простой схемой на трех резисторах с внешним питанием 5В можно прошить почти любой PIC, главное подсоединить провода к нужным ногам МК (а так же не забыть, что Vdd и Vss может быть несколько).
Питание 5В можно взять от USB, БП компьютера или зарядного устройства для телефона.

Оба программатора поддерживаются программой для прошивки пиков — WinPic800.

Бутлоадер


Программатор — это хорошо, но что делать, если требуется часто перепрошивать МК, не оставлять же доступ к плате ради такой мелочи? На этот случай удачно подходит использование бутлоадера. Достаточно один раз записать его в МК, после чего все обновления прошивки выполнять напрямую с компьютера через USB.
На начальном этапе не требуется знать подробностей, достаточно использовать готовые решения. После прошивки бутлоадера в МК достаточно подать питание при зажатой кнопке — и в системе определится новое устройство Microchip Custom USB Device. После установки драйверов можно безопасно работать с доступной памятью через распространяемый Microchip'ом софт.



Компилятор


Существует много хороших компиляторов, свой выбор я остановил, наверное, на самом малоизвестном — JAL (Just Another Language). Возможно, кто-то посчитает использование этого компилятора неразумным, но он полностью покрыл все мои требования для старта. Минимальный размер (архив 11 мб), отсутствие установки (1 минута на распаковку не в счет), никаких излишеств (мне не нужна среда разработки), наличие всех необходимых библиотек, рабочие примеры для каждого МК (мигание светодиодом) и для всех основных функциональностей.

Пример кода мигания светодиодом:

include 18f2455 -- библиотека для используемого МК
--
pragma target clock 48_000_000 -- частота МК, задается для расчета задержки
--
enable_digital_io() -- переключение всех входов на цифровой режим
--
alias led is pin_B3 -- привязываем led к пину B3
pin_B3_direction = output -- настраиваем пин B3 для работы как выход
--

forever loop -- основной цикл
led = on -- включить светодиод
_usec_delay(250000) -- пауза
led = off -- выключить светодиод
_usec_delay(250000) -- пауза
end loop


При использовании бутлоадера вся конфигурация МК устанавливается в нем, для адаптации прошивки к бутлоадеру достаточно изменить параметры компилирования добавив флаги -loader18 2048 -no-fuse.

Прошивка


Описывать все тонкости при написании программы для МК — не хватит не только одной статьи, но и книги. Одна только документация по PIC18F2455/2550/4455/4550 занимает 430 страниц. Узнать все и сразу — почти невозможно.

Самый простой способ написать что-то свое — посмотреть примеры и сделать по аналогии. Данный путь не всегда самый верный, но постоянно проверяя каждую строчку кода на работоспособность выходит вполне рабочая программа.

Функционал, включенный в текущую версию прошивки:
  • софтовый 8-битный ШИМ на 200 Гц, 3 канала
  • возможность использования таблицы коррекции гаммы (желательно перевести ШИМ на BAM 10-бит, иначе заметны переходы цвета)
  • 4 процедуры для работы с цветом:
    • программный таймер с шагом 0.1с (макс. время 1:49:13.5) для пауз и установки времени перехода
    • переход от текущего до заданного цвета по RGB значениям за время таймера
    • переход от текущего до заданного цвета по HSV значениям за время таймера
    • мгновенное изменение цвета
  • 6 подпрограмм смены цвета
    • вращение по HSV колесу; дополнительно: колебание по насыщенности и яркости
    • цикл основных цветов; дополнительно: рандомное время перехода на каждый шаг
    • фиксированный цвет; дополнительно: второй фиксированный цвет
    • рандомный цвет по параметрам RGB; дополнительно: рандомный цвет по параметрам HSV
    • предустановленный цикл цветов; дополнительно: — (в будущем — набор команд, загруженный с ПК)
    • (активируется с ПК)прямой вывод полученного с ПК цвета; дополнительно: плавное переход на новый цвет
  • трехрежимная кнопка
    • быстрое нажатие — смена подпрограммы (либо сброс паузы);
    • продолжительное нажатие — альтернативный режим;
    • длительное нажатие — переход в сервисный режим(для перепрошивки)
  • таймер обратного отсчета (задается с ПК, макс. время 1:49:13.5)
  • оповещение о событиях (многократные и одноразовые), 6 каналов (по количеству основных цветов)
  • пауза на время различных событий
  • связь с ПК:
    • возможность изменить основные параметры каждой подпрограммы при помощи софта
    • прием команд управления таймером обратного отсчета и оповещениями
    • возможность прямого контроля цвета с ПК, что открывает путь к расширению функционала за счет софта.

Казалось бы: вроде ничего особенного. За вечер можно написать. Но, не зная как работают МК, собираешь, наверное, почти все грабли, которые можно встретить. Тем не менее все труды по перечитыванию документации, углубленному гуглению и переписыванию кода с нуля были оправданы: конечный результат оказался вполне работоспособен.

Сборка


Основные составляющие лампы — корпус, микроконтроллер и светодиод.
В качестве основы для лампы была взята все та же лампа GRÖNÖ из IKEA.
Светодиод — китайский аналог с DealExtreme (SKU 4530), почти в 3 раза дешевле оригинала.
Светодиод сильно греется, необходим хоть какой радиатор, иначе ярко гореть он будет не долго.

Мелочевка:
  • панелька для МК
  • 3 транзистора
  • 3 мощных и 5 маломощных резисторов
  • 2 конденсатора
  • резонатор
  • кнопка
  • miniUSB разъем (в DIP исполнении — редкость)

Все это разместил на плате, дабы попасть в нишу лампы.



Разводка платы в Sprint Layout, перевод на текстолит методом ЛУТ, сверление, пайка.




Работа не идеальная, да и без ошибок не обошлось: один резистор оказался лишним (на схемах его уже нет).



Вся плата размещена под лампой, в выемке для провода размещены кнопка и разъем miniUSB для питания и связи с ПК.


Питание подается через miniUSB, но не стоит подключать лампу с таким светодиодом к первому подвернувшемуся источнику питания: лампа на полной яркости потребляет чуть меньше 1А. Не все БП рассчитаны на такой ток, в зависимости от типа БП им может стать крайне плохо, что может привести к неприятным последствиям.
Для подключения к компьютеру возможно потребуется кабель с дополнительным разъемом питания (как у переносных HDD) или хороший активный USB хаб.

Софт


Найти подходящий софт для индивидуальной задачи — невозможно. Пришлось заняться и этим вопросом самостоятельно.
Программа писалась параллельно с прошивкой и использовалась в основном для отладки лампы. На данный момент не реализованы несколько функций — но возможно вскоре найдется время доделать и их.



Итоги





Как оказалось, сделать себе уникальный USB-гаджет с нуля — вполне доступная задача. Для этого не требуется мастерство пайки недешевых ft232, не требуется отвлекаться на совместимость с программной реализацией USB и не требуется никаких полуфабрикатов Arduino. Все что нужно — это немного желания.

Полезная информация


Набор файлов проекта.
Документация по семейству PIC 18F с поддержкой USB 2.0.
Русский перевод документации: книга «Микроконтроллеры Microchip с аппаратной поддержкой USB» Автор: В. С. Яценков.
Набор библиотек для JAL и IDE — JALEdit.
WinPic800 — программа для прошивки Pic.
MCHPFSUSB — набор для работы с бутлоадером.
Tags:
Hubs:
Total votes 168: ↑167 and ↓1 +166
Views 28K
Comments Comments 99