Программирование AVR: работа с USB Lightpack: система AMBILIGHT на мониторе домашнего компьютера Sat, May 27 2017  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


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]

LP-AVR-USB162-01.png

Это измененная, упрощенная схема lightpack, рассчитанная для сборки на макетной плате AVR-USB162. Схема подробных пояснений не требует. Микроконтроллер управляет ключами на транзисторах IRLML6401. Чтобы открыть транзистор, микроконтроллеру нужно выставить на соответствующей ножке 0, при этом через сток транзистора и токоограничительный резистор 68 Ом на анод цветового канала RGB-светодиода потечет ток, и светодиод загорится. Транзистор может быть только в двух состояниях - открыто (светодиод горит) и закрыто (светодиод погашен). Все промежуточные состояния яркости достигаются быстрыми переключениями светодиода, незаметными для глаза человека - применяется широтно-импульсная модуляция (ШИМ, английская аббревиатура PWM). Благодаря наличию макетной платы AVR-USB162 осталось напаять только транзисторные ключи, внешний коннектор, и изготовить светодиодные модули, которые надо будет потом закрепить на углах монитора.

Я сделал 4 светодиодных модуля (на каждом установлен один RGB-светодиод и 3 токоограничительных резистора). Сначала были проведены небольшие испытания по подбору токоограничительного резистора на каждом из каналов R, G и B при напряжении питания 5 вольт. Номинал резистора примерно рассчитывался по максимально допустимому тока нагрузки для порта USB (500 ма примерно должны распределиться по всем 12 каналам). Сам микроконтроллер AT90USB162 потребляет совсем немного (около 15 ма).

LED-testing.PNG 

R = 33 ом R = 51 ом R = 56 ом R = 68 ом
R, красный 60 мА 46 мА
G, зеленый 43 мА
B, синий 69 мА 45 мА 42 мА 34 мА

По результатам испытаний было выяснено, что номинал резистора для всех каналов можно взять одинаковый - 68 Ом (несмотря на то, что ток при этом по цветовым каналам будет разный, яркость свечения примерно одинаковая). Ток через каждый канал R, G, B при этом получился в диапазоне 35..45 ма (в зависимости от цвета канала). Светодиоды могли бы работать при намного бОльшем токе, но тогда их понадобилось бы ставить на радиатор, и использовать для конструкции отдельный источник питания (порт USB больше 500 ма не потянет). Да это и не нужно, так как яркость оказалась и так слишком большая даже на токе 35..45 ма на канал.

lightpack_IMG_1145.JPG

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

lightpack_IMG_1148.JPG

На обратную сторону каждого кабеля напаял стандартные четырехконтактные "мамы". Цоколевка у всех кабелей одинаковая, чтобы при необходимости каналы можно было менять местами, просто перетыкая разъемы - 1 GND (общий провод, земля, катоды светодиодов), 2 анод цвета R (красный), 3 анод цвета G (зеленый), 4 анод цвета B (синий).

lightpack_IMG_1155.JPG

Теперь осталось распаять ключи. Монтаж на макетной плате сделал разноцветным проводом МГТФ, чтобы было наглядно прохождение сигналов по каналам R, G, B. Для шин питания выбрал МГТФ потолще.

lightpack_IMG_1160.JPG lightpack_IMG_1157.JPG lightpack_IMG_1165.JPG

Подключение светодиодов к контактам P1..P22 (портам) макетной платы AVR-USB162:

№ контакта
порт
цвет
светодиод
P9 PC5 R RGBLED1
P10 PC6 G
P11 PC7 B
P4 PB5 R RGBLED2
P5 PB6 G
P6 PB7 B
P12 PD0 R RGBLED3
P13 PD1 G
P14 PD2 B
P15 PD3 R RGBLED4
P17 PD5 G
P22 PD7 B

Использование других ножек микроконтроллера:

порт
сигнал (назначение)
PB0 ~SS (аппаратная выборка SPI)
PB1 SCLK (тактирование бит SPI)
PB2 MOSI (выход данных SPI)
PB3 MISO (вход данных SPI)
PD4 LED (макетная плата AVR-USB162)
PD6 LED (макетная плата AVR-USB162MU)
PD7 HWB (сигнал активизации DFU bootloader)

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

lightpack_IMG_1173.JPG lightpack_IMG_1176.JPG lightpack_IMG_1180.JPG

Навесил все хозяйство сзади на монитор.

lightpack_IMG_1184.JPG lightpack_IMG_1186.JPG lightpack_IMG_1188.JPG lightpack_IMG_1195.JPG

Теперь надо было приступить к переделке 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-устройстве остаются гореть в случайном состоянии (по идее они должны выключаться).

lightpack_host_soft_err01.PNG

После перезапуска 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.
2. KPTR-080 мощный RGB светодиод 3 Вт (RGB power led 3w) site:bright-leds.ru - мощный RGB светодиод 3 Вт (RGB power led 3w).
3. Макетная плата AVR-USB162.
4. Макетная плата AVR-USB162MU.
5. Download Qt, the cross-platform application framework site:qt-project.org - страничка загрузки Qt от Nokia.
6. ardulight site:code.google.com - другая реализация ambilight на Arduino - ardulight.
7. 110301lightpack.zip - исходный код, фото, схема облегченной версии lightpack, собранной на макетной плате AVR-USB162.
8. Ambilight for your PC site:ambilight4pc.com - промышленная реализация.
9. Еще любительские разработки ambilight - Atmo-plugin site:free-x.de, BobLight site:code.google.com.

 

Комментарии  

 
0 #4 костя 03.05.2016 10:35
У нас кроме paintpack, готовых решений нету?
Цитировать
 
 
0 #3 костя 03.05.2016 10:32
У нас кроме paintpack, других готовых решений в России не осталось?
Цитировать
 
 
0 #2 вася 06.04.2011 02:40
1) поставить обычные эмиттерные повторители или просто цифровые транзисторы.
2) убрать USB питание светодиодов. В конце концов есть +12в в компе. А это цепочки светодиодов и масштабирование до размеров 42-50".
3) не делать отдельный USB датчик освещенности. А просто прикрутить фоторезистор серии VT91/93 к АЦП камня.
4) имхо неплохо было бы добавить "фоновый" канал белого цвета.

microsin:
1) бред...
3) никто не предлагал отдельный USB-датчик освещенности, и у чипа AT90USB162 нет АЦП.
Цитировать
 
 
0 #1 Atarity 02.03.2011 04:08
Спасибо за обзор. Использовать жестяную банку для отражателей -- необычное и, наверное, вполне эффективное решение. Рассеиватели вам всё-таки понадобились из-за низкого качества светодиодов.

Буду благодарен, если вы добавите нам багрепорт по поводу зависания программы в спящем режиме: http://code.google.com/p/lightpack/issues/list с более-менее подробным описанием.

Что касается яркости, то в свежих версиях исходников уже реализованы профили настроек, а управлять яркостью каждого отдельного канала можно через файл-конфиг (скоро задокументируем ).

Ещё раз благодарю за описание ваших экспериментов.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page