1. Главная страница » Компьютеры » Ambilight raspberry pi 3

Ambilight raspberry pi 3

Автор: | 16.12.2019

программист в поисках счастья

Итак, вы прочитали первую часть и понимаете какую боль вам придётся испытать и всё равно хотите попробовать? Очень хорошо, я попробую это облегчить.

Хочу сразу подчеркнуть, что если вы хотите и фильмы смотреть и управлять лентой с Raspberry Pi, то вы пришли не по адресу. Мой вариант годиться только для одного – фоновая подсветка для внешнего HDMI сигнала.

Итак вам понадобятся:

  • Raspberry Pi 2
  • Светодиодная лента на базе ws2812b
  • HDMI Splitter
  • HDMI2AV converter
  • EasyCap USB AV Grabber
  • блок питания для Raspberry Pi
  • блок питания для HDMI Splitter-а (Должен быть в комплекте)
  • 3x HDMI кабель
  • RCA-RCA кабель
  • Источник HDMI сигнала, например Nvidia Shield
  • паяльник, припой,

Блок питания для Raspberry Pi

Я не могу передать словами, насколько важен хороший источник питания для Raspberry Pi. Если вы видите вот такой значок в верхнем правом углу, значит вашему Raspberry Pi не хватает питалова.

я взял SmartBuy с двумя USB на 2 и 1 ампера, проблемы с питанием пропали.

Ещё хорошо себя показала внешняя батарея от Xiaomi

Video Grabber

Easy Cap USB Video Grabber – эта та самая вещь, которая доставит вам много боли, так как их существует великое множество (говорят всего 4), и невозможно определить какой именно девайс вы купите до покупки, так как они выглядят одинаково.

Мне не повезло – я купил 4 штуки и все они оказались на базе чипа UTV007. К счастью, Raspbian от 2015-05-05 (последний доступный Debian Wheezy на официальном сайте Raspberrypi.org на момент написания) уже включает в себя поддержку драйвера для этого устройства.

Светодиодная лента

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

На то, чтобы все припаять правильно и ничего не развалилось, пока я нёс это до телевизора ушло вечеров 5. В результате я добился чего хотел – надёжного соединения и без соплей. Правда из-за того, что я сначала отодрал защитный слой со светодиодной ленты, а потом паял, то на него налипла всякая хрень, которая мешает надёжному креплению ленты к телевизору. Появилось даже идея воспользоваться могучим клеем момент, но пока это выглядит вот так:

Остальные компоненты

HDMI Splitter или разветлитель по нашему. Нужен чтобы сделать из одного выходного сигнала два. Первый всё так же идёт на телевизор, а второй, копия первого, идет на устройство видеозахвата и используется в качестве входных данных для задания цвета светодиодов

Поскольку EasyCap работает с аналоговым видеосигналом, а на выходе у современных устройств как правило HDMI, то нужен конвертор HDMI2AV.

Его и EasyCap соединяем RCA-RCA кабелем соблюдая маркировку – желтый CVBS/Video в Желтый и т.п.

Подключение светодиодной ленты

Это малость запутанный момент. Можете нарыть разные варианты в интернете. Тот же Adafruit дает неплохое описание. Важно помнить две вещи:

  • У светодиодной ленты и Raspberry Pi должна быть общая земля
  • Для питания светодиодной ленты нужен мощный источник питания, около 60*количество светодиодов мА

У меня 80 светодиодов, то есть мне нужно 4.8 Ампера для светодиодной ленты. Я купил блок питания от какого-то ноутбука на 6 Ампер.

И о чудо – штекер от блока питания идеально подошёл к одному из разъёмов с клеммой, что у меня завалялся.

Соответственно берем минус и подключаем к земле ленты (чёрный провод) и к земле на Raspberry Pi 2 (например к pin 6), а плюс с разъёма подключаем на 5 вольт ленты (красный провод). Последнее, что остаётся сделать – это подключить data (зелёный провод) светодиодной ленты к pin 12.

Распиновку Raspberry Pi 2 можно посмотреть здесь.

Результат

В результате получилось довольно миленько:

Что скажите? То как выглядит подсветка – норм?

Здравствуй, завсегдатай и гость Хабра.

Давно читаю Хабр, но всё никак не было поводов написать статью, пока меня не накрыло мне очередной раз не напомнили о существовании Raspberry Pi и о такой вещи как WS2801 LED Strip. Тут уже однажды писали о подобной, но для связи с Ардуиной, чтобы получить Эмбилайт, поэтому я решил рискнуть и написать свою статью, с Лего и Котиками.

В статье будет мало картинок, несколько видео, много текста, включая лирические отступления не по сабжу и совсем мало кода, но в самом конце будут ссылки на проект на Гитхабе. А теперь обо всём по-порядку:

Всё началось с того, что я узнал, что один коллега по работе регулярно возит Малиновые Пирожки и продаёт их с минимум наценок, особенно своим коллегам. Очередной раз услышав о пирожках, не смог устоять и приобрёл у него оный. Что это такое и что с помощью него можно сделать, рассказывать не буду, и так все знают, а кто не знает, могут поискать, статей полно. Сам я с ним поигрался недельку-другую, настроил под что мне надо было и успокоился.

Но тут тот же коллега подкинул интересную инфу: можно заказать с Ибея управляемую (адресную) "гирлянду" (+ блок питания, коннекторы и соединительные проводки на свой вкус и цвет) и простейшим способом получить DYI Ambilight как это рассказано, например, тут. Или же, можно просто играться с этой гирляндой как душе угодно: в теории она позволяла в любой момент времени зажечь любую из лампочек любым RGB цветом, а ведь об обладании такой штукой я мечтал уже несколько лет!

Не долго думая, заказал необходимые части на Ибее. Расчётный срок доставки был порядка 3х недель, так что было пока время отвлечься на подготовку к поездке в отпуск на неделю в Швецию. По возвращении ещё был неделю дома, пытался заранее найти как можно больше информации о том как гирлянду надо будет подключать, искал различные скрипты и библиотеки для написания собственных алгоритмов управления. Толкового нашлось не очень много, одна Хабра-статья, правда она про связку с Ардуиной и несколько ссылок привели на этот Python-проект. Так как задачи делать эмбилайт у меня как раз таки не было, а к Python душа не лежит (сам люблю Java + Android), полезной информации там для себя нашёл не много. Время свободное было, гирлянда никак не приезжала, решил накатать на Андроиде простенькое приложение-симулятор гирлянды и написать пару алгоритмов управления последней. Приложение было на столько простое и не менее кривое, что даже показывать никому не стал.

Читайте также:  Nfc антенна для телефона

В последние выходные отпуска мне привезли из Новосибирска долгожданную коробку Lego 42009, которая временно затмила мои мысли о гирлянде.

Планы по сборке Лего были назначены на следующие выходные, когда, примерно, ожидался и приезд посылки из Китая. Долго думал, чего же больше я жду — торжественного открытия коробки Лего и сборка топового на данный момент набора Lego Technic или же игра с мечтой последних нескольких лет. Посылка пришла вечером в пятницу, а на утро субботы планировалось начать сборку конструктора и снятие Time-Lapse процесса сборки.
Разумеется, я не смог удержаться в пятницу вечером и попытался подключить гирлянду в Пирожку, но в виду отсутствия необходимых проводков, подключение к GPIO портам RPi’я было затруднительно. Найдя какие-то старые проводки, разобрав старую мышку, начитавшись статей в Интернетах пытался подключить гирлянду хоть как-нибудь и запустить пробные скрипты. Но всё было тщетно. При подключении питания к гирлянде зажигалась первая лампочка белым светом и всё, никаких реакций не было независимо от того, что я запускал на Пироге. Изрядно помучавшись, решил отложить дело до утра.

Утром пришёл друг-фотограф для помощи в сборке и съёмки Лего, вместе с ним также безуспешно попытались подсоединить гирлянду к Пирогу. Через час бросили это дело, пошли готовить environment квартиры к сборке Передвижного Крана.
[лирическое отступление]
Сборка прошла на ура, кран оправдал все ожидания, оказался даже больше, чем думал, сам процесс сборки был непростой и увлекательный. Time-lapse видео сборки можно посмотреть тут.
[/лирическое отступление]

Так как начали позже, чем планировали, закончили ещё позже, к гирлянде не возвращались больше. Зато днём следующего дня приехал другой знакомый, который уже специалист — железячник, заодно и привёз очень нужные проводки разной длины и разъёмов для подключения гирлянды к Пирогу. Сели с ним ковыряться. Потратили часов 5, наверное и, казалось бы, безуспешно. Поначалу гирлянда не реагировала на внешние раздражители, то есть нас, никак. Потом иногда начали мигать несколько первых огоньков при касании разъёмов подключения к пирогу. Спустя час выяснили, что если замыкать пальцами провода, которые должны идти к Пирогу, то зажигаются или тухнут несколько первых огоньков гирлянды. Значит, она всё же рабочая, оставалось понять, почему же не работают скрипты. Беглый анализ Пайтоновского скрипта показал, что используется устройство /dev/spidev0.0 , собственно у меня в системе он присутствовал. Параллельно пытался гуглить проблему, что-то находил, применял что скажут, но безуспешно.

К концу дня совсем выбившись из сил, гость меня покинул, а пока он ехал домой я решил забрести в конфиг Пирога
raspi-config
и обнаружить главный epic fail последних пары дней, а именно, что SPI у меня был выключен…
Включил. Скрипт заработал, можно было включать-выключать все диоды белым цветом и запускать два бесконечных действия — fade (постепенное появление и угасание рандомными цветами), или же chase — последовательно бегающий огонёк из начала в конец.

Счастью не было предела. Сделал даже пару фотографий построенного Лего-крана при свете гирлянды:

Cкудные возможности скрипта быстро надоели, а написать что-то своё на Пайтоне мне было достаточно проблематично. Поэтому, было принято решение написать своё простенькое Java-приложение для Raspberry и начать это завтра. А ведь «завтра» — это был понедельник. Именно в этот понедельник я не хотел идти на работу больше, чем во все остальные понедельники ранее. Пережив понедельник, убежав с работы пораньше, повесив гирлянду под потолок, на верхний край ковра, что висит и закрывает большую дыру в обоях, в моей квартире, уселся за код, но тут меня ждал ещё один подвох, впрочем, ожидаемый.
Установив все необходимые java-пакеты решил написать Hello World, скомпилить и запустить прям на пироге. Компиляция даже такого простого приложения на Rapsberry Pi-е заняла несколько секунд, порядка 5, что уж говорить о дальнейшем коде? Это было достаточно неудобно, также как и отсутствие нормальной IDE. Поэтому было принято решение писать код на большом PC, на пирог заливать по ftp скомпилированные классы и там их уже запускать. Позже, когда проект разросся до большого количества файлов стал собирать сразу в jar-ы. Подобрались к самому интересному. Стоял главный вопрос: как заставить гирлянду зажигаться используя Джаву. Поиск в Гугле ничего не дал, находились исходники на Си с использованием библиотек и пара скриптов на Пайтоне. На последнем это выглядело так:

где pixels — массив байтов, размером в 3 раза большим, чем количество лампочек в гирлянде. Каждые три элемента в массиве — это значения для RGB-каналов для каждой лампочки. Допустим, у нас есть гирлянда из 50 лампочек, чтобы её всю зажечь, нужно писать в файл /dev/spidev0.0 массив вида . Никаких заголовков, просто массив байтов и flush после.
Главная идея заключалась в том, что в каждый момент времени нужно писать в файл весь массив, даже если хочешь зажечь одну лампочку. Задержка по времени нужна для того, чтобы видеть все изменения на ленте, впрочем, её можно варьировать как угодно.

Возвращаясь к Java, там код записи в файл выглядит почти также ( try-catch опущен):

Читайте также:  Cmiboot exe что это

Собственно, написав простенький класс работы с устройством, написал ещё пару классов-обёрток для различных простых действий, таких как зажечь определённую лампочку заданным цветом, зажечь всю гирлянду нужным цветом, тот же chase и fade. Днём позже прикрутил ещё визуализацию работы стека и чего-то ещё.



Но опять же, запускать эти «алгоритмы» — мало интереса и это тоже быстро надоело. Хотелось непосредственного управления. Было решено написать простенький сервер, опять же на Джаве, который принимал бы строковые данные, парсил их и взаимодействовал с гирляндой на основе присланных «команд». Для удобства было сделано так, что порт, количество лампочек в гирлянде и устройство ( /dev/spidev0.0 ) задавались с помощью параметров при запуске сервера.
Клиент, в сою очередь, на Андроиде. В первой версии клиента был минимальный функционал — включить-выключить, установить цвет с помощью RGB-ползунков и «двигать» огонёк ещё одним ползунком. Не смотря на мою нелюбовь «с детства» к клиент-серверному коду, написанный код работал и даже правильно.
Довольно быстро понял, что 50 лампочек мне будет недостаточно и заказал ещё столько же в рассчёте на то, что позже их можно будет сложить в квадрат 10х10, а это новое поле для полёта фантазии, тут можно будет делать хоть классическую змейку.
Чуть позже мой знакомый студент помог переписать клиент-серверный код под более правильную архитектуру, теперь клиент общался с сервером с помощью заранее заданного набора команд, а данными для каждой команд служил параметр типа Object , следовательно, там могло быть всё, что угодно. Также, для защиты от «несанкцианированного доступа», на сервер добавил поле с паролем, а на клиенте посылал его первой командой. Если он не подходил, сервер отключал клиента. Это было сделано на тот случай, если кто-то знает по какому имени/айпишнику и порту доступен мой пирожок, чтобы не смог попытаться поиграться гирляндой.
Переделав код под новую архитектуру, начал наращивать функционал вширь: добавлял новые элементы интерфейса и новые алгоритмы управления лампочками.

Добавилось и мерцание RGB-цветами и рандомными и радуга, в том числе двигающаяся. Был даже прикручен NFC для включения-выключения лампочек при чтении любой метки (удалено из финальной версии) Отдельно стоит упомянуть, что был прикручен Гугловый SpeechRecognizer, который был настроен на восприятие буквально 5ти команд: «красный», «зелёный», «синий», «жёлтый» и «радуга». Ну и самая, на мой взгляд, интересная функциональность — это использование всей длины гирлянды как… эквалайзера, наверное правильней сказать: количество последовательно зажжённых лампочек зависело от громкости звука, воспринимаемого микрофоном смартфона. Особенно эффектно это выглядит на примере трека Caspa — Sir Rock A Lot:

Общий обзор функциональности приложения:

После этого ещё немного побаловался с парой алгоритмов, правил найденные баги на сервере и клиенте, а также слегка рефакторил код. Сейчас главный управляющий экран выглядит так:
Весь код выложен на Гитхаб (библиотека, сервер и клиент) для неравнодушных. Буду рад, если он чем-то поможет. У самого планы сделать форк в версию 2.0, функциональность которой до конца я пока не определил для себя, но в планах примерно следующее:

  1. Выбор экрана управления: прямая лента, прямоугольник или квадрат.
  2. Расширение текущей функциональности для ленты, вытянутой в одну прямую.
  3. Написание пачки алгоритмов под вариант, когда лента сложена в квадрат и прямоугольник:
    • Управление зажжёной лампочкой
    • Эквалайзер из центра квадрата
    • Статичный текст/Бегущая строка
    • Змейка
    • что-нибудь ещё. Если будут идеи, пишите, с радостью обсужу и приму к сведению.

    Из мелочей, что забыл вовремя написать:

    1. Возможно надо корректировать цвет каждого диода перед записью в файл потому, что свет получается «холодный» и отдаёт в синеву при значениях 255-255-255. В Пайтоновском скрипте, что я находил, так и делается:

    2. Иконку нарисовал мне тот же человек, что помогал записывать тайм-лапс постройки Лего. В основе неё лежит фотография моей кошки- упорошки

    3. Описанные действия с файлом /dev/spidev0.0 работают только для лент с контроллером WS2801. В прошлые выходные подарили на ДР знакомому (necrys) именно ленту, а не гирлянду (на этот раз как раз для эмбилайта), очень надеясь, что там тоже WS2801. Заказывать из Китая времени не было, покупали у нас в городе, продавец утрерждал, что контроллер такой же, хотя никаких надписей на упаковке и самой ленте не было. В самый разгар празднования Дня Рождения решили попробовать подключить. Безуспешно провозившись несколько часов, казалось бы, зная все подводные камни, включить так и не удалось, пока случайно не попробовали поменять протокол на SM16716, после чего она лента зажглась и даже работал chase, но гаснуть всё равно не хотела. Написание простой с-программы вопрос не решил, попытка записи массива по 3 байта зажигала такие участки ленты, что логику работы в тот день нам понять не удалось. После экспериментов, к середине следующего дня, новому обладателю ленты удалось таки раскурить-понять алгоритм работы с лентой: в файл нужно писать массив по 4 байта на светящуюся единицу, где первый байт должен быть всегда 0xFF, а остальные уже RGB. Изменение значения первого байта ведут к поведению ленты, смысл которого пока понять не удаётся. Именно в виду разницы контроллера, сборка и патчинг boblight, который с ним работал бы корректно и соединить его xbmc заняло несколько дней. Но после результат был достигнут:

    За код просьба сильно не пинать, опыта написания больших проектов, к сожалению, пока не имею, да и когда начинал писать код, не думал, что вырастет до такого. А ещё это первый опыт работы с Гитом и выкладка своего кода в Open-Source.

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

    Проблемма заключается в том, что все существующие гайды и мануалы датируются в лучшем случае 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.

    Читайте также:  Dell latitude e7240 обзор

    За основу был взят мануал от 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.

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

    Для корректной работы необходимо иметь установленную библиотеку 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 (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 и выдает вращающуюся радугу).

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

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *