Использование цветовых пространств в ATTiny13a для WS2811

Использование цветовых пространств в ATTiny13a для WS2811

1155

Моя новенькая мысль посвящена использованию цветовых пространств в микроконтроллер. Тем не наименее, я предлагаю способ и его реализация, схожих которым я не встречал. И опять приветствую, Хабр! Тот факт, что Мои анонсы кому-то это не кажется , я не удивлюсь.
Но на этот раз не сверкали и не сверкали по чрезвычайно очевидной причине… батареи. Как-то руки до их и не слышал, но опосля празднования Новейшего года с родственниками, я увидел, что ее тетя была маленький сувенир елка из стекла, которые она любит. Памятуя собственный набор светодиодов, обещал сделать небольшую гирлянду для елки, чтоб устранить эти недочеты раз и навсегда, и сделать еще один близкий мне человек незначительно счастливее. Маленькое предисловие, как все начиналось. Не так давно завершился год и унаследовал от него я получил около 300 ws2811 светодиодов.
но я так и не отыскал. Тормознул на том, что все идеи, программы, эффекты и их коммутаторов, поглядел в мою голову чрезвычайно массивным и очень неловким, раз вы реализуете их в цветовом пространстве RGB, и не считая того, я так и не сумел решить, какой контроллер применять. Нет, я, естественно, отыскал много увлекательных решений, и почти все из их были ваши подарки прямо тут, на хабре, и за что я нескончаемо благодарна всем Для вас, Вы дали еду для раздумий. Но из моего маленького опыта работы в качестве дизайнера, у меня есть познания о остальных местах, которые отдал мне мысль HSL и HSV. Развитие движется в голове, равномерно ускоряясь, время от времени превращаясь в вихрь мыслей, но в эти дни места не двинулась. Изобрести новейший смысла не было, реализаций много необходимо лишь отыскать…
В конце концов было решено тормознуть на HSL, принимая из 1-го компонента S (насыщенность), оставляя его неизменным (как в реализации ХДС, этот параметр является лишним), и контроллер решил применять ATMega8U.
И не было мне незначительно расхождение с настоящей. Каждый охотник хочет знать… Бросил кода и тестирование прошивки, я сообразил, что чего же-то не хватает. Нет оранжевый цвет в природе, нравится для вас это либо нет, он просто тень. и опять я возвращаюсь к этому вопросцу, и опять я понимаю, что там…
Это был корень и причину моей идеей, так что я переписал код и выдумали способ использования compact описание цветового места, и это не HSL, HSV и RGB, поэтому что я расширил спектр оранжевый и преобразовал его в отдельные пространственные сектора.

Сейчас лишь по существу
Место можно представить в виде поверхности цилиндра, раз он закрыт, размещенные в углах, смещенных на 60 градусов базисных цветов, меж которыми заполняется градиентные переходы от 1-го основного цвета к другому:

Где высота цилиндра-это яркость, которая также является компонентом градиента цветов. Одно и то же место-это прямоугольник со сторонами «A x B», где «a» — угол, который описывает базисный цвет и оттенок, и B — яркости, раз место не закрыто либо развернуть из цилиндра.
Для данной задачки я решил применять квадрат со стороной 255 x 255, тем самым обрисовать в Тип byte, где угол конфигурации значения в спектре 0..255 (б), и яркость: -127..127 (старший б), это возможность использования 8 главных цветов и 32 градации цветов для каждого.
Описание: Место описывается как массив с RGB — составляющих главных цветов, цвета и градиенты рассчитываются «на лету».
{0,128,0}, {64,128,0}, {128,128,0}, {128,0,0}, {128,0,128}, {0,0,128}, {0,128,128}, {0,128,0}

тут мы опишем последовательность базисных цветов, назовем ее радуги, где порядок компонента меняется в согласовании с Datasheet ws2811 (GRB), и крайний красноватый, служит для того, чтоб закрыть место, оно смотрится так:

Сейчас, раз вы принимаете некие из индекса цвета, 183 к примеру, вы сможете сделать свое отражение в RGB пространстве последующим образом:
Индекс basic color = 183 / 32 = 5 (голубий либо {0,0,128})
Смещение hue = 183 % 32 = 23
Сейчас рассчитаем разницу меж компонентами приобретенного базисного цвета ({0,0,128} опосля {0,128,128} для вычисления приращения (именуется «Дельта»):
dG = 0 — 0 = 0, dR = 128 — 0 = 128, dB = 128 — 128 = 0;

Как меж цветами, 32 градации, нужно поделить разницу компонента:
dG= 0 / 32 = 0, dR= 128 / 32 = 4, dB= 0 / 32 = 0;

Сейчас вы должны приобретенных Дельта применяться для смещения тени и добавить к компонентам текущего основного цвета ({0,0,128}):
G = 0 + 0 * 23 = 0, R = 0 + 4 * 23 = 92, B = 128 + 0 * 23 = 128;

Получил {0,92,128}, к которому сейчас можно добавить яркости, к примеру, 50: {50,142,178} хотимый цвет.
Раз Дельта отрицательная, смещение тени, когда умножение дает отрицательный дополнение, которое даст разницу в заключительный компонент, это происходит, когда компонент градиента на спад. Как вы сможете созидать, ничего сложного.
Нужно также контролировать Нижний порог, чтоб не вызвать переполнения при отрицательной яркости. И да, яркость не пропорционально и линейно, что дает некую погрешность, но в рамках описываются задачки, это не страшно.
Таковым образом, приобретенное место дозволяет применять 255 * 255 = 65535 цветов.
В итоге, первоначальное решение применять ATMega8u был упразднен в пользу tinki поэтому что прошивки потребовалось наименее полутора кб. Все описанные способ был оптимизирован, удалены все умножения и деление, и принес по упрощенной quick math, просто переписать на ассемблере (я лично чрезвычайно доволен скорость: 200 НС меж компонентом расчеты по 7 светодиодов), при необходимости оптимизацию для уменьшения размера кода.
Нет, я не жлоб, я просто ленивый.
Так, приведенный ниже код выполняет инициализацию, и включает в себя функцию вывода данных на полосы ws2811:

И этот код в main loop и функция преобразования индекса места, в цветовых компонентов на примере:

И вот видео демонстрация (true color далековато от действительности):

Раз у вас есть вопросцы, задавайте. Наиболее детально обрисовать комменты в тексте нет смысла, метод, уже описанный выше.
Ну, на самом деле, все, что я желал огласить.
… шуточка не все!

А сейчас представим для себя на секунду, как можно применять этот способ. Как вы любите место, которое показано на данной картинке:
Вы сможете обрисовать разные цвета и градиенты меж ними. И кто в начале описания решил, что данный способ не дозволяет применять цвета сероватого — не верно. Верно!
И раз даже незначительно пота и незначительно переписать код, вы сможете получить в 96 б с тем же результатом. И раз вы слегка измените код и прирастить количество шагов в описании компонента 8, 32*8 даст 256 (в моем коде, 3-скорость), используя семь массивов (0..255 красноватый, желтоватый, зеленоватый, голубой, голубий, фиолетовый, белоснежный) дают комбинацию, 16m цветов, в то же время на экране! В заключение, самые вкусные
Массив, описывающий место памяти-32 б (из-за выравнивания), которая хранится в памяти программы. При использовании 224 б прошивки для хранения. Раз сделать несколько таковых описаний пространств, и переключаться меж ними на лету, переключение указатель на массив, вы сможете выбрать текущее место для каждого новейшего Сид в очереди и дозволяет расширить число градаций меж цветами.
В общем, все предлагаемые могут быть изменены, как вашей душе угодно, на собственный вкус и цвет, а можно применять как есть, и наслаждение я для вас гарантирую! дизеринг от старенького британского didderen — дрожать с тем, что вы сможете достигнуть еще наиболее цветов. Плюс, благодаря оптимизации и результирующая скорость обработки, можно применять так именуемый способ дизеринга ((Engl. Она также дозволяет создавать замкнутых пространств друг на друга, чтоб удалить либо сделать невидимым эффекты перехода.
Спасибо за внимание, до скорых встреч! С нетерпением жду ваши комменты, критику, вопросцы и советы. Сейчас я опять прощаться, и бросить начальный код для вольного использования.
Уникальные тексты распространяются безвозмездно как есть, в случае использования на остальных веб-сайтах либо в остальных источниках, создатель и уведомления о размещении требуется. Применять в коммерческих проектах, перепродажи начальный код, используя в целях извлечения прибыли либо каких корыстных целей, запрещается. habrahabr.ru