Авторизация
Регистрация

Напомнить пароль

Клон Ambilight на связке Raspberry Pi3, Arduino и ленте WS2812B

К написанию данного опуса меня сподвигло не сколько желание похвастаться красивостью, сколько описать новый гайд для желающих повторить данную конструкцию без «фигурных танцев по граблям».

Проблемма заключается в том, что все существующие гайды и мануалы датируются в лучшем случае 2014-м годом и, в связи с шагнувшими вперед технологиями и переделанными интерфейсами основных програмных продуктов, неприменимы. Пытаемся, к примеру настроить Kodi (libreelec, OpenElec). Вбиваем в Putty sudo ap-get..., а оболочка отбивает ответ в формате «не, ну вы ж тут под рутом уже и так зашли, такшо давайте без этих формальностей. Фыркаешь, забиваешь уже напрямую apt-get install. И шо? Говорят „не, ну то вы под дебианом/убунтой так можете, а тут у нас своя атмосфера“. Пытаешься достать шо-либо с репозитория через wget — N wget — ругается, говорит „параметра такого не знаю“. Повторяешь команду с длиннющей ссылкой на github — а ответ 404. Переместили, или вообще проект накрылся. Не, ну не свинство?
Итак:
вводные задачи:
Делаем Медиаприставку/медиасервер на Raspberry Pi3 под управлением системы (оболочки, операционки) на базе Kodi ( я использовалOpenElec 8.0.4, а самые свежие гайды — говорили, шо работают с версией 4.0 и конфликтуют с 5.0). Захват экрана выполняет демон (програмная надстройка) Hyperion (с Boblight не сложилось вообще) и отдается управление на ленту WS2812B.

За основу был взят мануал от Christian Moser, опубликованный на techtalk под названием »How to build your own Ambilight TV with Raspberry Pi and XBMC" и датируемыйFebruary 20, 2014 (почти 5 лет назад, шо в условиях современных реалий — ОЧЕНЬ много).

Продолжаем.
Список необходимостей недурственно описан в гайде вверху, только с небольшими изменениями. Блок питания на 5-7ампер только для ленты в принципе неплохо иметь, но чересчур. Для ленты, которую я применил ( Ссылка на Али Куплена за кровные свои, 5метровый рулон без защиты ) с плотностью 60 модулей/метр (при 30 на метр — неравномерная засветка, а 144/метр меня бы разорила и по БП и по деньгам) — потребление тока при 5,15В питающего и 172 штуках светодиодов в итоге на старый Samsung LE37A656 составило чуть более 2А при полной яркости белого свечения


Камера в телефоне слегка краснит



Собственно потребление 172 штук модулей на максимальной яркости в режиме белого света


при красном свечении только по бокам


Потребление 0,6А

Сборка/приклейка/пайка — осталась за кадром.
Фотки готового решения с неудобных ракурсов:







Провода лучше применять в силиконовой изоляции (их можно купить в авиа/коптерном модельном магазине) — они мягкие как по изоляции, так и по жилам. Мной использованы провода 28-го калибра. По углам провода дополнительно застраховал кусочками каптонового скотча.

За скобками данного опуса оставлю страдания с неработающими устаревшими решениями. Методы с переназначением 12-го пина (GPIO18) с режима SPI в режим PWM с отключением аудиовыхода — не работает по причине изменений в оболочках.
Предполагается, что человек, который будет это повторять — априори не пугается Ардуино и паяльника. Также предполагается, что Raspberry уже сконфигурирована в качестве медиаплеера и подключена по HDMI к телевизору.
Перехожу к собственно методу решения загвоздок с адаптивной подсветкой.

Берем Ардуино Нано. У меня вот такая Куплена тоже за свои для другого проекта, но пришлось пересаддить сюда. (мануалы говорят, что лучше Мега/Уно, но практика показала, что 172 модуля для Нано по зубам). Ардуино Про не пойдет — нам нужен USB вход для связи между Hyperion и Arduino, которая, в свою очередь, управляет лентой из WS2812.

Скетч, который заливаем в Ардуину имеет вид:

#include "FastLED.h"
 
// How many leds in your strip?
#define NUM_LEDS 172
 
// For led chips like Neopixels, which have a data line, ground, and power, you just
// need to define DATA_PIN.  For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
#define DATA_PIN 2
//#define CLOCK_PIN 13
 
#define COLOR_ORDER BRG
 
// Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data
uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i;
 
// Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
#define serialRate 500000
 
// Define the array of leds
CRGB leds[NUM_LEDS];
 
void setup() {
      // Uncomment/edit one of the following lines for your leds arrangement.
      // FastLED.addLeds<TM1803, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<TM1804, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<TM1809, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
         FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
      // FastLED.addLeds<UCS1903, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<UCS1903B, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<GW6205, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<GW6205_400, DATA_PIN, RGB>(leds, NUM_LEDS);
     
      // FastLED.addLeds<WS2801, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<SM16716, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<LPD8806, RGB>(leds, NUM_LEDS);
 
      // FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<SM16716, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
     
        // initial RGB flash
        LEDS.showColor(CRGB(255, 0, 0));
        delay(500);
        LEDS.showColor(CRGB(0, 255, 0));
        delay(500);
        LEDS.showColor(CRGB(0, 0, 255));
        delay(500);
        LEDS.showColor(CRGB(0, 0, 0));
       
        Serial.begin(serialRate);
        Serial.print("Ada\n"); // Send "Magic Word" string to host
 
}
 
void loop() {
  // wait for first byte of Magic Word
  for(i = 0; i < sizeof prefix; ++i) {
    waitLoop: while (!Serial.available()) ;;
    // Check next byte in Magic Word
    if(prefix[i] == Serial.read()) continue;
    // otherwise, start over
    i = 0;
    goto waitLoop;
  }
 
  // Hi, Lo, Checksum
 
  while (!Serial.available()) ;;
  hi=Serial.read();
  while (!Serial.available()) ;;
  lo=Serial.read();
  while (!Serial.available()) ;;
  chk=Serial.read();
 
  // if checksum does not match go back to wait
  if (chk != (hi ^ lo ^ 0x55))
  {
    i=0;
    goto waitLoop;
  }
 
  memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
  // read the transmission data and set LED values
  for (uint8_t i = 0; i < NUM_LEDS; i++) {
    byte r, g, b;    
    while(!Serial.available());
    r = Serial.read();
    while(!Serial.available());
    g = Serial.read();
    while(!Serial.available());
    b = Serial.read();
    leds[i].r = r;
    leds[i].g = g;
    leds[i].b = b;
  }
  // shows new values
 FastLED.show();
}


Для корректной работы необходимо иметь установленную библиотеку FastLED.
В строке #define NUM_LEDS — указываем итоговое количество светодиодов в проекте
Строка #define DATA_PIN — указывает к какому цифровому выходу платы будет подключен первый модуль.
#define serialRate 500000 — важный момент колдунства. Очень важный. Случайно обнаружен на немецком форуме. Только после обьявления данной скорости все завертелось!
В секции
void setup() {
// Uncomment/edit one of the following lines for your leds arrangement.
// FastLED.addLeds<TM1803, DATA_PIN, RGB>(leds, NUM_LEDS);
снимаем комментарий (два прямых слэша) с строки, соответствующей применяемым модулям.
Компилируем, заливаем. При запуске ардуинки или после перезагрузки — вся лента приветственно переливается цветами. Запоминаем порядок следования цветов ( Видео запуска —


после перебора цветов Ардуиной идет запуск Гипериона и его приветственная радуга). Мы на половине пути к счастью!
Подключаем Ардуинку подходящим кабелем к свободному порту Малины.
Включаем все компоненты
Далее скачиваем на компьютер HyperCon.jar и запускаем его.



На экране появится окно конфигурации нашей адаптивной подсветки. Наступает второй этап сильного колдунства.

Итак:
Строка Configuration name — указываем приятное нам имя, на работоспособность не влияет никак.
Строка Type — в выпадающем меню выбираем Adalight. Данная строка указывает, что наша конструкция управляется внешним устройством с библиотекой Adafruit, которую мы залили в Ардуинку.
Строка Output (этап очень мощного колдунства) — выбираем /dev/ttyUSB0 Конкретно ваш случай может отдичаться от данного перимера — поэтому подсмотрите через консоль Putty командами lsusb и ls /dev где у вас присутствует Ардуина. Некоторые (как у меня — дают ответ типа «СН430...» — имя контроллера порта)
Строка Baudrate — вбиваем 500 000 (чтобы Гиперион и Ардуина общались на одной скорости). Скорости, отличные от 500 000 — НЕ РАБОТАЮТ!..
Строка RGB byte order — GRB (порядок адресации цветов в модулях 2812В и подсмотренные при запуске скетча на ардуине)

Дальнейшие действия — обьявление количества светодиодов и их конфигурация на плоскости, нулевой (начальный) светодиод, глубина захвата, создание файла конфигурации, установка Hyperion через SSH и отправка конфигурационного .json-файла не отличаются от всех известных мне гайдов в Сети.

После перезапуска Гипериона (команды в вкладке SSH — сначала Stop потом Start) — лента должна ожить сначала скетчем ( сначала перебор 3х основных цветов, потом инициализируется Hyperion и выдает вращающуюся радугу).

Вуаля!

Коротенькое видео работы данного решения:

Планирую купить +48 Добавить в избранное
+67 +117
свернутьразвернуть
Комментарии (99)
RSS
+
avatar
+12
  • faza20
  • 02 февраля 2019, 22:37
красиво, конечно!
Только зачем оно на телеке?
+
avatar
+14
Для визуального увеличения экрана это раз, для смягчения области перехода от темного к светлому, что бережет зрение это два.
+
avatar
+11
При резкой смене кадра работа не понравилась.
Про природу надо, что-то покрутить.
+
avatar
+8
ну на филипсе это намного мягче работает и хорошо настраивается, у автора действительно как-то не так.
+
avatar
+2
  • katran
  • 03 февраля 2019, 03:07
притом там куда меньше светодиодов
+
avatar
+4
  • nochkin
  • 03 февраля 2019, 04:53
Кстати, более тонкая рамка на телевизоре тут очень помогает.
+
avatar
+3
у меня на филипсе 10го года рамка чуть-чуть меньше чем у автора(только диагональ побольше), глаза не режет, всё равно смотришь на картинку, а не на подсветку, она для бокового зрения.
+
avatar
-1
  • sir0ta
  • 03 февраля 2019, 07:50
она для бокового зрения
И кроме маркетинга смысловой нагрузки несет.
+
avatar
+1
а вы пробовали?
я вот как бы уже 8лет смотрю и разницу-то нагрузки для глаз в живую ощущаю.

да массовые и самопальные клоны явно не на пустом маркетинге выросли.
+
avatar
+1
  • sir0ta
  • 03 февраля 2019, 15:44
Сколько помню, смотрю без и разницу-то нагрузки для глаз в живую не ощущаю
+
avatar
+1
они по-моему не просто крайние пиксели повторяют подсветкой, а квадранты изображения усредняют и не гасят подсветку, в отличие от сабжа, если край черный

но глазами сабж, скорее всего, нормально выглядит, такие резкие границы освещенности это из за камеры, глазом ровнее должно быть
+
avatar
+4
Сделал себе тоже аналогичную штуку на ардуине, как то в итоге не зашло. у филипса эта технология работает более мягко, к тому же филипс как то всю картинку в целом анализирует и светит по всем сторонам, а ардуина захватывает края, в итоге на темных областях диоды отключаются, а с другой стороны наоборот что-то очень яркое и пол стены освещает. К тому же переключение между кадрами эти отключенные диоды включает на полную и получается подсветка мигает то в одной части экрана то в другой. Если картинка постоянно вся заполнена каким-то ярким цветом то работает хорошо, но для просмотра фильмов не особо подходит.
+
avatar
0
  • dymbo
  • 12 февраля 2019, 00:08
Во-во! Там надо перехватывать видеопоток HDMI, по-честному его распаковывать, пропускать через пару фильтров и мапить это всё на краевые диоды. Сделать можно, но железяка должна быть несколько другого уровня. И лучше таке делать на cpld-шке, наподобие как в осликах FFT и другие realtime math делают.
+
avatar
+13
  • xxx_xxx
  • 02 февраля 2019, 22:43
спасибо
хотел было новый телик с Ambilight… обязательно с Ambilight
теперь уже сильно сомневаюсь
если оно работает на этот финальный генератор эпилепсии похоже — нафиг лесом :)
+
avatar
0
Мой самодельный скопировал lightpack

www.youtube.com/watch?v=iovD1PiCryA
+
avatar
+2
  • katran
  • 03 февраля 2019, 03:08
заводской работе плавнее и не только с ПК
+
avatar
0
эпилептикам точно не стоит это смотреть, вот пример моего на начале The Big Bang Theory, работает без компа, но через ТВ-бокс.
+
avatar
+2
  • djvan
  • 02 февраля 2019, 22:44
А есть готовое решение если к телеку подключён комп на винде 10? Вводная — есть телек 49 дюймов, к нему подключён комп на винде, хочется чтобы он был как амбилайт…
+
avatar
+7
Arduino + AmbiBox
Старые решения вполне работают и на 10ке
+
avatar
+3
  • ober
  • 02 февраля 2019, 23:00
+
avatar
0
  • davnozdu
  • 03 февраля 2019, 10:49
Как раз месяц назад делал подсветку по этому проекту
Вот результат youtu.be/S3kFE0pSh_Q
Тв бокс под управлением alexelec так как там boblight работает из коробки
+
avatar
+1
  • iPOWER
  • 03 февраля 2019, 07:32
Есть готовые решения и Пк не требуется. я использовал DreamScreen для 50" 1080р ТВ. подключаешь к этой коробочки HDMI сигнал с источника и смотришь. В целом нормально. эффект Вау есть. но видны большие рамки ТВ были и это немного не нравилось. В фильмах тоже не от каждого был эффект Вау от подсветки. Например в Звездных войнах когда красным мечем махали по экране то и подсветка тоже красным горела там где надо. или допустим солнце показывают во весь кадр и комната желтым освещается от ТВ)
Но сменил ТВ на 4К HDR и уже DreamScreen не подойдет т.к. hdmi 1.4 тока и 4К HDR он не передает.
+
avatar
0
  • SterX
  • 03 февраля 2019, 08:39
есть комплект для апгрейда до 4К
+
avatar
0
  • iPOWER
  • 03 февраля 2019, 13:19
ага глянул. дороговато. 200$. Но я наигрался с этим. уже не интересно) да и в нынешних реалиях мне больше нравится 4K HDR в фильмах, и подсветки не надо по краям экрана. да и теперь у меня по бокам и снизу ТВ стоят колонки и их будет видно, а так в темноте их не видно.
+
avatar
0
если не секрет где брали и почем вышло?
+
avatar
0
  • iPOWER
  • 03 февраля 2019, 13:12
покупал на ебей. для 50" ТВ обошелся в 11к рублей.но это года 2 назад было. это версия DreamScreen под 1080р ТВ. если диагональ меньше то цена чуть меньше была.
+
avatar
0
  • slon1977
  • 02 февраля 2019, 22:46
Это для «через HDMI» или другое?
+
avatar
0
  • am637
  • 03 февраля 2019, 03:58
Приложение сканирует края выводящегося на экран изображения, выход может быть любым (зависит от ПК).
+
avatar
+11
У меня WS2812B начали подыхать где-то через пол года. Сначала отдельные светодиоды неправильно показывали цвета, у них умирал канал определённого цвета, затем вообще лента переставала работать дальше сбойных диодов. Если надавить на сбойные, то начинало работать, но не на долго. Отодрал их от монитора и заказал SK9822, они уже полтора года где-то трудятся без единого битого пикселя. Стоят дороже, но на глаз цвета лучше, работают шустрее (фпс больше), говорят ещё ШИМ не виден на низкой яркости, но я и на 2818 не замечал.
+
avatar
+4
  • Loatan
  • 03 февраля 2019, 00:01
Тоже такая же проблема с ws2812b, заказывал у разных продавцов разными партиями. В одной ленте почти сразу подыхать светодиоды стали, во второй спустя полгода. Питание стабилизированное, стоят резисторы на линии данных, перегрева нет. Поглядел парочку битых светодиодов в микроскоп, у всех отвалился контакт от кристаллика, толи сам кристалл греется и вызывает отпайку, толи такой контакт ненадёжный.
+
avatar
+3
  • 10ghz
  • 03 февраля 2019, 11:45
И у меня тоже через пол года стали сдыхать зимой, думал из-за статики, ставил подтягивающие к земле резисторы, электролиты. Не помогло.
Расскажите пожалуйста про sk9822, схему подключения и ПО.
+
avatar
+2
Я использую с ПК, управляет Arduino nano, софт Ambibox. Питание взял из системника, подключив их к молексу. Земля у всего этого общая, CI (Clock) — 5й пин ардуины, DI (Data) — 7-й пин. Скетч, на сколько я помню, пришлось писать самому на базе скетча для WS2812, но там буквально пару строк поменять. Библиотека fastled вот такая у меня FastLED-3.1.8, думаю и на других будет работать. Никаких резисторов, конденсаторов, фильтров и прочего не использовал.
Скетч предположительно этот, сложно сказать точно, давно дело было.
Adalight_SK9822
//////////
//
// Arduino interface for the use of ws2812 operated LEDs
// Uses Adalight protocol and is compatible with Boblight, Prismatik etc
// «Magic Word» for synchronisation is 'Ada' followed by LED High, Low and Checksum
//
#include <FastLED.h>

///// User definitions /////

// Define the number of LEDs
#define NUM_LEDS 107

// Define SPI Pin
#define DATA_PIN 7
#define CLOCK_PIN 5

// Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
#define serialRate 115200

// Adalight sends a «Magic Word» (defined in /etc/boblight.conf) before sending the pixel data
uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i;

// initialise LED-array
CRGB leds[NUM_LEDS];

void setup()
{

FastLED.addLeds<SK9822, DATA_PIN, CLOCK_PIN, BGR>(leds, NUM_LEDS);

// initial RGB flash
LEDS.showColor(CRGB(255, 0, 0));
delay(500);
LEDS.showColor(CRGB(0, 255, 0));
delay(500);
LEDS.showColor(CRGB(0, 0, 255));
delay(500);
LEDS.showColor(CRGB(0, 0, 0));

Serial.begin(serialRate);
Serial.print(«Ada\n»); // Send «Magic Word» string to host

}

void loop() {
// wait for first byte of Magic Word
for(i = 0; i < sizeof prefix; ++i) {
waitLoop: while (!Serial.available()) ;;
// Check next byte in Magic Word
if(prefix[i] == Serial.read()) continue;
// otherwise, start over
i = 0;
goto waitLoop;
}

// Hi, Lo, Checksum

while (!Serial.available()) ;;
hi=Serial.read();
while (!Serial.available()) ;;
lo=Serial.read();
while (!Serial.available()) ;;
chk=Serial.read();

// if checksum does not match go back to wait
if (chk != (hi ^ lo ^ 0x55))
{
i=0;
goto waitLoop;
}

memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
// read the transmission data and set LED values
for (uint8_t i = 0; i < NUM_LEDS; i++) {
byte r, g, b;
while(!Serial.available());
r = Serial.read();
while(!Serial.available());
g = Serial.read();
while(!Serial.available());
b = Serial.read();
leds[i].r = r;
leds[i].g = g;
leds[i].b = b;
}
// shows new values
FastLED.show();
}

Настройки в Ambibox на свой вкус и цвет стены:)
У меня так, но склонным к эпилепсии и фанатам оригинального тормозного амбилайта не рекомендую.
+
avatar
+1
  • 10ghz
  • 03 февраля 2019, 14:43
Спасибо! У меня работало все по такому же принципу, только на 2812. Попробую заказать на али sk9822 надеюсь проработает дольше.
+
avatar
0
  • 10ghz
  • 16 сентября 2019, 21:17
К сожалению ваш скетч не подошёл.
Если кому понадобится скетч для sk9822 (apa102) для ambibox тут
Дополнительная информация

// Slightly modified Adalight protocol implementation that uses FastLED
// library (http://fastled.io) for driving WS2811/WS2812 led stripe
// Was tested only with Prismatik software from Lightpack project

#include "FastLED.h"

#define NUM_LEDS 300 // Max LED count
#define LED_PIN 11 // arduino output pin
#define GROUND_PIN 10
#define BRIGHTNESS 255 // maximum brightness
#define SPEED 115200 // virtual serial port speed, must be the same in boblight_config

CRGB leds[NUM_LEDS];
uint8_t * ledsRaw = (uint8_t *)leds;

// A 'magic word' (along with LED count & checksum) precedes each block
// of LED data; this assists the microcontroller in syncing up with the
// host-side software and properly issuing the latch (host I/O is
// likely buffered, making usleep() unreliable for latch). You may see
// an initial glitchy frame or two until the two come into alignment.
// The magic word can be whatever sequence you like, but each character
// should be unique, and frequent pixel values like 0 and 255 are
// avoided -- fewer false positives. The host software will need to
// generate a compatible header: immediately following the magic word
// are three bytes: a 16-bit count of the number of LEDs (high byte
// first) followed by a simple checksum value (high byte XOR low byte
// XOR 0x55). LED data follows, 3 bytes per LED, in order R, G, B,
// where 0 = off and 255 = max brightness.

static const uint8_t magic[] = {
'A','d','a'};
#define MAGICSIZE sizeof(magic)
#define HEADERSIZE (MAGICSIZE + 3)

#define MODE_HEADER 0
#define MODE_DATA 2

// If no serial data is received for a while, the LEDs are shut off
// automatically. This avoids the annoying "stuck pixel" look when
// quitting LED display programs on the host computer.
static const unsigned long serialTimeout = 150000; // 150 seconds

void setup()
{
pinMode(GROUND_PIN, OUTPUT);
digitalWrite(GROUND_PIN, LOW);
FastLED.addLeds<SK9822, LED_PIN, 13, RBG>(leds, NUM_LEDS);

// Dirty trick: the circular buffer for serial data is 256 bytes,
// and the "in" and "out" indices are unsigned 8-bit types -- this
// much simplifies the cases where in/out need to "wrap around" the
// beginning/end of the buffer. Otherwise there'd be a ton of bit-
// masking and/or conditional code every time one of these indices
// needs to change, slowing things down tremendously.
uint8_t
buffer[256],
indexIn = 0,
indexOut = 0,
mode = MODE_HEADER,
hi, lo, chk, i, spiFlag;
int16_t
bytesBuffered = 0,
hold = 0,
c;
int32_t
bytesRemaining;
unsigned long
startTime,
lastByteTime,
lastAckTime,
t;
int32_t outPos = 0;

Serial.begin(SPEED); // Teensy/32u4 disregards baud rate; is OK!

Serial.print("Ada\n"); // Send ACK string to host

startTime = micros();
lastByteTime = lastAckTime = millis();

// loop() is avoided as even that small bit of function overhead
// has a measurable impact on this code's overall throughput.

for(;;) {

// Implementation is a simple finite-state machine.
// Regardless of mode, check for serial input each time:
t = millis();
if((bytesBuffered < 256) && ((c = Serial.read()) >= 0)) {
buffer[indexIn++] = c;
bytesBuffered++;
lastByteTime = lastAckTime = t; // Reset timeout counters
}
else {
// No data received. If this persists, send an ACK packet
// to host once every second to alert it to our presence.
if((t - lastAckTime) > 1000) {
Serial.print("Ada\n"); // Send ACK string to host
lastAckTime = t; // Reset counter
}
// If no data received for an extended time, turn off all LEDs.
if((t - lastByteTime) > serialTimeout) {
memset(leds, 0, NUM_LEDS * sizeof(struct CRGB)); //filling Led array by zeroes
FastLED.show();
lastByteTime = t; // Reset counter
}
}

switch(mode) {

case MODE_HEADER:

// In header-seeking mode. Is there enough data to check?
if(bytesBuffered >= HEADERSIZE) {
// Indeed. Check for a 'magic word' match.
for(i=0; (i<MAGICSIZE) && (buffer[indexOut++] == magic[i++]););
if(i == MAGICSIZE) {
// Magic word matches. Now how about the checksum?
hi = buffer[indexOut++];
lo = buffer[indexOut++];
chk = buffer[indexOut++];
if(chk == (hi ^ lo ^ 0x55)) {
// Checksum looks valid. Get 16-bit LED count, add 1
// (# LEDs is always > 0) and multiply by 3 for R,G,B.
bytesRemaining = 3L * (256L * (long)hi + (long)lo + 1L);
bytesBuffered -= 3;
outPos = 0;
memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
mode = MODE_DATA; // Proceed to latch wait mode
}
else {
// Checksum didn't match; search resumes after magic word.
indexOut -= 3; // Rewind
}
} // else no header match. Resume at first mismatched byte.
bytesBuffered -= i;
}
break;

case MODE_DATA:

if(bytesRemaining > 0) {
if(bytesBuffered > 0) {
if (outPos < sizeof(leds))
ledsRaw[outPos++] = buffer[indexOut++]; // Issue next byte
bytesBuffered--;
bytesRemaining--;
}
// If serial buffer is threatening to underrun, start
// introducing progressively longer pauses to allow more
// data to arrive (up to a point).
}
else {
// End of data -- issue latch:
startTime = micros();
mode = MODE_HEADER; // Begin next header search
FastLED.show();
}
} // end switch
} // end for(;;)
}

void loop()
{
// Not used. See note in setup() function.
}

+
avatar
0
  • almurin
  • 02 февраля 2019, 22:56
как мульттик называется из последнего ролика в конце страницы?
+
avatar
+1
Астерикс и Земля Богов
+
avatar
0
  • almurin
  • 03 февраля 2019, 16:12
пасиба!
+
avatar
+10
Дальнейшие действия — [...] создание файла конфигурации, установка Hyperion через SSH и отправка конфигурационного .json-файла не отличаются от всех известных мне гайдов в Сети.
Так а что вы описали-то? Как скетч в ардуину залить? Вроде тоже от остальных гайдов не отличается ничем. Вы бы подробнее остановились как раз на настройке актуальных версий Коди и гипериона. Работает ли захват при использовании аппаратного ускорения различных видео форматов и пр. интересных деталях. Какие версии ПО использовали, под 18й коди нормально завелось? Обзор закончился на самом интересном месте.
+
avatar
+9
  • vvz_vlad
  • 02 февраля 2019, 23:25
Да что вы автору такие страшные вопросы-то задаете? Он вот магическую скорость на немецком форуме нашел, и радостно об этом докладывает, не потрудившись понять, а почему она, почему не работает на других, и так далее.
+
avatar
+1
Там малость посложнее решение. Но вцелом — да. Именно эта магическая цифирка стоила километров нервов.
+
avatar
0
Ты не правильную цифру нашел. На самом деле там должно быть 516894 и в приложении и в ардуинке. Просто кто то округлил, а другие люди по незнанию копируют.
+
avatar
+3
Ну вот у меня сборка на 17м KODI — на ней завелось, сборку на 18-й может сегодня-завтра опробую, но в другой конфигурации.
Аппаратное ускорение — работает, без проблем. Гасить специфические функции — не пришлось (тем более, что структура команд и расположение конфигурационных файлов поменялись и их выколупывать и гасить — нетривиальный ребус)

Описал — компиляцию/выжимку правильного применения мелочей, найденных с разных форумов/мануалов.

Ну и просьба сильно не пинать — первый обзор на данном ресурсе.
+
avatar
+1
Дайте знать что получится с 18й версией. Как-то давно когда переходил, захват отвалился. Они там что-то прилично поменяли, с тех пор не разбирался.
На амложиковых ТВ-боксах с аппаратным ускорением захват не работает.
Штука прикольная, уж слишком много «но» и «если».
+
avatar
0
допилили буквально на днях, в CoreELEC
+
avatar
0
Коди работает с аппаратным декодированием? Какие разрешения тянет?
+
avatar
+2
Коди с аппаратным работает. .mkv с разрешением 1080p (больше мой старичок не тянет) и звуком AC3 — тянет и больше 48 градусов проц с пассивным охлаждением не греется
+
avatar
0
  • kven
  • 02 февраля 2019, 23:15
а без ардуины нельзя обойтись? сама распберри не может поток на ленту гнать? вроде бы попадались гайды как сделать.
+
avatar
0
  • vvz_vlad
  • 02 февраля 2019, 23:29
Да там в конфигурации что-то типа такого надо написать, и все:
"device": 
{ 
"name": "MyHyperionConfig", 
"type": "ws2812spi", 
"output": "/dev/spidev0.0", 
 "rate": 1000000, 
"colorOrder": "grb" 
} , 


Но тут же крупноузловая сборка, и все такое.
+
avatar
-1
Ага. От я хочу посмотреть, как устройство с управлением при помощи PWM поднимется с управлением через SPI.
+
avatar
+6
  • vvz_vlad
  • 03 февраля 2019, 00:24
Как бы вам сказать, чтобы не обидеть… В общем, там не PWM. Да и SPI тут немного не как SPI используется. Но вы того, продолжайте по гайдам.
+
avatar
-3
Ну кагбе да, шо не ШИМ. Но сама суть управления последовательностью модулей по 1му проводу и 2-м имеют существенные отличия в реализации, чуть поболе, нежели в .json пару строк поправить (а с учетом, шо свежая версия Гипериона еще и файл в уматовом формате сохраняет...)
+
avatar
0
  • vvz_vlad
  • 04 февраля 2019, 02:55
Вот вы не погуглили после моего комментария, а зря. Нет там никаких двух проводов, управление всегда по одному проводу. Просто от SPI там используется линия данных MOSI без CS, MISO и тактового сигнала.
+
avatar
0
  • and7ey
  • 03 февраля 2019, 22:55
А вы такое делали? Напишите мануал, пожалуйста.
+
avatar
+1
Может и можно, но те гайды — как раз я безрезультатно и попробовал. Поменялась структура управляющей оболочки на базе КОДИ — и приплыли.
+
avatar
-1
  • tupoi13
  • 02 февраля 2019, 23:20
Правильнее будет добавить потраченные деньги и время и купить телевизор с большей диагональю.
+
avatar
0
Камера в телефоне слегка краснит
Вот Вам решение проблемы с «красными фото»:



Просмотровщик XnView, к тому же ещё и бесплатный. На скрине указан необходимый фильтр.
+
avatar
0
  • dozik
  • 02 февраля 2019, 23:34
Прошу прощения что немного не в тему, но может кто знает как подключить ленту ws2811 с 3 контактами к контроллеру с 4 контактами?что то методом тыка не хочется,
+
avatar
+1
  • ober
  • 03 февраля 2019, 00:06
А это точно контроллер для адресных лент?
+
avatar
+1
  • mooni73
  • 03 февраля 2019, 00:39
Имеет смысл поискать на али эту же коробочку у других продавцов — у некоторых есть подробные схемы. Ну или разбирать.
+
avatar
0
Измерьте напряжение, может она под два питания, на 12 и 5 вольт.
+
avatar
0
  • Rzzz
  • 04 февраля 2019, 11:03
Этот контроллер скорее всего для старых лент на ws2801. Там не SPI, а дата-клок по раздельным линиям, типа I²C, как я понимаю.
+
avatar
0
  • dozik
  • 04 февраля 2019, 11:11
Вот что в описании на контроллер написано:
Выход: два сигнала группы SPI
+
avatar
+8
Была раньше такая цветная плёнка для экрана ЧБ телевизора. Для «придачи цветности изображению».
Вот, напомнило :)

+
avatar
-6
  • bigvlad
  • 02 февраля 2019, 23:56
+
avatar
+6
  • mooni73
  • 03 февраля 2019, 00:46
Вообщем то на видео видно, что система работает плохо, слишком резкие переходы между сценами. Надо как то сглаживать перепады цвета и света.
+
avatar
+2
  • -wall-
  • 03 февраля 2019, 10:38
А сцены на самом экране не слишком ли быстро для вас меняются? :)
Имхо, вполне релевантно изображению на экране, что и нужно.
+
avatar
+1
  • c00ler90
  • 03 февраля 2019, 01:08
А есть автономный «ambiligth», который работает без привязки к конкретному источнику сигнала? Чтобы у него был HDMI вход, в который втыкаешь кабель от компа/тв бокса/консоли, он анализирует изображение и управляет свечением, а дальше через HDMI выход пробрасывает видео на телевизор.
+
avatar
0
  • puzoid
  • 03 февраля 2019, 01:21
Есть. Примеров море. HDMI преобразуется в аналоговый и идет на usb карту захвата, на raspberry pi софт захватывает экран и шлет данные на ардуинку, а та управляет лентой.
+
avatar
0
  • c00ler90
  • 03 февраля 2019, 01:45
А готовое решение?
+
avatar
+2
  • non7top
  • 03 февраля 2019, 05:16
Гуглить philips ambilight
+
avatar
+2
  • iPOWER
  • 03 февраля 2019, 07:33
DreamScreen
+
avatar
0
  • radi_k
  • 03 февраля 2019, 10:17
Для меня идеальным вариантом оказалась связка ТВ-бокс+Ардуино+БП+Лента. В ТВ-бокс установил и настроил с Play Mаркета приложение Android Ambilight Application. В Ардуино «залил» скетч от разработчика Android Ambilight Application, естественно подправленный под мою конфигурацию по количеству светодиодов. И теперь балдею. Это, в итоге оказалось самым простым вариантом. Рекомендую.
+
avatar
0
У меня как раз нету бокса, зато есть пачка малин и апельсин под зимние вечерние издевательства.
+
avatar
+1
Через 15 минут просмотра глаза на лоб лезут
+
avatar
+4
  • tupercav
  • 03 февраля 2019, 02:23
За воплощение пять, а вот идея — ну на любителя. Я лично когда смотрю фильм, концентрируюсь на том, что на экране, если за краном постоянно будут бегать световые зайчики — все время буду отвлекаться. Это круто только на медленных проходах, пейзажах например, особенно где есть небо. Но на постоянку — не не)
+
avatar
+3
там сверху видео кинул, в оригинале(у филипса) это совсем по другому, фильмы при полной темноте самое то, глаза намного меньше устают.
+
avatar
+5
  • MPaul
  • 03 февраля 2019, 06:15
Вот как раз наоборот — за идею 5, а воплощение на троечку. У меня старенький Филипс с Ambilight — очень приятная штука. А тут какие то дикие скачки света высокой интенсивности — действительно эпилепсию заработать можно.
+
avatar
0
Не знаю, не знаю.
Вчера вечером смотрели grand tour а не мультики — абсолютно не отвлекало и не напрягало. А вот мультяхи — да, мельтешат мощно.
+
avatar
0
  • StorkZZ
  • 03 февраля 2019, 09:46
На lightpack, например, есть куча настроек от яркости до инерции. Можно под себя сделать.
+
avatar
+1
  • serg_mur
  • 03 февраля 2019, 08:01
А можно то же самое, но на Orange Pi PC?
За обзор плюс. Положил в закладки.
+
avatar
0
Как раз на OpiPC я в свое время делал. Пришлось отказаться от этой затеи из за невозможности на нем использовать Hyperion/Boblight одновременно с железным ускорением. А на программном, 720p идет с заметными фризами, 1080p вообще превращается в слайд-шоу.
Но теперь, благодаря автору, появилась идея приобретения малины и возрождение проекта уже на ней.
+
avatar
0
  • serg_mur
  • 03 февраля 2019, 16:32
Жаль. Апельсинка используется как раз с прошивкой OpenElec. Покупать ещё малинку ради эмбилайт — слишком жирно.
+
avatar
0
Тоже хочу знать, можно ли на оранже такое сделать? Год назад так и не нашел решения. Сейчас хоть не покупай Raspberry.
+
avatar
-2
  • vovka036
  • 03 февраля 2019, 11:00
За обзор плюс. А так баловство и ненужная вещь. Купить сразу экран большой и не нужно подсвечивать.
+
avatar
0
  • Bunker26
  • 03 февраля 2019, 11:20
На большой экран тоже можно ленту приклеить. Не убивайте в человеке творчество.
+
avatar
0
  • Dimon_
  • 03 февраля 2019, 11:24
Посмотрел код под ардуину. Когда я был тринадцатилетним «программистом» на бейсике под ФОДОС и RT-11, я тоже использовал оператор GOTO…
+
avatar
0
и во фряхе какой-то злодей 6309 раз его использовал и что?

а сколько безусловных переходов вставляет вероломный компилятор в ваши свободные от goto программы, даже подумать страшно))
+
avatar
0
  • Dimon_
  • 03 февраля 2019, 15:32
Вы не путайте свою шерсть с государственной ассемблер и язык высокого уровня. На асме я тоже JMP использую, как там без этого.
+
avatar
0
я просто к тому, что goto кто-то злоупотребил, а кто-то другой записал его в безусловное зло и все повторили…

а так — оператор как оператор, циклами можно накрутить ещё хуже вермишели)

приведенная программа читается же нормально
+
avatar
+1
  • 10ghz
  • 03 февраля 2019, 11:51
Рекомендую автору поставить подтягивающие резисторы к земле, электролиты побольше, снизить вольтаж до 4.9в. 2812 дохнут как мухи… У меня стали подыхать от начала к концу ленты. Быть может если бы я сделал это сразу, проработало бы дольше.
+
avatar
+1
Благодарю за подсказку.
Ушел исправлять недостатки по питанию
+
avatar
+1
  • chaloc
  • 03 февраля 2019, 13:28
Зависит лишь от качества ленты. Одна с конца 14 года (после этого обзора сделал) работает без всяких конденсаторов/резисторов, местами болтаясь в воздухе по несколько часов ежедневно. Вторую брал позже для экспериментов с цветомузыкой — и питание правильное с парой резисторов и конденсатором и приклеена была к алюминиевому уголку по всей площади, а толку ноль.
+
avatar
0
  • 10ghz
  • 03 февраля 2019, 14:59
Возможно вы правы и это печально. Буду пробывать sk9822.
+
avatar
+1
  • Vovan_a
  • 03 февраля 2019, 16:07
Нужно ставить защитный резистор на вход управления ленты. Без него, в случае отвала общего провода, сдохнут несколько первых светодиодов.
+
avatar
0
  • 10ghz
  • 03 февраля 2019, 16:17
Это само собой. 1-10КОм вроде, точно не помню. Но это не помогло.
+
avatar
+1
  • and7ey
  • 03 февраля 2019, 22:58
Что-то я не уловил — а как kodi/openelec узнает, что что-то надо на ардуино слать? И что за специальный кабель нужен для связи малинки и ардуино? А запитать ардуино от ТВ не выйдет? У меня малинка от usb порта ТВ работает.
+
avatar
0
Хочу создать вот такого монстра с последующем описанием проекта на муське. хотелось бы взять диоды SK9288 Raspberry Pi 3 B+ Все это через тв приставку nVidia Shield TV подключить к телику 65` хотелось бы подключить в идеале ко всем 4м граням но думаю и 3 будет достаточно. общая длинна 3х граней 308см. Для жиру хотелось бы подрубить ленты по 144 диода на метр, ну ли хотябы 92 на метр. нашел такую на тао но вот какая загвоздка если подрубать ленту через arduino то там в скейтче есть какое-то ограничение в общее количество светодиодов на проект в 300шт. В моем случае в исполнении 144шт/м выйдет 444 диода на проект, в исполнении 92шт/м выйдет 284 диода на проект. Собственно вопросы:
1) Можно ли как то обойти ограничение в 300шт на проект?
2) Можно ли вообще обойтись без arduino? Если нет может arduino mega позволит как то обойти ограничение в 300шт и будет работать пошустрее?
3) Как вообще все это соединить в плане софта, я имею ввиду подключение SK9288

Ну так ка задаю вопросы было бы неплохо ответить на пару вопросов от камрадов выше.
Если у вас дохнут WS2812B попробуйте WS2813 это более новая версия, в которой при помирании одного диода продолжают работать, так как у нее есть четвертая дублирующая дорожка.


Если вас раздражает мерцание и возникает эффект эпилептического припадка, а у оригинального амбилайта все ок, то секрет тут прост, у оригинального всегда есть подсветка даже на темных участках, чаще всего фмолетового цвета, а когда черный цвет на экране сменяется другим то фиолетовый меняется на нужный цвет с увеличением яркости, и по сути вы не яркую вспышку видите а смену цвета, что выглядит естественней, плавней и не раздражает нервную сиисмему, если такое можно реализовать в софте то было бы круто.

Вот интересный обзор и сравнение диодов apa102 и sk9288 думаю многим тут будет интересно
+
avatar
0
В комментарии выше вставилось какое-то левое видео, не знаю как его отредактировать, вот нужное видео


Вот еще в догонку с форума hyperion-project.org таблица по рекомендуемым к данному проекту светодиодам. Они пишут следующие:
Очень рекомендуем покупать 4-Wire/clocked/synchronous Chipsets они напрямую работают с RPis SPI-Port с ними нет проблем.
С диодами 3-Wire/nonclocked/asynchronous Chipsets напрмер WS2812B есть чиподрос в плане что их придется подключать через дополнительное железо, такое как Arduino
Вот таблица для сранения диодов, актуальна на февраль 2019

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.