DIY Ambilight
Народ задумал вот такую штуку!!! На просторах интернета на русском не нашёл!! идея заключается в том что использовать можно любой источник видео, а сам контур любого размера!!!
вот видео полной сборке но я в английском не силён! Я лишь понял для чего нужен каждый компонент!!! А вот каким образом ставить драйвера и софт для управления диодами так и не понял! Помогите разобраться!!! вот ссылка на первое видео!!!! А вот в результате что хочу получить!!! Экран на видео 130" и эмбилайт |
Целью ветки считаю перевод всего для простого пользователя!!! Ибо за месяц не нашёл ничего на русском в интернете!!!
|
|
|
Цитата:
|
И так для управляемого интелектуального ЭМБИЛАЙТ нужно следующее:
1. Arduino Uno 2. Raspberry Pi 3 model B 3. Светодиодная управляемая лента WS2812B ( число диодов на метр на выбор) 4. HDMI сплитер на 2 5. Плата видео захвата на чипе (UTV007 Chipset) 6. HDMI to AV конвертор 7. Micro SD карта ( 10 класс обязательно ) 8. 5V – 10A блок питания светодиодной ленты и всевозможные кабели для соединения (hdmi и тд.) Для ардуино использовать следующий СКЕТЧ ( Скорректировать, скопировать и загрузить в АРДУИНО) Корректировка заключается в изменении колличества диодов на всей длинне ленты, яркости и цвета самой ленты при старте! ВОТ САМ СКЕТЧ // LIBRARIES #include <Wire.h> //#include <LiquidCrystal_I2C.h> #include "Adafruit_NeoPixel.h" // DEFINITIONS #define STARTCOLOR 0x33cccc // LED color at startup 0xff8000 is orange in hex code. pick your own here: HTML Color Picker #define BLACK 0x000000 // LED color BLACK #define DATAPIN 10 // Datapin #define LEDCOUNT 300 // Number of LEDs used in your system #define SHOWDELAY 20 // Delay in micro seconds before showing #define BAUDRATE 500000 // Serial port speed #define BRIGHTNESS 100 // Max. brightness in % const char prefix[] = {0x41, 0x64, 0x61, 0x00, 0x12b, 0x17e}; // Prefix at the start of the transmission char buffer[sizeof(prefix)]; // Temporary buffer for receiving the prefix data // to calculate your prefix, the first 4 bytes will never change: const char prefix[] = {0x41, 0x64, 0x61, 0x00, this never changes. // the next byte is equal to the number of LED - 1 --> (232-1)=231. 231 transformed in HEX. 231 in hex is E7 (use google) // the last byte is equal to the XOR value of the calculated value just above and 0x55 (byte just calculated (E7) XORED with 0x55) = B2 use this link XOR Calculator Online and in input 1 put 55 and in input 2 put your HEX value. // some precalculated values to save some time: 178 leds gives B1 and E4, 180 B3E6, 181 B4E1, 182 B5E0 232 E7B2 230 E5B0 Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDCOUNT, DATAPIN, NEO_GRB + NEO_KHZ800); //LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display int state; // Define current state #define STATE_WAITING 1 // - Waiting for prefix #define STATE_DO_PREFIX 2 // - Processing prefix #define STATE_DO_DATA 3 // - Handling incoming LED colors int readSerial; // Read Serial data (1) int currentLED; // Needed for assigning the color to the right LED const int led_button = 11; // ON/OFF button input const int status_led = 8; // LED of button const int ch_2 = A0; // Inputs from HDMI switcher const int ch_3 = A1; const int ch_4 = A2; const int ch_5 = A3; int curr_source = 0; // Used to store which source is currently displayed boolean strip_status = true; // Used to chose if the LED strip is ON or OFF (depending on button choice) unsigned long timeout = 0; // Timeout used to turn LED strip off if no new data has come thorugh after some time void setup() { pinMode(led_button, INPUT); pinMode(ch_2, INPUT); pinMode(ch_3, INPUT); pinMode(ch_4, INPUT); pinMode(ch_5, INPUT); pinMode(status_led, OUTPUT); digitalWrite(led_button, HIGH); digitalWrite(status_led, HIGH); delay (15000); // 15 seconds delay at startup to avoid strange behaviours as the PI boots up etc strip.begin(); // Init LED strand, set all black, then all to startcolor strip.setBrightness( (255 / 100) * 25 ); setAllLEDs(BLACK, 0); setAllLEDs(STARTCOLOR, 10); // Will turn ON all LEDS with a 5ms delay between each turn ON creating a snake increasing pattern Serial.begin(BAUDRATE); // Init serial speed state = STATE_WAITING; // Initial state: Waiting for prefix //lcd.init(); // Initialize the lcd //lcd.backlight(); // Turn ON LCD backlight //lcd.print(" waiting for PI"); // Wait for PI to boot up for 5 sec (avoids the Arduino rebooting randomly) delay(5000); //lcd.clear(); //lcd.print("**** SOURCE ****"); strip.setBrightness( (255 / 100) * BRIGHTNESS ); // Set the brightness we chose above } void loop() { do_strip(); // Main part of the code where we look at the data incoming from the PI if (state == STATE_WAITING) // Only if we are in WAITING state we check the source inputs and our ON/OFF button. { check_source(); check_button(); } } void do_strip(void) { if (strip_status == true) { switch(state) { case STATE_WAITING: // *** Waiting for prefix *** if( Serial.available()>0 ) { readSerial = Serial.read(); // Read one character if ( readSerial == prefix[0] ) // if this character is 1st prefix char { state = STATE_DO_PREFIX; } // then set state to handle prefix } break; case STATE_DO_PREFIX: // *** Processing Prefix *** timeout = millis(); if( Serial.available() > sizeof(prefix) - 2 ) { Serial.readBytes(buffer, sizeof(prefix) - 1); for( int Counter = 0; Counter < sizeof(prefix) - 1; Counter++) { if( buffer[Counter] == prefix[Counter+1] ) { state = STATE_DO_DATA; // Received character is in prefix, continue currentLED = 0; // Set current LED to the first one } else { state = STATE_WAITING; // Crap, one of the received chars is NOT in the prefix break; // Exit, to go back to waiting for the prefix } // end if buffer } // end for Counter } // end if Serial break; case STATE_DO_DATA: // *** Process incoming color data *** if( Serial.available() > 2 ) // if we receive more than 2 chars { Serial.readBytes( buffer, 3 ); // Abuse buffer to temp store 3 charaters strip.setPixelColor( currentLED++, buffer[0], buffer[1], buffer[2]); // and assing to LEDs } if( currentLED > LEDCOUNT ) // Reached the last LED? Display it! { strip.show(); // Make colors visible delayMicroseconds(SHOWDELAY); // Wait a few micro seconds state = STATE_WAITING; // Reset to waiting ... currentLED = 0; // and go to LED one break; // and exit ... and do it all over again } break; } // switch(state) } // if statement else {setAllLEDs(BLACK, 0);} if(millis() > timeout + 5000) // If no new incoming data after 5seconds, turn the strip OFF. {setAllLEDs(BLACK, 0);} } // do_strip void check_source (void) { if(digitalRead(ch_2) == HIGH) { if(curr_source != 2) { //lcd.setCursor(0,1); curr_source = 2; //lcd.print(" PS_4 "); // Channel 2 of HDMI switcher LCD name } } else if(digitalRead(ch_3) == HIGH) { if(curr_source != 3) { //lcd.setCursor(0,1); curr_source = 3; //lcd.print(" NOT USED"); // Channel 3 of HDMI switcher LCD name } } else if(digitalRead(ch_4) == HIGH) { if(curr_source != 4) { //lcd.setCursor(0,1); curr_source = 4; //lcd.print(" CD/DVD "); // Channel 4 of HDMI switcher LCD name } } else if(digitalRead(ch_5) == HIGH) { if(curr_source != 5) { //lcd.setCursor(0,1); curr_source = 5; //lcd.print(" COMPUTER"); // Channel 5 of HDMI switcher LCD name } } else { if(curr_source != 1) { //lcd.setCursor(0,1); curr_source = 1; //lcd.print(" AV INPUT"); // Channel 1 of HDMI switcher LCD name } } } void check_button (void) // ON/OFF button routine { if(digitalRead(led_button) == LOW) { if(strip_status == true) { strip_status = false; digitalWrite(status_led, LOW); } else { strip_status = true; digitalWrite(status_led, HIGH); } delay(25); while(digitalRead(led_button) == LOW) {} } } // Sets the color of all LEDs in the strip // If 'wait'>0 then it will show a swipe from start to end void setAllLEDs(uint32_t color, int wait) { for ( int Counter=0; Counter < LEDCOUNT; Counter++ ) // For each LED { strip.setPixelColor( Counter, color ); // .. set the color if( wait > 0 ) // if a wait time was set then { strip.show(); // Show the LED color delay(wait); // and wait before we do the next LED } // if wait } // for Counter strip.show(); // Show all LEDs } // setAllLEDs |
Судя по списку такой эмбилайт выльется рубликов в 10к - не бюджетно надо сказать :(
Буду заглядывать в тему, следить за продвижениями :) |
Цитата:
|
В оранжевом блоке СКЕТЧА указаны константы и основные моменты работы ленты при её запуске ( включении)! Там указано что при старте она будет загораться цветом 33cccc ( похож на цвет морской волны) на 15 секунд до полного запуска Raspberry Pi 3
Так же будет использоваться дата пин 10 для управления с Ардуино, количество диодов ( именно в моей схеме ) 300 шт. А так же задержка и яркость!!! То есть яркостью можно управлять программно!!!! В моих планах дописать скетч так чтобы при старте светодиодная лента не просто загоралась а выполняла эффект когда из центра нижней части экрана диоды разбегались в верхнюю часть экрана и встречались по середине сверху!!! Ну и обратно!!! Аля динамический индикатор загрузки!))))) Так же хочу отметить что скетч написан исключительно под светодиодную ленту WS2812B из за своих особенностей!!! |
Сразу под оранжевым блоком СКЕТЧА расположен очень важный момент!!!! Его каждый должен настроить под себя!!!
const char prefix[] = {0x41, 0x64, 0x61, 0x00, 0x12b, 0x17e}; // Prefix at the start of the transmission char buffer[sizeof(prefix)]; // Temporary buffer for receiving the prefix data Изменить необходимо только 2 последних показателя ( выделен красным)!!! Первый надо перевести в HEX а второй в XOR !!! HEX можно вычислить в виндовом кальколяторе!!! Там есть для програмистов!)))) Надо взять общее количество диодов и отнять 1 ( в моём случае 300-1=299) и перевести в HEX получится 12В и в строке вписать {0x41, 0x64, 0x61, 0x00, 0x12b, 0x17e}; А XOR высчитывается иcходя из HEX!!! В скетче есть ссылка на калькулятор XOR!!! там нужно в первом окне ввести 55, во втором ваше значение HEX и нажать кнопку для расчёта XOR и в моём случае получается 17Е !!!! Дописать надо вот так {0x41, 0x64, 0x61, 0x00, 0x12b, 0x17e}; |
На видео показан эффект который я хочу сделать при старте!!!! Для понимания переведите просмотр на время 3 минуты ровно!!! Там эффект с изменением цвета и без!!! Я буду делать одноцветный!!!!
|
Блин...если это все взлетит то просто мега супер будет проект :)
И что бы работало без глюков...а то дилетантским взглядом железо выглядит очень разношерстно, а как правило в таких сборках (из разношерстного железа) глюки и вылазят...будем надеятся что все будет супер ! |
Цитата:
|
Можно сделать и просто с АРДУИНО но она глуповата и не потянет сам контент!!! Она годня в этом проекте только для светодиодной ленты!!!! Отличный микроконтроллер!!! По этому в схеме микрокомпьютер выполняет роль медиацентра который легко справляется с обработкой сигнала!
|
Я если честно не понял зачем на распбери вкорячивать коди...
Просто что бы заодно на ее мощах иметь медиаплеер? |
Цитата:
|
Понял, а заказывали детали на али?
|
Да на АЛИ!) Я пока заказал ардуино, конвертер HDMI - AV, и плату видео захвата!!! Распбери пай в самый последний момент закажу, так как для тестов можно обойтись и компом!) Принцип работы одинаковый!!!
|
Вложений: 1
Самое главное в этом деле это грамотный СКЕТЧ для АРДУИНО!!! Так как он и управляет всем процессом! Я планирую в скетч дописать код который даст мне определённый эффект при загрузки всего этого дела!)))) В сообщении #11 я написал где в видео его посмотреть!!!!
а так схема расположения светодиодной ленты у меня будет такова!!! |
Вложений: 1
Вот так выглядит рабочая схема!!! При желании можно уложить всё компоненты в какой нибудь корпус!!!! И до экрана пустить UTP кабель для подключения к светодиодной ленты!!!
|
Вот молодец! поддерживаю ,хорошую тему замутил! только я прошу тебя ,когда будешь все собирать , на камеру все запиши и выложи что бы вопросов не было ,я думаю это не сложно для тебя,за то благодорить будут все! И для чайников будет проще!
|
Да там вроде и так все понятно. Кроме одного: хватит ли блока питания на 50W для питания всей 5 метровой ленты...у чувака из видео на телек пару метров всего наклеено. Я посмотрел по спецификациям: светодиоды на ленте могут быть по 0,1w и по 0,2 w (в разных источниках разные цифры).
В первом случаем на ленте 5 метров надо 30w а во втором 60w. |
Цитата:
|
Цитата:
Я первый раз буду тестировать на компе! без распбери пай!!!! Это для многих упростит задачу!!! Но в моих целях сделать автономное устройство! |
Я все заказал с Али (блоков питания взял 2шт, так как ленты у меня будет даже чуть больше чем 5 метров).
Пришло все, вроме Ардуины (но она есть у нас в магазине не дорого) и "1x2 1 in 2 Out Port HDMI Splitter Amplifier Repeater 3D 1080p Switch Box Hub" (он 9 января прилетел в Москву, и с тех пор тишина). На выходных попробую собрать все вместе и проверить раздает ли мой ресивер видеосигнал сразу на два выхода - тогда без сплиттера смогу обойтись. |
Круто!!!! У меня есть сомнения по поводу 2 блоков питания!!! По идее у меня будет 6 метров светодиодной ленты!!! Всего 180 светодиодов ( 30 диодов на метр IP65)!!! По хорошему надо поделить пополам и вторую половину запитать от другого источника!!! Сомнения в том что АРДУИНО тоже использует минус от блока питания!!! Так что могут возникнуть проблемы!!! Но надо пробовать!!! Я для начала попробую с одним блоком, чтобы не нарушать целостность системы!!!
|
Цитата:
|
Цитата:
Ну, блок питания могу и в городе у нас купить. А вот HDMI Splitter сегодня наконец-то пришел, и с ним пока проблемы: BD-плеер работает без проблем в 1080p 60Hz, меню ресивера тоже показывает. А вот сонька PS4 не хочет работать :( Проектор пишет что сигнал не поддерживается, и все тут. HDCP отключил у приставки в настройках - не помогло. До выходных много времени на это дело не смогу потратить, так что не знаю в сплиттере проблема или в соньке. P.S.: Я говорю именно про сплиттер, который разбивает один сигнал на два источника одновременно, а не про свитчер - последний и не нужен, если есть ресивер/усилитель. |
Цитата:
|
Цитата:
|
Вложений: 2
Цитата:
|
Цитата:
DECIDE, да, ресивер работает вместо свитча сейчас. Надо проверить его композитные выходы - может, на них сигнал тоже подается одновременно с HDMI :) Проектор работает с сонькой через ресивер без проблем, в полном 1080p. Сплиттер без питания и не работает, так что не в этом причина :( P.S.: Что то на фото я вижу только один HDMI выход ;) |
Цитата:
Да на фото выход один, как обычно. И да такой ресивер конечно заменяет свитчер (много входов и один выход) Но не сплитер (много входов и больше одного выходов). |
Ну я думаю это проблема в сплитере!!! Оде тупо дублировать сигнал должен и все!!! Так что. Может стоит попробовать другой? Может 4К сплитер взять??? Одним словом проверяй!!! А по поводу питание очень странно! У. Пня свитч есть и в комплекте к нему шел блок питания!!! Как то я забыл его включить и был удивлен что он работал без блока!))) так что и. Ак бывает!!!
|
У ресивера должен быть композитный видеовыход для подключения записывающих устройств. Он должен работать параллельно с HDMI. С этим выходом не нужен ни сплиттер, ни HDMI в аналог. Сразу сигнал на оцифровку и будет счастье.
|
Если сразу вывод с ресивера и на hdmi и на композитный выход видео идет то да-супер, можно сэкономить и не покупать сплитер свичер и hdmi-av переходник
|
Вложений: 1
У пионерки 525 такой выход есть. Он есть почти на всех современных ресиверах. Вернее обратного я пока не встречал, хотя формат аналового видео считается уже устаревшим и со временем производители могут убрать лишний разъем. А нам кроме денежной экономии ещё и удобство. Чего-чего, а кабель-салаты я всегда стараюсь избежать.
|
Цитата:
|
Цитата:
|
Мне кажется в ресивере этот выход должен называться MONITOR OUT!!! Но пока не проверял!!!!
|
Часовой пояс GMT +4, время: 09:47. |
Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.