Відтворення кольорів за допомогою RGB-світлодіоду

Автор Атамась Артем
Науковий співробітник НЦ "Мала академія наук України", кандидат технічних наук. Сфера наукових інтересів: розвиток технологій наукової освіти.

Завдання роботи:

Налаштувати платформу Arduino для зчитування та відтворення кольорів.

Обладнання:

– платформа Arduino UNO;

– модуль RGB-світлодіоду;

– розсіювач світла;

– датчик кольору ISL29125;

– макетна плата;

– з’єднувальні провідники;

– кабель USB Type A-Type B;

– кольорові картки;

– ПК.

Теоретична частина

Рисунок 1 – Загальний вигляд обладнання

Система RGB (Red, Green, Blue) – це головна колірна модель електронної техніки, яка формує зображення на екранах моніторів, телевізорів, смартфонів і планшетів. Вона базується на змішуванні світлових променів трьох основних кольорів: червоного, зеленого та синього у різних пропорціях, що дозволяє створювати величезну кількість відтінків.

В даній роботі пропонується здійснити відтворення кольорів, які зчитуються датчиком ISL29125 (рис. 2) за допомогою модуля RGB-світлодіоду (рис. 3).

Рисунок 2 – Датчик кольору ISL29125

ISL29125 – це цифровий датчик кольору та освітленості (RGB) з низьким енергоспоживанням та інтегрованим інфрачервоним (ІЧ) фільтром. Він вимірює інтенсивність червоного, зеленого та синього спектрів видимого світла. Отримані дані передаються через інтерфейс I2C. Основні характеристики датчику:

  • Робоча напруга: 2,25…3,63 В (типова – 3,3 В);
  • Споживаний струм: 56 мкА в робочому режимі та 0,5 мкА в режимі сну;
  • Роздільна здатність АЦП: 16 біт;
  • Інтерфейс зв’язку: I2C;
  • Діапазони вимірювань: 0,0057…375 Лк та 0,152…10 000 Лк.
  • Придушення завад: апаратно блокує ІЧ випромінювання та фільтрує мерехтіння штучного світла частотою 50 Гц / 60 Гц.

Призначення виводів (Pinout) модуля:

  • 3V – живлення датчика (3,3 В);
  • GND – загальний провід;
  • SDA – лінія даних шини I²C.
  • SCL – лінія тактування шини I²C.
  • INT – вивід переривання (Interrupt). Використовується за бажанням для сповіщення мікроконтролера про те, що рівень освітлення досяг заданого порогу.

RGB світлодіод – це електронний компонент, який об’єднує в одному корпусі три окремі світлодіоди: червоний (Red), зелений (Green) та синій (Blue). Керуючи яскравістю кожного кристала, можна змішувати їх і отримувати величезну кількість різних відтінків кольорів, включно зі звичайним білим світлом.

В даній роботі буде використовуватися модуль RGB-світлодіоду з загальним катодом, зовнішній вигляд та схема якого представлені на рис. 3.

 

Рисунок 3 – Зовнішній вигляд та схема модуля RGB-світлодіоду

Основні характеристики світлодіоду представлені у таблиці 1.

Таблиця 1 – Основні характеристики світлодіода

Максимальний струм, мА

20

Падіння напруги на кристалі R (625 нм), В

1,75

Падіння напруги на кристалі G (520 нм), В

2,2

Падіння напруги на кристалі B (465 нм), В

2,45

Інтенсивність випромінювання R (625 нм), мкд

1200

Інтенсивність випромінювання G (520 нм), мкд

2000

Інтенсивність випромінювання B (465 нм), мкд

1200

Кут випромінювання

30º

 

З таблиці 1 видно, що кристали RGB-світлодіоду мають різні падіння напруги та інтенсивності випромінювання. Очевидно, що для відтворення того чи іншого відтінку ці обставини треба враховувати.

Струм кожного кристалу RGB-світлодіоду приблизно можна визначити за формулою:

                                                              (1)

де U – напруга джерела живлення, В;

UVD (X) – пряме падіння напруги на конкретному кристалі, В;

R(X) – опір обмежувального резистора, Ом.

З таблиці 1 видно, що для даного світлодіоду найменше падіння напруги має червоний кристал, а найбільше синій. Опори обмежувальних резисторів є однаковими, та дорівнюють 470 Ом (рис. 3). Отже, якщо ми прикладемо до всіх кристалів однакову напругу, то струм червоного кристалу буде найбільшим, а синього найменшим. Для того щоб вирівняти струми треба обмежити споживання червоного й зеленого кристалу. Коефіцієнти обмеження струму за умови, що опори обмежувальних резисторів R1, R2, R3 однакові, можна визначити за формулою:

                                                        (2)

де UVD (max) – максимальне з трьох значень прямого падіння напруги кристалі, В.

Для врахування різниці в інтенсивності випромінювання за однакового струму скористаємося аналогічним підходом. Для того щоб вирівняти інтенсивність світла треба обмежити споживання струму кристалів з найбільшою інтенсивністю. Коефіцієнти обмеження струму можна визначити за формулою:

                                                             (3)

де Е(min) – мінімальне з трьох значень інтенсивності випромінювання кристалу, В.

Загальний коефіцієнт обмеження струму визначається за формулою:

                                                     (4)

Датчик кольору та модуль RGB-світлодіоду пропонується підключати до платформи Arduino UNO.

Arduino – це сімейство платформ для швидкої розробки електронних пристроїв, що відрізняється зручністю та відносно простою мовою програмування. Програмування здійснюється через USB порт ПК без застосування програматорів. Для програмування Arduino використовується програмне забезпечення Arduino IDE. На базі Arduino можна збирати сумісні між собою електронні і механічні компоненти в єдиний пристрій, а потім через звичайний комп’ютер запрограмувати поведінку цих складових, як потрібно.

На рисунку 4 зображено зовнішній вигляд плати Arduino UNO.

Плата Arduino UNO побудована на базі мікроконтролера ATmega328P. До її складу входить все необхідне для зручної роботи з мікроконтролером: 14 цифрових входів/виходів (з них 6 можуть використовуватися в якості ШІМ-виходів), 6 аналогових входів, кварцовий резонатор на 16 МГц, роз’єм USB, додатковий роз’єм живлення, роз’єм для програмування всередині схеми (ICSP) і кнопка скидання. Для початку роботи з пристроєм досить просто подати живлення від AC/DC-адаптера або батарейки, або підключити його до комп’ютера за допомогою USB-кабелю.

Рисунок 4 – Плата Arduino UNO

Програма Arduino IDE, доступна для скачування на офіційному сайті Arduino, є безкоштовною. На рисунку 5 зображено робоче вікно програми, в якому здійснюється написання програми для плати Arduino.

Рисунок 5 – Вікно програми Arduino IDE

Програму в Arduino IDE, яка вже готова до роботи з платою, називають скетчем. Після того як програма складена вона завантажується (прошивається) на плату. Для програмування Arduino використовується USB-кабель. Відразу після завантаження програма готова виконувати різні команди. Для завантаження програми на плату у вікні програми треба натиснути кнопку  «Завантаження». Після завантаження програми і від’єднання USB-кабелю від ПК, програма лишається збереженою на платі Arduino і починає працювати при подачі живлення на плату без ПК.

Схема підключення датчику кольору та модуля RGB-світлодіоду до Arduino UNO представлена на рис. 6.

Рисунок 6 – Схема підключення датчику кольору та  RGB-модуля до Arduino UNO

Контакти SDA та SCL датчику кольору підключаються до контактів А4 та А5 Arduino UNO, які можуть виконувати функцію аналогових входів та ліній шини I²C.

Модуль RGB-світлодіоду підключається до цифрових входів-виходів 9, 10 та 11, які можуть здійснювати широтно-імпульсну модуляцію (ШІМ), та керувати в такий спосіб струмом, що проходить через кожний кристал світлодіоду.

Принцип ШІМ, або PWM (pulse-width modulation) полягає в наступному (рис. 7). Електричне навантаження, яким у нашому випадку є світлодіод VD з обмежувальним резистором R, живиться не постійним, а пульсуючим струмом. Період повторення імпульсів Т, а відповідно й частота, є постійними, а тривалість τ – змінною. Чим більше значення τ, тим більший загальний струм буде проходити через навантаження. Частота імпульсів ШІМ знаходиться в межах від одного до декількох десятків кГц, тому людське око не бачить пульсацій світіння.

Рисунок 7 – Принцип ШІМ для керування інтенсивністю світіння світлодіоду

Хід роботи

  1. За формулами (2), (3) та (4) розрахуйте коефіцієнти обмеження струму та занесіть їх значення до таблиці 2.

Таблиця 2 – Коефіцієнти обмеження струму

Кристал

kU kE kI

R

G

B

  1. Підключить датчик кольору та модуль RGB-світлодіоду до Arduino UNO у відповідності до схеми на рис. 6, а також рис. 1.
  2. Встановіть на корпус світлодіоду розсіювач світла (рис. 1).
  3. Перш ніж написати програмний код до робочого вікна програми треба встановити, або перевірити наявність наступних бібліотек:

– Wire.h;

– SparkFun ISL29125.h.

Для встановлення бібліотек скористайтеся меню Tools – Manage libraries. У вікні що з’явиться за допомогою інструменту пошуку знайдіть і встановіть дані бібліотеки. ПК при цьому має бути підключеним до мережі Інтернет.

  1. Скопіюйте та вставте до робочого вікна програми Arduino IDE наступний скетч (коментарі до команд не вплинуть на роботу програми, оскільки відділені від команд символом «//»):

 

#include <Wire.h>

#include <SparkFunISL29125.h>

SFE_ISL29125 rgbSensor;

// PWM pins

const byte PIN_RED   = 9;

const byte PIN_GREEN = 10;

const byte PIN_BLUE  = 11;

// Коефіцієнти обмеження струму: 0.0 … 1.0

float redCorrection   = 1.0;

float greenCorrection = 1.0;

float blueCorrection  = 1.0;

// Загальна яскравість

float brightness = 3.0;

// Коефіцієнт фільтрації

const float filterK = 0.1;

// Змінні для збереження попередніх значень ШІМ (потрібні для фільтра)

float filteredRed   = 0;

float filteredGreen = 0;

float filteredBlue  = 0;

// Таблиця гамма-корекції (gamma = 2.2). Гамма-корекція — це нелінійне

// коригування сигналу (ШІМ) для кожного кристалу RGB-світлодіода, яке компенсує

// чутливість людського ока для отримання візуально плавної зміни яскравості та

// правильного змішування кольорів.

const byte gammaTable[] PROGMEM = {

0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,

1,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,   3,   3,

3,   3,   4,   4,   4,   4,   5,   5,   5,   5,   6,   6,   6,   7,   7,   7,

8,   8,   8,   9,   9,   9,  10,  10,  11,  11,  11,  12,  12,  13,  13,  14,

14,  15,  15,  16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  22,  22,

23,  23,  24,  25,  25,  26,  27,  27,  28,  29,  29,  30,  31,  32,  32,  33,

34,  35,  35,  36,  37,  38,  39,  39,  40,  41,  42,  43,  44,  45,  46,  46,

47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,

63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  75,  76,  77,  78,  79,

80,  82,  83,  84,  85,  87,  88,  89,  91,  92,  93,  95,  96,  97,  99, 100,

101, 103, 104, 106, 107, 109, 110, 112, 113, 115, 116, 118, 119, 121, 122, 124,

126, 127, 129, 131, 132, 134, 136, 137, 139, 141, 143, 144, 146, 148, 150, 152,

153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183,

185, 187, 189, 191, 193, 195, 197, 199, 202, 204, 206, 208, 210, 213, 215, 217,

219, 222, 224, 226, 229, 231, 233, 236, 238, 241, 243, 245, 248, 250, 253, 255

};

void setup()

{

pinMode(PIN_RED, OUTPUT);

pinMode(PIN_GREEN, OUTPUT);

pinMode(PIN_BLUE, OUTPUT);

Wire.begin();

if (!rgbSensor.init())

{

while (1);

}

rgbSensor.config(CFG1_MODE_RGB, CFG1_10KLUX, CFG1_16BIT);

}

void loop()

{

// 1. Читання сирих даних (0 – 65535)

uint16_t redRaw   = rgbSensor.readRed();

uint16_t greenRaw = rgbSensor.readGreen();

uint16_t blueRaw  = rgbSensor.readBlue();

// 2. Конвертація 16-bit -> 8-bit PWM

int redPWM   = map(redRaw,   0, 65535, 0, 255);

int greenPWM = map(greenRaw, 0, 65535, 0, 255);

int bluePWM  = map(blueRaw,  0, 65535, 0, 255);

// 3. Застосування коефіцієнтів корекції

redPWM   *= redCorrection   * brightness;

greenPWM *= greenCorrection * brightness;

bluePWM  *= blueCorrection  * brightness;

// 4. Обмеження значень перед фільтрацією

redPWM   = constrain(redPWM,   0, 255);

greenPWM = constrain(greenPWM, 0, 255);

bluePWM  = constrain(bluePWM,  0, 255);

// 5. Цифровий фільтр (Експоненційне згладжування)

// Прибирає різкі короткочасні спалахи при піднесенні датчику до об’єктів

filteredRed   = (redPWM   * filterK) + (filteredRed   * (1.0 – filterK));

filteredGreen = (greenPWM * filterK) + (filteredGreen * (1.0 – filterK));

filteredBlue  = (bluePWM  * filterK) + (filteredBlue  * (1.0 – filterK));

// 6. Гамма-корекція відфільтрованих значень

int outRed   = pgm_read_byte(&gammaTable[(int)filteredRed]);

int outGreen = pgm_read_byte(&gammaTable[(int)filteredGreen]);

int outBlue  = pgm_read_byte(&gammaTable[(int)filteredBlue]);

// 7. Вивід на ШІМ-піни

analogWrite(PIN_RED,   outRed);

analogWrite(PIN_GREEN, outGreen);

analogWrite(PIN_BLUE,  outBlue);

delay(10);

}

  1. За допомогою USB кабелю під’єднайте плату Arduino до ПК.
  2. В меню Tools – Board оберіть Arduino UNO.
  3. В меню Tools – Port оберіть порт, якій відповідає обраній платі.
  4. Натисніть кнопку «Завантаження» та дочекайтеся завершення процесу.
  5. Підносьте під датчик кольору картки з кольорового паперу. Оцініть, наскільки точно (чи не точно) ці кольори відтворюються RGB-світлодіодом.
  6. Введіть до програмного коду отримані у пункті 1 коефіцієнти обмеження струму kI(X) замість одиниць (рис. 8).

Рисунок 8 – Фрагмент програмного коду, до якого вводяться коефіцієнти обмеження струму.

  1. Завантажте виправлений програмний код на Arduino, та повторіть пункт 10.
  2. Здійсніть налаштування загальної яскравості та кінцеве налаштування кольорів за вашим сприйняттям. Для цього окрім кольорових карток зручно використовувати білий аркуш паперу.

Аналіз даних

Зробіть висновки щодо необхідності коригування струмів кристалів RGB-світлодіоду для правильного відтворення кольорів.