Здравствуйте, друзья! Поговорим о технологии amblight (послесвечение - фоновая задняя подсветка ТВ), эту опцию предлагают в своих телевизорах philips. Реализаций этой красоты в интернете очень много, но я свой выбор остановил на проекте ardulight - во первых он мне под силу(как новичку), во вторых печатная плата в формате .lay - в наличии, в третьих удобная прога написана, а главное давно забытая светодиодная лента в наличии. За дело! Начнём с перечня элементов: в моём городе транзисторы мне обошлись бы в 700 рублей, в стране почта которой субсидируется на госуровне (china) - 20 этих полевиков обошлись в 180 рублей.
Бобину ленты rgb в 5 метров взял с игрушки на пульте ДУ (china). Расстояние от моего компьютера до телевизора метров 5, докупил удлинитель - почему-то терзал себя мыслью, что arduino на таком расстоянии будет "лагать", ничего подобного всё летает (я прекрасно понимаю, что такое цифровой сигнал).
Устройство имеет 6 зон по 3 ключа. Вашему вниманию показан фрагмент схемы, а точнее 1-ая зона в ней три ключа (транзисторы) к стоку которых подключены три цвета rgb. По такому-же принципу подключены полевые транзисторы18 каналов 6 зон. Для удобства понятия и восприятия всё сведено в таблицу:
Печатная плата:
Печатная плата имеет двусторонний монтаж, контроллер с одной стороны - вся пайка на другой стороне платы, не забудем перемычку между gnd и минусом питания.
Тут есть момент который необходимо оговорить - светодиодные ленты имеют разный порядок расположения светодиодов у меня он был такой - +brg. Дальше побитовое переключение каналов; таймеры и счётчики в это "вдаваться" не нужно - код уже продуман и отлажен.
#define d4_high portd |=b00000100 //red
#define d4_low portd &= b11111011
#define d2_high portd |=b00001000 //green
#define d2_low portd &= b11110111
#define d3_high portd |=b00010000 //blue
#define d3_low portd &= b11101111#define d7_high portd |=b00100000
#define d7_low portd &= b11011111
#define d5_high portd |=b01000000
#define d5_low portd &= b10111111
#define d6_high portd |=b10000000
#define d6_low portd &= b01111111#define d10_high portb |=b00000001
#define d10_low portb &= b11111110
#define d8_high portb |=b00000010
#define d8_low portb &= b11111101
#define d9_high portb|=b00000100
#define d9_low portb &=b11111011#define d13_high portb |=b00001000
#define d13_low portb &= b11110111
#define d11_high portb |=b00010000
#define d11_low portb &= b11101111
#define d12_high portb |=b00100000
#define d12_low portb &= b11011111#define d16_high portc |=b00000001
#define d16_low portc &= b11111110
#define d14_high portc |=b00000010
#define d14_low portc &= b11111101
#define d15_high portc |=b00000100
#define d15_low portc &= b11111011#define d19_high portc |=b00001000
#define d19_low portc &= b11110111
#define d17_high portc |=b00010000
#define d17_low portc &= b11101111
#define d18_high portc |=b00100000
#define d18_low portc &= b11011111volatile unsigned int tcnt2;
volatile byte pwm_time;
//byte pwm_time, red_r_old, green_l_old, blue_t_old;
unsigned long blank=0; //таймер простоя
byte volatile color[18]; //массив храннения цветов 18-ть каналовvoid setup()
{
for (int i=2; i < 20; i++){pinmode(i, output);}
serial.begin(115200);
timsk2 &= ~(1<<toie2); //разрешения прерывания по переполнению таймера/счетчика Т2
tccr2a &= ~((1<<wgm21) | (1<<wgm20));// Режим работы таймера/счетчика
tccr2b &= ~(1<<wgm22);// Режим работы таймера/счетчика
assr &= ~(1<<as2); //Выбор источника синхронизации таймера если as2=0 от системного генератора
tcnt2 = 252; // 16000000/31000/64=8 tcnt2=256-8=248.
timsk2 |= (1<<toie2);//Разрешение прерывания по переполнению Т2.
}void loop()
{
if (serial.available() > 18)
{
if (serial.read() == 255) //проверка прификса
{
for (int i = 0; i < 18; i++)
{
color[i] = serial.read(); // прочитать данные о цветах из порта в массив
}
// if (red_r_old == color[0] && green_l_old == color[4] && blue_t_old == color[8])
blank=0;
}
} else {
if(blank>100000) { blank=0; for (byte i = 0; i < 18; i++) color[i] = 0;}
blank++;
}
}
//****************обработчик прерывания********************
isr(timer2_ovf_vect)
{
tcnt2 = tcnt2;pwm_time++;
if(color[0] > pwm_time ) d2_high; else d2_low;
if(color[1] > pwm_time ) d3_high; else d3_low;
if(color[2] > pwm_time ) d4_high; else d4_low;
if(color[3] > pwm_time ) d5_high; else d5_low;
if(color[4] > pwm_time ) d6_high; else d6_low;
if(color[5] > pwm_time ) d7_high; else d7_low;
if(color[6] > pwm_time ) d8_high; else d8_low;
if(color[7] > pwm_time ) d9_high; else d9_low;
if(color[8] > pwm_time ) d10_high; else d10_low;
if(color[9] > pwm_time ) d11_high; else d11_low;
if(color[10] > pwm_time) d12_high; else d12_low;
if(color[11] > pwm_time) d13_high; else d13_low;
if(color[12] > pwm_time) d14_high; else d14_low;
if(color[13] > pwm_time) d15_high; else d15_low;
if(color[14] > pwm_time) d16_high; else d16_low;
if(color[15] > pwm_time) d17_high; else d17_low;
if(color[16] > pwm_time) d18_high; else d18_low;
if(color[17] > pwm_time) d19_high; else d19_low;
}
Программа имеет удобный и приятный вид - сразу бросается в глаза, что писал грамотный человек. Вот возможности:
Переходим к тестированию проверяем зоны и цвета:
Переносим на телевизор, предлагаю свой вариант расположения устройства:
Не мог себе отказать в удовольствии погонять ардулайт в динамических-резких - взрывающих сценах - я выбрал анимэ:
Всю гамму ощущений фото не передадут, а вот видео на моём канале можно посмотреть по этой ссылке
Обсудить статью ФОНОВАЯ ПОДСВЕТКА ДЛЯ ТЕЛЕВИЗОРА