Результаты опроса: Нужна ли вам такая функция на телевизоре?

Голосовавшие
191. Вы ещё не голосовали в этом опросе
  • Нет.

    28 14.66%
  • Да.

    129 67.54%
  • Нужна , только руки кривые, самому не осилить

    34 17.80%
Показано с 1 по 10 из 921

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Пользователь
    Регистрация
    12.11.2011
    Возраст
    48
    Сообщений
    37
    Вес репутации
    176

    По умолчанию Re: Фоновая подсветка телевизора Ambilight

    Предисловие:
    - Выдержка из инструкции: 1. Проверьте правильность подключения проводов.
    - Анекдот: Стирает парень штаны и приговаривает: Никому нельзя доверять. Никому... Даже себе... Ведь только пукнуть хотел.

    Теперь собственно сам пост.
    Наконец то собрал вариант этого девайса на светодиодной ленте с адресуемым драйвером на чипе WS2801.
    Идея которого началась еще вот с этого поста.

    Решение получилось очень простое. Собрать может каждый, кто способен припаять 4 проводка
    Лента была заказана перед самым новым годом.
    Получена на почте в начале февраля.
    3 недели ушло на то чтобы заставить её работать. Это был самый длительный и неприятный этап. Один раз по невнимательности перепутал контакты, она у меня заработала, а все следующие разы, при внимательной, аккуратной сборке по подписям ну никак не хотела работать . Решил уже что спалил. Настроение портилось из-за зря потраченных и спаленных 100 баксов и месяца потерянного времени. Оказалось, что хитрые китайцы с какой-то коварной целью на ленте перепутали местами подписи Data, Clock. До меня это так и не дошло, пару недель мучался, пытаясь заставить работать эту ленту. Проблему решил друг за один вечер, которому я отрезал кусок ленты для опытов (если она не рабочая, то не жалко, а если рабочая, то вдруг у него получится заставить её работать). На следующее утро он мне сказал причину проблемы. За что ему ОГРОМНОЕ СПАСИБО Именно к этой части всей истории относится предисловие

    Дальше уже все на приподнятых эмоциях все пошло гораздо быстрее

    Особенности ленты:
    - светодиоды сгруппированы по 3 штуки, 1 чип на 3 RGB светодиода.
    - герметизация - силиконовая трубка. Для крепления на телевизор предпочтительнее залитая в силикон. Я именно такую и заказывал, но пришла эта . На странице ленты в отзывах другой чувак написал, что заказывал наоборот в трубке, а ему пришла в заливке. Так что аккуратнее при заказе, если решитесь заказывать у этого продавца. Без герметизации считаю неудобной по причине сложностей с протиркой регулярно копящейся неизвестно от куда берущейся пыли

    Скетч, взятый из этой темы, переделал с использованием библиотеки для WS2801
    https://github.com/adafruit/WS2801-Library
    Библиотека время от времени обновляется.

    В результате получилось вот что:
    Код:
    #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();
    
            byte green   = Serial.read();
            byte blue = Serial.read();
            byte red  = Serial.read();
    
            strip.setPixelColor(i, Color(red, green, blue));
          }
          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;
    }
    В качестве управляющей программы использовал LightPack 5.8.0.
    Описание проекта тут http://code.google.com/p/lightpack/
    Скачать софт отсюда http://code.google.com/p/lightpack/downloads/list
    Использовал его как наиболее легко настраиваемый и более интуитивно понятный для простого человека, т.к. этим проектом заинтересовались мои друзья, знакомые, далекие от электроники и программирования.

    Демонстрации работы ленты
    в катушке на столе:

    лентой на полу:

    Примерно тоже самое только участников больше

    Как это все выглядит на мониторе. Пока без окончательно крепления на заднюю стенку монитора:


    Настройки зон в LightPack

    Вот тут должна быть картинка, но вот в FireFox 10.0.2 не хочет она отображаться, в Google Chrome все нормально.
    Поэтому ссылка на всякий случай на картинку без предпросмотра ниже
    http://imageshost.ru/photo/176582/id1506771.html

    LightPack c 20 зонами и с захватом 60 кадров в секунду нагружает процессор на 40%
    CPU Intel Core 2 Duo E8400 3.0ГГц
    RAM 6Гб
    Video Asus GeForce 9600
    OS Ubuntu 10.04 x64

    Тут картинки окончательного решения

    Планы на будущее:
    - хотелось бы добавить в протокол передачи данные с компа на контроллер после синхронизирующего кода 255 количество зон. Библиотека WS2801 позволяет динамически менять количество адресуемых пикселей. И это параметр позволит менять количество зон без перепрошивки контроллера. 8 бит на 1 кадр не сильно увеличат объем передаваемых данных, зато сильно упростять конфигурацию конечной пользовательской системы.
    - попробовать использовать библиотеку FastSPI. Еще не ковырял её, но вроде как было написано, что она каким-то образом не хранит в памяти массив цветов каждой зоны. Это позволит снять ограничения контроллера на объем имеющейся оперативной памяти и позволит адресовать большее количество зон.
    - применить RGB ленту с чипом на 1 RGB светодиод. Например вот такую
    http://www.aliexpress.com/product-gs...olesalers.html
    Пока жаба душит расставаться с 150 баксами Поищу подешевле, поднакоплю денег, либо найду сил придушить жабу
    - применить вместо большой и избыточной по всем параметром Arduino Mega 2560 мелкую Arduino Nano. Контроллер заказан, жду доставки.
    - сделать управляющую программу для Andriod, т.к. имеется такая приставка к телеку и вот такая тема ambilight для телефона на andriod, и вот такое направление NetUp IPTV Android.
    - также хотелось бы иметь управляющую программу для приставок Dune HD, например для TV-101

    Проблемы:
    - непонятно почему мне пришлось изменить порядок чтения цветов. Исходный порядок закомментирован. Рабочий порядок представлен. Если кто-то объяснит почему так? я что-то не понимаю или в лайтпаке такая особенность или еще какая вариант буду очень благодарен. Решение проблемы тут
    - каким-то образом проскакивают помехи которые поджигают пиксели дальше определенного настроенного количества зон. Замечено при возникновении помех в электрической сети - переключение режимов холодильника (Холодильник относительно не древний. Двухкамерный Атлант ). По идее количество зон будет ограничено длиной самой ленты. Но вот вопрос/беспокойство - насколько эти помехи могут сказаться на работе девайса в целом?

    Уф, вот такой отчетик по проделанной работе. Очень надеюсь, что кому-то он облегчит жизнь.
    Замечания, предложения, пожелания, идеи, конструктивная критика приветствуются.
    Последний раз редактировалось MAKC; 12.03.2012 в 00:47. Причина: добавлена ссылка на картинки окончательного вида

  2. #2
    Пользователь
    Регистрация
    12.11.2011
    Возраст
    48
    Сообщений
    37
    Вес репутации
    176

    По умолчанию Re: Фоновая подсветка телевизора Ambilight

    Цитата Сообщение от MAKC Посмотреть сообщение
    Проблемы:
    - непонятно почему мне пришлось изменить порядок чтения цветов. Исходный порядок закомментирован. Рабочий порядок представлен. Если кто-то объяснит почему так? я что-то не понимаю или в лайтпаке такая особенность или еще какая вариант буду очень благодарен.
    на странице 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;
    }
    Эх и китайцы
    Последний раз редактировалось MAKC; 26.02.2012 в 17:31.

  3. #3
    Пользователь
    Регистрация
    12.11.2011
    Возраст
    48
    Сообщений
    37
    Вес репутации
    176

    По умолчанию Re: Фоновая подсветка телевизора Ambilight

    на уголки можно ставить вот такие коннекторы
    http://www.alibaba.com/product-gs/45...connector.html

  4. #4
    Пользователь
    Регистрация
    07.12.2010
    Сообщений
    34
    Вес репутации
    186

    По умолчанию Re: Фоновая подсветка телевизора Ambilight

    Доброго времени суток! Решил сделать подсветку на 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

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 5 (пользователей: 0 , гостей: 5)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •