Lightpack: система AMBILIGHT на мониторе домашнего компьютера |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Открытая разработка lightpack позволяет сделать на мониторе компьютера заднюю динамическую подсветку, зависящую от изображения на экране. Принцип работы такой же, как у запатентованной системы AmbiLight компании Philips. Особенно полезна технология при просмотре фильмов, потому что усиливается эффект присутствия от происходящего действия. Исходники и описание проекта доступно для всеобщего доступа (см. Ссылки [1]). Принцип работы довольно несложен - программа на компьютере анализирует цвета заданных областей экрана, и передает эти данные на устройство USB HID, которое и управляет светодиодами. В данные пакетов закодирована яркость каждого для каждого светодиода, и микроконтроллер устройства USB (применен чип AT90USB162) с помощью программно формируемой ШИМ регулирует яркость каждого светодиода RGB. Мне тоже захотелось собрать себе такое же устройство, используя макетную плату AVR-USB162 [3, 4]. Работ по сборке будет совсем мало, так основная часть схемы (обвязка микроконтроллера, подключение по USB) уже готова. Но к сожалению, в оригинальном проекте [1] для подключения светодиодов используются дефицитные LED-драйверы MBI5026. Таких микросхем найти на радиорынке не удалось, сколько ни искал. Не оказалось даже близких по функциям аналогов - MBI5027, MBI5028, MBI5029, MIC4467, MIC4468, MIC4469, DM133, DM141, DM413, DM632. Поэтому решил микросхемы LED-драйверов выкинуть совсем, оставить только 4 RGB-светодиода (купил мощные сверхяркие KPTR-080, см. Ссылки [2]) и миниатюрные полевые ключевые транзисторы. Искал на рынке IRLML6401 (P-канал) и IRLML2402 (N-канал), удалось найти IRLML6401. После этого осталось начертить несложную схему и приступить к сборке "железа" и переделке firmware для него. [lightpack hardware] Это измененная, упрощенная схема lightpack, рассчитанная для сборки на макетной плате AVR-USB162. Схема подробных пояснений не требует. Микроконтроллер управляет ключами на транзисторах IRLML6401. Чтобы открыть транзистор, микроконтроллеру нужно выставить на соответствующей ножке 0, при этом через сток транзистора и токоограничительный резистор 68 Ом на анод цветового канала RGB-светодиода потечет ток, и светодиод загорится. Транзистор может быть только в двух состояниях - открыто (светодиод горит) и закрыто (светодиод погашен). Все промежуточные состояния яркости достигаются быстрыми переключениями светодиода, незаметными для глаза человека - применяется широтно-импульсная модуляция (ШИМ, английская аббревиатура PWM). Благодаря наличию макетной платы AVR-USB162 осталось напаять только транзисторные ключи, внешний коннектор, и изготовить светодиодные модули, которые надо будет потом закрепить на углах монитора. Я сделал 4 светодиодных модуля (на каждом установлен один RGB-светодиод и 3 токоограничительных резистора). Сначала были проведены небольшие испытания по подбору токоограничительного резистора на каждом из каналов R, G и B при напряжении питания 5 вольт. Номинал резистора примерно рассчитывался по максимально допустимому тока нагрузки для порта USB (500 ма примерно должны распределиться по всем 12 каналам). Сам микроконтроллер AT90USB162 потребляет совсем немного (около 15 ма).
По результатам испытаний было выяснено, что номинал резистора для всех каналов можно взять одинаковый - 68 Ом (несмотря на то, что ток при этом по цветовым каналам будет разный, яркость свечения примерно одинаковая). Ток через каждый канал R, G, B при этом получился в диапазоне 35..45 ма (в зависимости от цвета канала). Светодиоды могли бы работать при намного бОльшем токе, но тогда их понадобилось бы ставить на радиатор, и использовать для конструкции отдельный источник питания (порт USB больше 500 ма не потянет). Да это и не нужно, так как яркость оказалась и так слишком большая даже на токе 35..45 ма на канал. На модуль припаял четырехпроводный кабель, и для прочности, чтобы не отломились медные жилы в местах пайки, закрепил его термоклеем. Длину кабеля отмерил по монитору, в расчете, что макетная плата AVR-USB162 будет закреплена примерно с правом нижнем углу монитора. На обратную сторону каждого кабеля напаял стандартные четырехконтактные "мамы". Цоколевка у всех кабелей одинаковая, чтобы при необходимости каналы можно было менять местами, просто перетыкая разъемы - 1 GND (общий провод, земля, катоды светодиодов), 2 анод цвета R (красный), 3 анод цвета G (зеленый), 4 анод цвета B (синий). Теперь осталось распаять ключи. Монтаж на макетной плате сделал разноцветным проводом МГТФ, чтобы было наглядно прохождение сигналов по каналам R, G, B. Для шин питания выбрал МГТФ потолще. Подключение светодиодов к контактам P1..P22 (портам) макетной платы AVR-USB162:
Использование других ножек микроконтроллера:
Для светодиодных модулей сделал отражатели из крышки банки из-под лимонных долек, для чего распилил её на 4 части. По замыслу, бордюрчик должен защищать глаза пользователя от бокового света светодиодов (которые, кстати говоря, светят настолько ярко, что слепят, если прямо на них смотреть). Модули приклеил к отражателям клеем "Момент", а сами отражатели налепил на двухсторонний скотч. Навесил все хозяйство сзади на монитор. Теперь надо было приступить к переделке firmware, так как схема у меня отличается от оригинальной схемы lightpack. [lightpack firmware] Нужно, чтобы микроконтроллер управлял не микросхемами драйверов, как у оригинального lightpack, а напрямую управлял портами ввода/вывода микроконтроллера. Для этого скачал исходники с домашней странички проекта (см. Ссылки [1]). Все оказалось довольно просто - весь функционал по зажиганию светодиодов оказался сосредоточен в подпрограмме lightpack\Firmware\Lightpack.c -> void PWM(void). Эта подпрограмма вызывается в обработчике прерывания таймера 1, и программно формирует ШИМ для всех каналов светодиодов (данные для ШИМ поступают по USB). Выкинул модуль макросов управления микросхемами драйверов LedDriver.h, написал свои макросы управления портами в pins.h, и подпрограмму начальной инициализации портов. Скомпилировал, прошил через USB DFU бутлоадер Flip, попробовал. Все заработало сразу, как ни странно. В компьютере определилось новое устройство lightpack, драйвера не понадобились (т. к. это USB HID). Остальные части firmware (подсистема USB на библиотеке LUFA, дескрипторы, сервисные подпрограммы) переделок не потребовали. Запустил ПО хоста Software_v4.0.9.exe. Программа увидела устройство, в трее зажегся желтый значок. Отлично, можно приступать к экспериментам. [lightpack software] ПО хоста Software_v4.0.9.exe написана в кроссплатформенной среде разработки QT (см. Ссылки [5]). Я пока в этих исходниках не разбирался, просто попробовал скомпилировать - все компилируется. [Результаты испытаний] 1. ПО хоста пока кривое (что, кстати, авторы и не скрывают) - сильно грузит комп (до 15 %), курсор мыши мигает. При уходе монитора в энергосберегающий режим программа зависает, и светодиоды на USB-устройстве остаются гореть в случайном состоянии (по идее они должны выключаться). После перезапуска exe-файла программы работа возобновляется нормально. 2. Светодиоды KPTR-080 как выяснилось, светят слишком ярко, раздражают глаза, и свет от них рассеивается и перемешивается плохо. При этом видны тени с разноцветной окантовкой - из-за того, что кристаллы R, G, B в одном светодиоде находятся друг от друга на некотором расстоянии, а линзы у светодиодов не рассеивают свет (они у меня не матовые, а прозрачные). Проблема разрешилась, когда я залепил светодиоды бумажным скотчем. После этого подсветка стала отличной, и смотреть кино стало приятно. 3. Не хватает ручной (или ручной + автоматической, в зависимости от внешнего освещения) регулировки общей яркости у светодиодов. Наверное, для этого можно использовать один аппаратный канал ШИМ микроконтроллера и один ключевой полевой транзистор. Идеальный вариант - добавить управление яркостью в протокол, и добавить в аппаратуру устройства USB датчик освещенности. 4. ПО хоста не поддерживает автоматическое отслеживание смены разрешения экрана (например, при запуске какой-нибудь игры в полноэкранный режим). 5. ПО хоста не поддерживает двухмониторной и трехмониторной конфигурации. 6. Применить дефицитные микросхемы драйверов для управления светодиодами, как сделали авторы в оригинальном проекте, да еще делать для них программный SPI - неудачная идея. Однозначно нужно использовать аппаратный SPI, и микросхемы драйверов выстраивать в цепочку. Таким способом можно подключить любое количество драйверов и любое количество светодиодов. Однако вообще использование драйвера хорошо подойдет только для коммерческой продукции, для радиолюбителя такой вариант труден для повторения, так как микросхемы драйвера достать практически невозможно. Поэтому лучше задействовать порты ввода/вывода для управления светодиодами. Тут возможны два варианта. Первый - сделать как в моей схеме, тогда можно поставить только 4 светодиода, и SPI использовать для подключения дополнительных модулей с драйверами (со своим источником питания, так как USB уже не потянет. Второй вариант - сделать матрицу светодиодов, тогда можно совсем отказаться от драйверов, и количество светодиодов можно значительно увеличить. Например, матрица 6x6 позволяет реализовать 36 каналов, т. е. 12 RGB светодиодов. Но тут другая сложность - нужно тщательно спроектировать систему, чтобы правильно кодировать цвета в матрице, и увеличивается количество проводов, идущих к каждому RGB-светодиоду (6 проводов вместо 4). Кроме того, нужен отдельный источник питания (USB уже не потянет) с защитой, и предусмотреть быстрый WDT в firmware, исключающий зависание матрицы - чтобы не спалить светодиоды или токоограничительные резисторы. 7. Наверное, изначально нужно было проектировать lightpack, используя уже готовые наработки по протоколу обмена (я имею в виду ardulight [6] и ambilight-alex-fox.spb.ru [9]), и делать USB CDC, а не USB HID. Это упростило бы написание ПО хоста для радиолюбителей, так как USB CDC - это тот же самый последовательный порт RS-232, а писать программы под него радиолюбители умеют. Для коммерческой же реализации лучше использовать USB HID, так как его проще сделать устойчивым к программным сбоям - не нужно переподключать устройство USB, если произошла какая-то проблема с ПО хоста и, наоборот, не надо перезапускать ПО хоста, если произошло случайное отключение кабеля от устройства USB. 8. Разъем miniUSB не надежен для питания устройства под большой нагрузкой. Лучше было взять розетку типа B, которую ставят, например, на принтеры. 9. В протокол обмена данными нужно добавить команду перехода в DFU bootloader Flip. Это позволит не перетыкать USB устройство, если его нужно перепрошить. Вывод - авторы задумывали устройство с прицелом в будущем поставить его на коммерческую основу, и воспользовались GPL для раскрутки и упрощения разработки проекта. Однако реализация железа взята неудачная. Нужно было применить аппаратный SPI для управления драйверами, и использовать порты ввода-вывода микроконтроллера, чтобы напрямую управлять ключами. В целом впечатления от работы устройства lightpack положительные, киношки стало смотреть интереснее. В заключение - демонстрационный видеоролик авторов.
[Ссылки] 1. lightpack site:code.google.com - подсветка ambilight на монитор - проект lightpack. |