Как сделать фиолетовый цвет в arduino

RGB светодиод и Arduino

В этой статье рассмотрены основы использования RGB (Red Green Blue (красный, зеленый, синий)) светодиода с Arduino.

Мы используем функцию analogWrite для управления цветом RGB светодиода.

На первый взгляд, RGB светодиоды выглядят так же, как и обычные светодиоды, но на самом деле у них внутри установлено три светодиода: один красный, один зеленый и да, один синий. Управляя яркостью каждого из них, вы можете управлять цветом светодиода.

То есть, мы будем регулировать яркость каждого светодиода и получать нужный цвет на выходе, как будто это палитра художника или словно вы настраиваете частоты на своем плеере. Для этого можно использовать переменные резисторы. Но в результате схема будет достаточно сложной. К счастью, Arduino предлагает нам функцию analogWrite. Если задействовать на плате контакты, отмеченные символом «

», мы можем регулировать напряжение, которое подается на соответствующий светодиод.

Необходимые узлы

Для того, чтобы реализовать наш небольшой проект, нам понадобятся:

1 RGB светодиод 10 мм

RGB светодиод

3 резистора на 270 Ω (красная, фиолетовая, коричневая полоски). Вы можете использовать резистор с сопротивлением до 1 кОм, но не забывайте, что с повышением сопротивления, светодиод начинает светить не так ярко.

Резистор 220 Ом

Беспаечная монтажная плата

1 плата Arduino Uno R3 или ее аналог

Arduino Uno

Провода

Схема подключения

У RGB светодиода четыре ноги. По одному позитивному контакты на каждый светодиод и один общий контакт, к которому подключаются все отрицательные полюса светодиодов (аноды).

Схема RGB светодиода

Общий анод на RGB светодиоде – это второй по счету, самый длинный контакт. Этот контакт мы подключим к земле (gnd).

Для каждого светодиода нужен собственный резистор на 270 Ом, чтобы предотвратить возможность протекания чересчур больших токов. Эти резисторы устанавливаются в цепь между катодами (красный, зеленый и синий) и управляющими пинами на нашем Arduino.

Если вы используете RGB светодиодиод с общим анодом, вместо общего катода, самый длинный контакт на светодиоде подключается к пину +5 V вместо пина gnd.

Схема подключения RGB светодиода к Arduino

Схема подключения RGB светодиода к Arduino - фото

Цвета

Немного теории: мы можем смешивать три основных цвета и видеть новые оттенки, так как в наших глазах три типа рецепторов (для красного, зеленого и синего цветов). В результате ваш глаз и мозг обрабатывает информацию о насыщенности этих трех цветов и преобразовывает их в другие оттенки спектра.

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

Палитра RGB цветов

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

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

Так как черный цвет не что иное, как отсутствие света, получить его не получится. Ближайший оттенок черного – это полностью выключенные светодиоды.

Скетч Arduino

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

Adafruit Arduino — RGB светодиод подробная инструкция на сайте:

int greenPin = 10;

//уберите тег комментария со строки ниже, если вы используете светодиод с общим анодом

setColor(255, 0, 0); // красный

setColor(0, 255, 0); // зеленый

setColor(0, 0, 255); // синий

setColor(255, 255, 0); // желтый

setColor(80, 0, 80); // фиолетовый

setColor(0, 255, 255); // аквамарин

void setColor(int red, int green, int blue)

green = 255 — green;

blue = 255 — blue;

Попробуйте запустить этот скетч. Особенности скетча раскрыты ниже…

Скетч начинается с указания пинов, которые используются для каждого отдельного цвета:

int greenPin = 10;

Следующий шаг – функция ‘setup’. Эта функция отрабатывает один раз после запуска Arduino. В нашей программе в пределах этой функции мы инициализируем три пина, которые мы будем использовать в качестве выходов.

Перед тем как рассмотреть функцию ‘loop’, давайте рассмотрим последнюю функцию в скетче.

void setColor(int red, int green, int blue)

Эта функция принимает три аргумента. Один отвечает за яркость красного, зеленого и синего светодиодов. В каждом из них значение варьируется в диапазоне от 0 до 255, где 0 означает, что он полностью выключен, а 255 – максимальная яркость. После этого функция вызывает ‘analogWrite’, чтобы настроить яркость каждого светодиода.

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

setColor(255, 0, 0); // красный

setColor(0, 255, 0); // зеленый

setColor(0, 0, 255); // синий

setColor(255, 255, 0);// желтый

setColor(80, 0, 80); // фиолетовый

setColor(0, 255, 255);// аквамарин

Попробуйте добавить несколько собственных цветов в скетч. Поэкспериментируйте с RGB светодиодом и вашим Arduino.

Если вы используете RGB светодиод с общим анодом, вам надо поменять значения, которые вы подаете на противоположные. То есть, 255 должен соответствовать 0. Для этого раскомментируйте #define COMMON_ANODE в приведенном выше скетче!

Расшифровываем цвета

Using Internet Colors

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

Шесть цифр номера соответствуют трем парам номеров; первая пара – красная составляющая цвета, следующие две цифры – зеленая составляющая, а последняя пара – синяя составляющая. То есть, красному цвету соответствует выражение #FF0000, так как это будет максимальная яркость красного светодиода (FF — это 255 в шестнадцатеричной системе), а красная и синяя компоненты равны 0.

Попробуйте зажечь светодиод, используя, например, оттенок индиго: #4B0082.

Красная, зеленая и синяя компоненты цвета индиго – это 4B, 00 и 82 соответственно. Мы можем использовать их в пределах функции ‘setColor’ с помощью следующей строки кода:

setColor(0x4B, 0x0, 0x82); // индиго

Для трех компонент мы используем запись, в которой перед каждой из них ставится символ ‘0x’ в начале.

Когда будете играться с разными оттенками RGB светодиода, не забывайте после использования каждого из них устанавливать задержку ‘delay’.

ШИМ и Arduino

Широтно импульсная модуляция (ШИМ (PWM на английском)) – это один из методов управления питанием. В нашем случае ШИМ используется для управления яркостью каждого отдельного светодиода.

На рисунке ниже схематично изображен сигнал с одного из ШИМ пинов Arduino.

ШИМ модуляция

Каждую 1/500 секунды ШИМ выход генерирует импульс. Длина этого импульса контролируется функцией ‘analogWrite’. То есть, ‘analogWrite(0)’ не будет генерировать никакого импульса, а ‘analogWrite(255)’ сгенерирует сигнал, который будет длится до самого начала следующего. То есть, будет создаваться впечатление, что подается один непрерывный импульс.

Когда в пределах функции analogWrite мы указываем значение в диапазоне от 0 до 255, мы генерируем импульс определенной длительности. Если длина импульса составляет 5%, мы подадим на указанный выход Arduino 5% от максимально доступного питания и создается впечатление, что светодиод горит не на максимальную яркость.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

Адресные светодиоды, модули NeoPixel

Trema-модуль NeoPixel — это 4 RGB-светодиода со встроенными драйверами в одном корпусе, установленные на одном модуле. Эти модули можно соединять в ленты NeoPixel, используя всего одну линию данных, а их «адресность» позволяет управлять цветом каждого светодиода на одной линии.

В этой статье речь пойдёт о модулях NeoPixel, построенных на адресных светодиодах WS2812B.

Видео:

Спецификация:

  • Входное напряжение питания модуля: 5 В
  • Ток потребляемый драйвером каждого светодиода: < 1 мкА
  • Ток потребляемый каждым светодиодом: < 45 мА (по 15 мА на полную яркость свечения каждого цвета светодиода)
  • Уровень логической «1» на входе IN: > 0,7 Vcc
  • Уровень логического «0» на входе IN: < 0,3 Vcc
  • Входная ёмкость: 15 пФ
  • Задержка передачи данных: < 300 нс
  • Время передачи одного бита данных: 1,25 мкс
  • Длительность импульса для передачи бита «1»: 900 нс (±150 нс)
  • Длительность импульса для передачи бита «0»: 350 нс (±150 нс)
  • Время простоя линии данных перед применением новых цветов > 50 мкс
  • Длина световой волны: 620 . 630 нм (для красного цвета)
  • Длина световой волны: 515 . 530 нм (для зелёного цвета)
  • Длина световой волны: 465 . 470 нм (для синего цвета)
  • Рабочая температура: -25 . 80 °C
  • Температура хранения: -55 . 150 °C
  • Габариты: 30х30х30 мм (с учётом колодки выводов)
  • Вес: 9 г

Все модули линейки "Trema" выполнены в одном формате

Подключение:

Модули NeoPixel подключаются входом (IN) к любому выводу Arduino.

Модуль удобно подключать 2 способами, в зависимости от ситуации:

Способ — 1 : Используя проводной шлейф и Piranha UNO

Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.

Способ — 2 : Используя проводной шлейф и Shield

Используя 3-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

При подключении нескольких модулей их можно соединить друг с другом (выход OUT каждого модуля со входом IN следующего), а вход IN первого модуля к любому выводу Arduino. Или подключить вход IN каждого модуля к своему выводу Arduino.

Подключение модуля NeoPixel к Arduino

Нумерация (адрес) светодиодов является сквозной и начинается от ближайшего к выводу Arduino. Например, если Вы подключили к одному выводу Arduino два модуля из 4 светодиодов, то первый светодиод первого модуля будет иметь адрес 0, а первый светодиод второго модуля будет иметь адрес 4.

Питание:

Входное напряжение 5 В постоянного тока, подаётся на выводы Vcc и GND модуля NeoPixel.

Подробнее о модуле:

Адресные светодиоды WS2812B это три светодиода RGB (Red — красный, Green — зелёный и Blue — синий) и драйвер (микросхема) для управления этими светодиодами, в одном SMD (Surface Mounted Device — прибор монтируемый поверхностно) корпусе.

Корпус каждого светодиода имеет 4 вывода: два вывода данных (IN — вход и OUT — выход) и два вывода питания (Vcc и GND). В модулях NeoPixel выходы (OUT) предыдущих светодиодов соединены со входами (IN) следующих создавая цепочку светодиодов. Но и сами модули NeoPixel также имеют 4 вывода: два вывода данных (IN, OUT) и два вывода питания (Vcc, GND), и модули также можно соединять в цепочку. Таким образом к одному выводу Arduino можно подключить «неограниченное» количество модулей NeoPixel.

Цвет каждого адресного светодиода задаётся 3 байтами (каждый байт указывает яркость одного цвета: 1-G, 2-R, 3-B). После того как первый адресный светодиод получил на вход (IN) первые 3 байта, он сохраняет их в своей ОЗУ, а остальные байты пропускает со входа (IN) на выход (OUT). Второй адресный светодиод сохранит в своей ОЗУ следующие 3 байта а остальные пропустит и т.д. Если в линию данных перестали поступать биты (на линии установлен уровень логического «0» дольше 50 мкс), светодиоды установят свои цвета. Каждый бит данных имеет длительность 1,25 мкс и состоит из импульса и паузы. Бит «0» отличается от бита «1» длительностью импульса: • бит «0» — импульс 350 нс, пауза 900 нс; • бит «1» — импульс 900 нс, пауза 350 нс.

Для работы с модулем предлагаем воспользоваться библиотекой iarduino_NeoPixel, которая позволяет работать с модулями NeoPixel если суммарное количество адресных светодиодов WS2812B не превышает 65534 шт.

Подробнее про установку библиотеки читайте в нашей инструкции..

Примеры:

Установка цвета для каждого из 4 светодиодов модуля NeoPixel:

Перелив всех цветов радуги на модуле NeoPixel из 4 светодиодов:

Данный пример может работать и с модулями на большее количество светодиодов, тогда Вам нужно указать их количество во второй строке скетча. Скорость перелива зависит от значения константы z, чем больше её значение, тем медленнее перелив.

RGB светодиоды и ленты

Я думаю все знают, что свет &#8211; это поток фотонов, но в то же время он является электромагнитной волной, излучением. Человеческий глаз воспринимает очень узкий диапазон этого излучения: приблизительно от 390 до 790 ТГц (террагерц), так называемое видимое излучение или видимый свет. &#8220;Ориентироваться&#8221; в этом диапазоне электромагнитного излучения принято в обратной величине &#8211; длине волны, измеряемой в данном случае в нанометрах (нм): человеческий глаз видит излучение в диапазоне от

400 нм (фиолетовый) до

800 нм (красный). Между синим и красным есть ещё один важный цвет &#8211; зелёный: Красный (Red, R), зелёный (Green, G) и синий (Blue, B) являются основными цветами: смешивая эти три цвета в разных пропорциях можно получить плюс-минус все остальные цвета. blank Этот наглядный &#8220;двухмерный&#8221; случай с кругами вы тоже скорее всего видели. Если раскручивать тему дальше, то можно задаться интенсивностью каждого цвета и получить итоговый цвет как функцию от трёх переменных, или же трёхмерное цветовое пространство RGB. Если интенсивности всех трёх цветов равны нулю &#8211; получится чёрный цвет, если все три максимальны &#8211; белый, а всё что между &#8211; оттенки: На картинке выше интенсивность каждого цвета представлена диапазоном 0-255. Знакомое число, не правда ли? Всё верно, в большинстве применений диапазон каждого цвета кодируется одним байтом, потому что это удобно с точки зрения программирования и достаточно с точки зрения глаза: три цвета &#8211; три байта &#8211; 256*256*256 == 16.8 миллионов оттенков. Да, именно эта цифра часто фигурирует в рекламах смартфонов и телевизоров, и именно столько оттенков мы можем абсолютно не напрягаясь получить при использовании Arduino и RGB светодиодов, о чём и поговорим в этом уроке.

RGB светодиоды

RGB светодиод представляет собой по сути три светодиода в одном корпусе. Чтобы не плодить лишние выводы, все аноды или катоды светодиодов объединяются и получается 4 контакта: R, G, B и общий. Общим может быть как минус-катод (Common Cathode), так и плюс-анод (Common Anode): Также на этой картинке показана распиновка типичного RGB светодиода: самая длинная нога &#8211; общий вывод, крайняя рядом с ней &#8211; красный, с другой стороны зелёный дальняя крайняя &#8211; синий. К Arduino такой светодиод подключается точно так же, как если бы мы подключали три отдельных светодиода (читай предыдущий урок про светодиоды): на каждый цвет нужен токоограничивающий резистор, а общую ногу нужно подключать в зависимости от того, анод она или катод. blank Можно управлять каждым цветом точно так же, как если бы это были отдельные светодиоды. Также не забываем про подключение: если у светодиода общий катод, то высокий сигнал ( digitalWrite(pin, HIGH); ) с управляющих пинов будет включать выбранный цвет, а если общий анод &#8211; то выключать. Соответственно плавное управление яркостью при помощи ШИМ работает по той же логике: у общего катода analogWrite(pin, 200); включит цвет почти на полную яркость, а у общего анода &#8211; почти полностью погасит. RGB светодиоды можно дёшево найти на Aliexpress, а именно:

В качестве магазина рекомендую CHANZON, самые хорошие светодиоды и чипы/матрицы.

RGB ленты

blank

RGB светодиодные ленты устроены аналогично одноцветным лентам и RGB светодиодам: в 12 Вольтовой ленте светодиоды каждого цвета соединяются по три штуки с токоограничивающим резистором и образуют сегмент ленты, далее эти сегменты подключаются параллельно. Также лента имеет общий вывод со всех цветов, в большинстве случаев это общий анод. Почему? Помните, в уроке про управление нагрузкой я говорил, что чаще всего используют N-канальные полевые транзисторы, потому что они дешевле, удобнее в применении и имеют более удачные характеристики? Вот именно поэтому! Драйверы для RGB лент также делают на основе N-канальников, поэтому найти в продаже ленту с общим катодом даже вряд-ли получится. В качестве магазина на aliexpress рекомендую BTF Lighting , самые качественные ленты. Итак, как нам подключить RGB светодиодную ленту к Arduino? Точно так же, как обычную! Но тут я добавлю ещё несколько интересных вариантов.

MOSFET

Нам понадобятся три полевых транзистора и резисторы им в обвязку (почему и зачем &#8211; читай в уроке про управление нагрузкой). Подключается всё вот по такой схеме: blank Если нужно плавное управление яркостью цветов &#8211; подключаем к ШИМ пинам, если просто вкл/выкл &#8211; можно к обычным. Свой драйвер на плате можно развести примерно вот так (корпуса D-pak):

LED Amplifier

У китайцев есть готовые драйверы для &#8220;усиления&#8221; сигнала на RGB ленту, по сути те же три транзистора что выше, но всё красивое и готовое. Подключается следующим образом:

blank

Драйвер Н-моста

Ну и экзотический вариант: использовать полномостовой драйвер для моторов. Почему нет? Количество выходов у таких драйверов всегда кратно двум (для подключения одного мотора), так что это отличный вариант для управления также RGBW лентой. Драйверы можно найти на aliexpress по названию.

blank

blank

blank

Программирование

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

Библиотека GRGB

  • Поддержка драйверов с общим анодом и общим катодом
  • Настройка яркости
  • Гамма-коррекция яркости (квадратный CRT)
  • Библиотека может не привязываться к пинам и просто генерировать значения 8 бит
  • Быстрые оптимизированные целочисленные вычисления (не везде)
  • Плавный переход между любыми цветами (не блокирует выполнение кода)
  • Установка цвета разными способами:
  • RGB
  • HSV
  • Быстрый HSV
  • Цветовое колесо (1530 значений)
  • Цветовое колесо (255 значений)
  • Теплота (1000-40000К)
  • HEX цвета 24 бита
  • HEX цвета 16 бит
  • 17 предустановленных цветов

Например плавная смена цвета по спектру будет выглядеть вот так:

В рамках этого урока мы рассмотрим некоторые алгоритмы, потому что это интересно и может пригодиться где-то ещё.

Хранение цвета

Что касается хранения цветовой информации, то это могут быть как три отдельных байта byte r, g, b; , так и более крупный тип данных, например так: long color; . Во втором случае цвет принято записывать в HEX представлении: красный, зелёный и синий байты идут друг за другом 0xRRGGBB . Напомню, что один байт в 16-ричном представлении может иметь значение от 0x00 (0) до 0xFF (255). Таким образом например цвет 0xBBA000 &#8211; жёлтый средней яркости ( 0xBB красный, 0xA0 зелёный, 0x0 синий). Такое представление чаще всего встречается в веб-разработке, при работе с микроконтроллером удобнее хранить цвет в байтах. Вот так можно конвертировать цвет из HEX в байты и наоборот:

Может пригодиться при связке Arduino и веба.

Включение цветов

Как я уже писал выше, включение того или иного цвета производится точно так же, как в уроке про обычные светодиоды. Для плавного управления яркостью используется ШИМ сигнал.

Для плавного управления цветом можно использовать потенциометры:

Цветовое колесо

blank

Первый очевидный эффект &#8211; плавное перетекание одного цвета в другой. Это можно сделать линейно, вот таким образом: Реализовать это можно просто через условия. Продолжим предыдущий пример:

Пространство HSV

blank

Следующий вариант более интересен тем, что помимо цвета позволяет настроить его яркость и насыщенность. Такая цветовая модель называется HSV &#8211; (Hue, Saturation, Value), или (Цвет, Насыщенность, Яркость), в этом цветовом пространстве гораздо удобнее выбирать нужный цвет. Представить его можно цилиндром: Светодиод и лента работают в пространстве RGB, HSV цвет нужно конвертировать в RGB для включения соответствующих каналов цвета. В подробности работы алгоритма вдаваться не будем, тем более что существует много разных вариантов его реализации, можно найти их в интернете по запросу HSV to RGB C++. Вот один из них, который использую я:

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

Подключение большого количества RGB

У меня на сайте есть статья, где рассказано об алгоритме динамической индикации RGB светодиодов. Она позволяет подключить несколько RGB светодиодов или лент с возможностью изменения цвета.

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

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