Делаем Ambient Light на Raspberry Pico. Контрибьютим в OpenRgb

Ambient Light помогает работать ночью. Когда вокруг темно и светит только монитор, то глаза сильно напрягаются. Лично мне приятно работать без верхнего света, и данное решение помогает мне это делать.

7ea202a1aca948180f82b8f660c326bb.png

Возникла у меня эта идея, когда я переехал на новое место с большим столом. Я вспомнил ролик AlexGyver и решил сделать себе такое же. Но в отличие от Гавера, Я делаю устройство на основе Corsair Lightning Protocol, что позволяет ему быть более универсальным в настройке эффектов и выборе платформы.

Проблемы решения AlexGyver

  1. Только Windows

  2. Трудности с поиском Arduino и его ценой (на момент января 2023)

  3. Нет других эффектов

Проблема решения Giant4 [ссылка удалена мод.]

  1. Только Windows или Android

  2. Нет других эффектов

Есть так же решение с Aliexpress, но они тоже используют проприетарную программу под Windows.

Ambient Light

Ambient Light

Что такое Ambient Light?

Это динамическая подсветка монитора, которая как бы продолжает его. Светодиоды выводят края экрана тем самым делают иллюзию увеличения размера.

ВАЖНО!

Ambient Light только для компьютера. То есть мы делаем без Hdmi Splitter.

Комплектующие

Выбрал я rpi pico, потому что он был дешевле Arduino (в последствии из за этого нужно было немного помучиться, но все работает). Брал я все в разных магазинах, поэтому посоветовать ничего не могу.

Сам микроконтроллер

Сам микроконтроллер

Нам понадобится:

  • Паяльник

  • Катушка припоя

  • Адресная светодиодная лента (зависит от периметра вашего монитора, нужно посчитать рулеткой, мне хватило 4 метра, брал на 5v)

  • Активный флюс

  • Штука для чистки флюса (можно взять спирт или ацетон)

  • 300–500 Ом резистор (без него светодиоды будут перегорать)

  • Блок питания для вашей ленты (лучше брать с запасом, мне хватило 20w)

  • Коннектор для питания (нужен чтобы поддерживал ваше напряжение)

  • Красивая коробочка

  • Клей пистолет, чтобы это все держалось

  • Провода которые бы выдерживали ваше напряжение (взял 10 метров)

  • Сама rpi pico

  • Кабель usb для rpi pico

  • Макетная плата для пайки

  • Прямые руки (необязательно)

Цена вышла под 6–8 тысяч рублей, так как многих элементов не было (паяльник, припой и другое для пайки)

Как мы будем выводить с экрана на светодиодную ленту?

Для этого мы воспользуемся Corsair Lightning Protocol, который совместим с множеством программ. Нас интересует OpenRGB (есть на Mac os, Windows, Linux). С помощью нее мы будем и задавать цвета на светодиоды.

ВАЖНО! x2

Я случайно спалил целых 4 светодиода, так как запускал без резистора. Не повторяйте моих ошибок.

Собираем!

Схема сборки

Схема сборки

Итоговая сборка

Итоговая сборка

Итоговая сборка сбоку

Итоговая сборка сбоку

Светодиодная лента на корпусе монитора

Светодиодная лента на корпусе монитора

Решаем проблему с прошивкой

Есть маленькая особенность. Библиотека FastLed не имеет поддержку процессора rp2040 (rpi pico) в основной ветке. Поэтому нужно ручками скачать неофициальную библиотеку https://github.com/Zitt/FastLED/tree/rp2040

Установка

Скачиваем библиотеку

Скачиваем библиотеку

Добавляем библиотеку в arduino

Добавляем библиотеку в arduino

Выбираем библиотеку

Выбираем библиотеку

Добавляем устройство в arduino ide

Добавляем устройство в arduino ide

Ссылка на дополнительный список устройств: https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json

Устанавливаем Corsair Protocol

Устанавливаем Corsair Protocol

Выбираем нужное устройство

Выбираем нужное устройство

Выбираем Usb Stack

Выбираем Usb Stack

Прошиваем

Скачиваем arduino ide. Затем ставим драйвера для rpi pico и прошиваем изменяя количество светодиодов и порт ленты.

Прошиваем

Выбираем скрипт

Выбираем скрипт

Ставим нужные параметры

Ставим нужные параметры

Настройка ленты через iCUE

iCUE (программа для управления corsair node) рассчитана на проприетарные ленты, но туда можно добавить свои, что и нужно сделать.

Настройки

Настраиваем iCUE

Настраиваем iCUE

Ставим статичный цвет для того чтобы лента выключалась при отключения компьютера

Ставим статичный цвет для того чтобы лента выключалась при отключения компьютера

OpenRgb и его особенности

В OpenRgb не хватало настроек для достижение эффекта, которого я хотел. Мне также не понравились режимы работы Ambient Light: только среднее значение всего экрана или вывод экрана полностью без сглаживания, из за чего лента резко меняет цвета и глазам становится больно. А еще Ambient Light фотографирует через Qt в 60 кадров в секунду. Из за этого fps экрана проседает в два раза! Это не дело, и я решил изменить код, который должен был бы решать эти две проблемы.

У OpenRgb также есть api, но он не подходит для потоковой передачи видео. Он очень медленно меняет и имеет большую задержку.

Делаем свой эффект

Для адекватной работы эффекта пришлось изменить часть кода плагина Effects OpenRgb и добавить новый функционал. За два дня я:

  • Улучшил работу ScreenRecorder

  • Сделал доополнительное меню с глобальными настройками

  • Добавил параметр smoothness который отвечает за сглаживание

  • Сделал функцию SmoothMatrix для работы для матрицы

Код

ScreenRecorder

Изначально в коде Screen Recorder не было instance. Так, при каждом новом эффекте с использованием записи экрана нужно было создавать еще один, тем самым увеличивая нагрузку на компьютер.

ScreenRecorder* ScreenRecorder::Get()
{
    if(!instance) // Проверяем что instance еще нет
    {
        instance = new ScreenRecorder(); // Создаем если нет
    }

    return instance;
}

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

Глобальные настройки

Для начало нужно сделать в qtcreator эти самые настройки

Создаю форму

Создаю форму

Так она выглядит в редакторе

На практике

На практике

За основу я взял уже существующее окно About. Скопировал его и написал свою логику

GlobalSettings::GlobalSettings(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::GlobalSettings)
{
    ui->setupUi(this); // подключаемся к qt

    int fpscapture = ScreenRecorder::Get()->GetFpsCapture(); // получаем скорость захвата кадров
    ui->fpscapture->setValue(fpscapture); // ставим ползунок на нужное место
}

Код инициализации виджета

void GlobalSettings::on_fpscapture_valueChanged(int value)
{
    ScreenRecorder::Get()->SetFpsCapture(value); // устанвлиавем кадры
    ui->fpscapture->setValue(value); // меняем значение позунка
}

Код, который при изменении значения ползунка меняет значение скорости захвата кадров

Параметр smoothness

Изменяю существующую форму

Изменяю существующую форму

В программе

В программе

SmoothMatrix

Основной эффект в Ambient я считаю Screen Copy. Поэтому объяснять принцип работы SmoothMatrix я буду на нем.

for(unsigned int h = 0; h < height; h++) // перебираем экран по высоте
{
    for(unsigned int w = 0; w <  width; w++) // перебираем экран по ширине
    {
        // получаем цвет пикселя
        QColor color = scaled.pixelColor(reverse ? width - w - 1: w, h); 
        unsigned int led_num = map[h * width + w];
        // изменяем цвет на ленте
        controller_zone->SetLED(led_num, SmoothMatrix(ColorUtils::fromQColor(color), w, h), Brightness); 
        
    }
}

Тут я добавил только использование функции SmoothMatrix

RGBColor Ambient::SmoothMatrix(RGBColor color, int w, int h)
{
    if(color != previous[w][h]) // проверяем что цвет не равен предыдущему
    {
        // QToolTipedSlider не можете перебирать в нецелых числах
        // поэтому нам нужно превратить переменную в float
        float smoothness_f = smoothness;
        // используем интерполяцию
        color = ColorUtils::Interpolate(previous[w][h], color, smoothness_f / 1000);
        // записываем его как предыдущий цвет
        previous[w][h] = color;
    }

    return color;
}

Сама функция

Результат

Видео с работой

Весь код выложен в открытый доступ. Чтобы установить этот плагин, нужно:

  • Установить последнюю openrgb версию из pipeline

  • Скачать плагин из моего репозитория (UPDATE: патч был добавлен в master. Теперь его можно скачать из pipeline плагина)

  • Импортировать расширение в разделе settings

Инструкция с картинками

Скачиваем для Windows

Скачиваем для Windows

Распаковываем

Распаковываем

Открываем

Открываем

Будет ругаться Windows, но только потому, что у софта нет подписи из-за того, что мы используем версию pipeline

Скачиваем плагинУстанавливаем

Устанавливаем

Настройки

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

Скачиваем еще один плагин

Скачиваем еще один плагин

Устанавливаем

Устанавливаем

Ставим нужную длину светодиодной ленты

Ставим нужную длину светодиодной ленты

Придаем нужную форму

Придаем нужную форму

Запускаем эффект

Запускаем эффект

Итог

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

Эта реализация работает на любой платформе (Windows, Linux, Mac os). Кроме эффекта Ambient Light, можно настроить и другие в плагине Effects.

P.S

Думаю еще рассказать про перерождение моего Openwrt роутера, который я угробил. Для починки мне пришлось подключаться по UART с помощью

© Habrahabr.ru