Нужно будет указать количество светодиодов (верх,низ,слева,справа)
А программа сама поделит на зоны(разрешение/количество светодиодов)
Вид для печати
Нужно будет указать количество светодиодов (верх,низ,слева,справа)
А программа сама поделит на зоны(разрешение/количество светодиодов)
В идеале да, но не все так просто.
Лента должна быть расположена на задней стенке монитора/телевизора. Не так как у меня на последнем видео обернута (это временный вариант для лучшей демонстрации как это работает), а разрезана на углах и соединена какими-то проводками, потому что в горизонтальной плоскости лента так не гнется. При таком разрезании не получится очень точно, равномерно, стык в стык разместить эти ленты, однозначно получатся зазоры. Можно конечно подумать об алгоритме расчета оптимального размещения ленты. Учесть минимальную длину звена ленты, ширину ленты, габариты, разрешение, размер видимой части экрана, ширину каемки/рамки монитора/телевизора. Что вроде как вполне возможно.
Тут еще могут всплыть некоторые модели телевизоров, у которых так разместить ленту будет проблематично, потому что она закроет вентиляционные отверстия. Но это уже второй вопрос, сначала надо сделать первую основную часть, а потом уже решать проблемы особенностей дизайнов некоторых моделей :).
Другой вариант - использовать светодиоды как в проекте AdaLight. Но лично мне такое исполнение не очень нравится, потому что вместо аккуратной ленты получается куча проводов, которые будут копить пыль, и сложнее будет эту пыль чистить.
на странице FastSPI есть вот такая фраза
sometimes the strips from china wire oddly, and it may be something like:
struct CRGB { unsigned char b; unsigned char r; unsigned char g; }
что по русски значит примерно следующее:
некоторые китайские ленты сделаны криво и порядок цветов может отличаться.
Судя по косяку с подписями к пинам Data и Clock это и есть объяснение проблемы.
После проверки оказалось, что действительно вместо
strip.setPixelColor(i, Color(red, green, blue));
надо писать
strip.setPixelColor(i, Color(blue, red, green));
Правильный скетч следующий, но делайте поправку на реализацию своей ленточки.
Надеюсь, что у вас ленточка окажется с меньшим количеством косяков :)
Эх и китайцы :)Код:#include <SPI.h>
#include <WS2801.h>
unsigned long blank = 0;
int zones = 20;
int dataPin = 2;
int clockPin = 3;
WS2801 strip = WS2801(zones, dataPin, clockPin);
int leds = zones * 3;
void setup()
{
strip.begin();
strip.show();
Serial.begin(115200);
}
void loop()
{
if (Serial.available() > leds)
{
if (Serial.read() == 255) //проверка префикса
{
for (int i = 0; i < zones; i++)
{
// прочитать данные о цветах из порта в массив
byte red = Serial.read();
byte green = Serial.read();
byte blue = Serial.read();
// так должно быть по правильному
//strip.setPixelColor(i, Color(red, green, blue));
// но на китайской ленточке перепутан порядок цветов, поэтому так
strip.setPixelColor(i, Color(blue, red, green));
}
blank = 0;
}
}
else
{
if (blank > 100000)
{
blank = 0;
for (int i = 0; i < zones; i++)
{
strip.setPixelColor(i, Color(0, 0, 0));
}
}
blank++;
}
strip.show();
}
// Create a 24 bit color value from R,G,B
uint32_t Color(byte r, byte g, byte b)
{
uint32_t c;
c = r;
c <<= 8;
c |= g;
c <<= 8;
c |= b;
return c;
}
на уголки можно ставить вот такие коннекторы
http://www.alibaba.com/product-gs/45...connector.html
Накидал в электронной таблице расчет ленты для монитора.
Выложил в гуглдокс, затестить можете тут
Таблица в общем доступе доступна для изменения, можете подставлять свои данные.
Ваять веб страничку с калькулятором пока не стал :)
Собрал свой Ambilight на 10 зон, использовал Arduino Nano и два светодиодных драйвера TLC5940NT.
Телевизор Philips 52 дюйма.
Ленту брал такую.
Вот так все устроено.
В качестве управляющей программы использовал LightPack 5.8.6-1.
Выглядит очень даже симпатично:
День добрый, не как не могу оставить тему фоновой подсветки, понравилась идея с WS2801, но если с лентой 3-диода на чип всё понятно
(5 метров= 100мм зона * 50 зон), то вот с 1 -диодом на чип
(5 метров= 32мм * 156 зон) не всё ясно :)
Поясню, у меня телевизор 32дюйма, 800мм на 530мм, выходит если брать ленту 1-диод на чип(32мм-зона) получяется
сверху и снизу по 25зон*2
слева и справа по 16 зон*2
в Итоге 82 зоны.
С прошивкой думаю не будет проблем взять скей MAKCа и вместо 20 поставить 82, или я не прав?
И с софтом не знаю что придумать, Лайтпаковый поддерживает мах50...
У ково какие идеи есть по этому поводу?
п.с. по поводу верхнего поста Чипа, ты написал что нужно переделать программу чтоб было лево право низ верх, ты имел ввиду Софт для ПК или скейч для ардуины?
Я имел ввиду софт компьютера, у меня телевизор 55"
ЧИп а ты уже заказал? Если да, то где :) и почём ?
Видел такие ленты только на алиэкспресе... на Ebay только 1чип на 3 диода.
Еще не заказывал,до банка ни как не дойду денег на карточку положить
Ленты здесь ищи
Да, все правильно.
Ну тут можно попробовать связаться разработчиками LightPack и попросить их снять ограничения или увеличить до какого-нито значения побольше, например, меня бы устроило значение 254. LightPack проект тоже открытый, думаю разработчики пойдут навстречу :) Я бы еще попросил у них, чтобы добавили настроечку - передавать или не передавать вторым байтом, после синхронизирующего 255, количество зон. И установленное количество зон сохранять в профиле.
Если я правильно понял вопрос, то постараюсь ответить. Chip предложил доработать программку для компьютера для автоматического расчета положения светодиодов и зон захвата. Развивая эту идею была накидана электронная таблица для примерного расчета размеров зон. Дальнейшее обмозговывание автоматизации расчета размещения зон пока привело к нескольким вариантам (но пока не раелизовано в алгоритме расчета) размещения лент на корпусе и соответственно зон захвата на экране:
1. светодиодные зоны полностью умещаются и по горизонтали и по вертикали
2. светодиодные зоны полностью умещаются по горизонтали, но сильно не хватает по вертикали
3. светодиодные зоны полоностью умещаются по вертикали, но сильно не хватает по горизонтали
Пример 1 варианта виден на видео, где лента обернута вокруг монитора, и расположение зон захвата на экране у меня получилось следующее с перекрытием
http://img13.imageshost.ru/img/2012/...a0ea_small.jpg
Пример для варианта 2
после закрепления лент на корпус монитора у меня получилось, что по гризонтали укладывалось целое количество отдельных звеньев ленты. а вот по вертикали получался 330 / 83 = 3.97, да еще и горизонтальная лента имеет ширину, получилось, что у меня по бокам 3 зоны и некоторый зазор.
в этом случае на углах получается размещение звеньев и зон следующим образом
Пример варианта 3Код:+---+---+
+---+---+...
+-+
| |
+-+
| |
+-+
...
аналогичен варианту 2 только когда по вертикали укладывается целое количество зон, а по горизонтали нет
Думаю, эти все варианты можно рассчитывать автоматически. Попробую доработать рассчет в электронной табличке с выдачей рекомендации по размещению лент и зон захвата на экране.Код:+-++---+---+
| |+---+---+...
+-+
| |
+-+
...
Постараюсь сегодня вечерком снять видео и фото окончательного варианта того что у меня получилось.
Закрепить светодиодную ленту решил по идее Adalight, чтобы не осталось следов от скотча, клея и прочих липких способов крепления.
Расположение светодиодной ленты на картонной подложке:
http://img13.imageshost.ru/img/2012/...6c07_small.jpg
Закрепеление подложки с лентой на корпус монитора
http://img13.imageshost.ru/img/2012/...23a6_small.jpg
Размещение зон захвата:
http://img13.imageshost.ru/img/2012/...c884_small.png
Видео как это все работает:
МАКС афигенски получилось!!! минимум проводов! максимум удовольствия!
п.с. Пошёл заказывать ленты :)
Если пофантазировать то для телевизоров висящих на стене еще можно сделать рамку из алюминиевого уголка и закрепить на нем ленту , а сам уголок закрепить на стене. Хотя вешать рамку, придется сверлить саму стену
CHIP Это такая лента?
Лента почти такая, у этой другой чип. IC 6803.
Мне кажется или у МАКСА не правильная цветопередача?
самый зачетный сабж у crazydnb!!!
Интересно, а можно как-нито скомпенсировать индивидуальный цветовой фон в каждом отдельном случае?
Например в моем убавить красного и добавить синего с зеленым, чтобы итоговая цветопередача была правильной.
попробуешь напиши, очень хочу посмотреть, а динамические сцены без опозданий?
Доброго времени суток! Решил сделать подсветку на 42 канала, используя 74HC595 и ULN2004. Развел платку, запаял, прошил, вроде как работает, светодиоды загораются, но не так как надо. не загорается красный из 3 зоны, зелёный из 5 зоны, красный из 10 зоны, зелёный из 12 зоны, а синего из 7 зоны и синего из 14 зоны вообще нету. То есть походу не правильная отправка потока в SPI. Код который заливаю в мегу написанный в ArduinoIDE:
Помогите пожалуйста разобраться с этой ситуацией.Код:#define TCNT2_Const 247
#define BrightnessSize 42//число каналов
unsigned long blank=0; //таймер простоя
unsigned long Max_Blank=65000;
uint8_t volatile PWM_Counter=0;
uint8_t Brightness[BrightnessSize];
void setup()
{
pinMode(10, OUTPUT); //SS SPI вывод для управления защелкой
pinMode(11, OUTPUT); // SPI DATA
pinMode(13, OUTPUT); // SPI Clock
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(13,LOW);
SPSR = (1<<SPI2X); // SPI set clock rate fck/2
SPCR = (1<<SPE)|(1<<MSTR); // Enable SPI, Master
for (int i=0; i<BrightnessSize; i++) //обнулить массив
{
Brightness[i]=0;
}
Serial.begin(115200);
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
TCCR2B |= (1<<CS22); //установка предделителя 64
ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
TCNT2 = TCNT2_Const; // 16000000/256/100/64=8 tcnt2=256-8=248.
TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
sei();
}
void loop()
{
if (Serial.available())
{
if (Serial.read() == 255) //проверка прификса
{
for (int i = 0; i < BrightnessSize; i++)
{
for (;(Serial.available()==0)&&(blank<=Max_Blank);blank++);
if (Serial.available())
{
Brightness[i] = Serial.read(); // прочитать данные о цветах из порта в массив
blank=0;
}
}
}
} else
{
if(blank>Max_Blank)
{
blank=0;
for (byte i = 0; i < BrightnessSize; i++)
Brightness[i] = 15;
}
blank++;
}
}
SIGNAL(TIMER2_OVF_vect)
{
uint8_t PWM_Counter_v=PWM_Counter; // поскольку PWM_Counter объявлена как valotile, обращение к ней - всегда обращение в память. Поэтому создаем локальную копию, она бeдет храниться в регистре.
TCNT2 = TCNT2_Const;
uint8_t byte_shift;
uint8_t * CBright;
CBright = (uint8_t *)&Brightness[0];
uint8_t j=0;
for (j=6;j>0;j--)
{
byte_shift = 0;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
SPDR = byte_shift; //отправляем в шину SPI
}
PORTB |= (1<<PIN2); //формируем положительный импульс защелки
PWM_Counter++;
while(!(SPSR & (1<<SPIF))); // Ожидание завершения передачи данных
PORTB &= ~(1<<PIN2);
}
P.S. софт использую Ambilight - 2011 - Eraser Soft c.1.1.11 и Лайтпак 5.8.6-1
Ну я бы стал проверять так:
1. Сделал так, чтобы все светодиоды горели -
после блоков
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
прописать
SPDR=255;
вместо
SPDR = byte_shift;
Затем взять вольтметр и посмотреть что творится на выводах 595-х. Что-то мне подсказывает, что у тебя проблема скорее в разводке (которую, возможно, получится программно исправить).
У тебя не работает по светодиоду в 3-5-7-10-12-14 зонах.
Если считать, что не работает каждый 7-й вывод, то так и будет.
Когда поменял SPDR = byte_shift на SPDR=255 на всех выходах 595-х по 4,82 вольта. А когда проге выставляю в настройках подсветка и цвет белый, перед этим естественно прошивку вернул как было, то на выводах 595-х с 1 по 6 и 15-ый есть напряжение 4,67 а на 7-ом выводе каждой 595-ой напряжение 0,7. То есть ты прав не работает каждый 7-й вывод.
А вследствии чего так происходит??? данные не смещаются на один бит влево???
попробуй в последнем блоке
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
убрать последнюю строку
ps. я правильно понял, что при byte_shift = 255 все светится?
да правильно понял, при SPDR = 255 под напряжением все выводы, при удалении строчки byte_shift = byte_shift<<1 в последнем блоке, происходит то что отсутствие напряжение с 7 переходит на 6 вывод, то есть на 7 выводе раньше не было теперь появилось напряжение, а на 6 раньше было а щаст нету
определи бит, который не выводится. Попробуй присваивать 255-<степень двойки>. И добейся, чтобы горело все.
почему то не происходит смещение бита, у меня задействованы выводы q1...q7, а данные посылаются на q0..q6
то есть при SPDR=254 горят все?
стоп. Сначала.
У uln 8 выходов. В твоей схеме какие из них используются?
У меня в схеме использовались только 7.
не в uln а в 595, хотя там и там их 8, я использую выходы с q1 по q7, а q0 тот что на 15 ноге по счету я не задействовал. да по вашей схеме делалась разводка.
если крайний вывод не используется, то все светодиоды должны гореть при посылке 127 либо 254.
Нужно понять какой бит из 8 не используется. Ну и уже потом - сделать так, чтобы в остальные данные гнались при работе эмбилайта.
при 254 и при 127 нет напряжения на q6 всех 595. так кая я в этом деле новичек, то мне кажется проще всего припаяться к q0 каждого 595-ого. и не выносить себе мозг. Да это должно решаться с помощью исправления прошивки для МК.
P.S. когда моя пердоставленная прошивка выше работает, то данные посылаются с q0 по q6, а мне надо с q1 по q7.
попробуй конец таймера сделать
А в в самом начале циклаКод:if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
while(!(SPSR & (1<<SPIF))); // Ожидание завершения передачи данных
SPDR = byte_shift; //отправляем в шину SPI
}
PWM_Counter++;
}
поставить
PORTB |= (1<<PIN2); //формируем положительный импульс защелки
PORTB |= (1<<PIN2);
PORTB &= ~(1<<PIN2);
сделал как ты сказал, но результат - не работает правельно