RGB датчик цвета на TCS3472
Есть несколько модулей распознавания цвета , изначально их предназначение определять цвет предмета вблизи датчика
Датчик подсвечивает белыми светодиодами исследуемый объект , а отраженный от него свет уже обрабатывает фотоматрица , которая состоит из красного, зеленого, синего и прозрачного фотодиода
Вся матрица закрыты ИК-фильтром, которая минимизирует влияние ИК-излучения на показания
Лет 8 назад игрался с подобной игрушкой , но на другом модуле (TCS3200) , но сейчас он уже антикваром можно сказать стал и цена на него неадекватно выросла , так что для новых игр возьмем датчик посвежее - TCS3472
Чтоб игрушка оказалась повеселей добавил в нее еще люксметр , в принципе и с 3472 матрицы можно затребовать данные об освещенности , но там эта функция как-то в кривых попугаях дает ответ
Комплектация :
Arduino nano
HD44780 2004 + модуль посл.интерфейса
TCS3472
BH1750
Схема подключения :
Светодиоды с модуля TCS3472 выкидываются , нас не цвет детских кубиков интересует , интересно в упрощенном виде , через пропорции RGB , определять спектр источника света
Программа (скетч) :
#include <Wire.h>
#include <LiquidCrystal_I2C.h>//библиотека под LCD
LiquidCrystal_I2C lcd(0x27,20,4);//прописываем свой LCD дисплей по адресу 27 или 3F и его знакоместам
#include "Adafruit_TCS34725.h"//библиотека датчика цвета
// Инициализация модуля с установками времени интеграции и усиления
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);//усиление 1,4,16,60 время 24,50,101,154
#include <BH1750FVI.h>//библиотека датчика освещенности
BH1750FVI Oko;
void setup()
{
lcd.init();// Инициализация lcd дисплея
lcd.backlight();// Включение подсветки дисплея
tcs.begin();
Oko.begin();
Oko.SetAddress(Device_Address_L);
Oko.SetMode(Continuous_L_resolution_Mode);
}
void loop()
{
uint16_t r, g, b, c, colorTemp, lux;//можно оставить только первых три параметра
// Получение данных о цвете с модуля
tcs.getRawData(&r, &g, &b, &c);// "с" уровень белого- банально сумма RGB
//colorTemp = tcs.calculateColorTemperature(r, g, b);// Расчет температуры цвета-полная туфтень
//lux = tcs.calculateLux(r, g, b);//уровень освещенности - не освещенность как таковая , а пропорциональная величина в зависимость от усиления и экспозиции
float s=r+g+b;
float rr=(r/s);//доля красного
float gg=(g/s);//доля зеленого
float bb=(b/s);//доля синего
uint16_t X = Oko.GetLightIntensity();//опрос датчика BH1750
lcd.setCursor(0, 0);
lcd.print("Kanal-R");
lcd.setCursor(8, 0);
lcd.print(" "); //3 знакоместа затир
lcd.setCursor(8, 0);
lcd.print(rr*100,0);lcd.print("%");
lcd.setCursor(14, 0);
lcd.print(" "); //5 знакомест затир
lcd.setCursor(14, 0);
lcd.print(r);
lcd.setCursor(0, 1);
lcd.print("Kanal-G");
lcd.setCursor(8, 1);
lcd.print(" "); //3 знакоместа затир
lcd.setCursor(8, 1);
lcd.print(gg*100,0);lcd.print("%");
lcd.setCursor(14, 1);
lcd.print(" "); //5 знакомест затир
lcd.setCursor(14, 1);
lcd.print(g);
lcd.setCursor(0, 2);
lcd.print("Kanal-B");
lcd.setCursor(8, 2);
lcd.print(" "); //3 знакоместа затир
lcd.setCursor(8, 2);
lcd.print(bb*100,0);lcd.print("%");
lcd.setCursor(14, 2);
lcd.print(" "); //5 знакомест затир
lcd.setCursor(14, 2);
lcd.print(b);
lcd.setCursor(0, 3);
lcd.print("Light");
lcd.setCursor(8, 3);
lcd.print(" "); //8 знакомест затир
lcd.setCursor(8, 3);
lcd.print(X);lcd.print("Lux");
delay(1000);
}
Датчик много чего нам вещает , но я беру в расчет лишь уровень сигнала по цветам R G B , в наличии в матрице "белого" фотодиода я что-то усомнился , значение С у них практически равно R+G+B , ну не будет на практике такого , за освещенность , вернее ее уровень они среднеарифметическое R G B выдают
А с тепловой температурой - это вообще цирк с конями , нам такого не надоть
Погонял датчик в разных режимах , по времени интегрирования выставляются значения 24 , 50 , 101 , 154 мсек. , заявлялся еще режим 700мсек. , но компилятор его отвергает , возможно он просто в библиотеке не прописан
По усилению допустимые параметры 1 , 4 , 16 , 60 - все проходят
Цифры , что выдает датчик по цветовым каналам не совсем попугайные сумма R+G+B в самом деле пропорциональна реальной освещенности , но только при источниках света близкого к белому
Для самого тупого режима (24мс 1х) примерная освещенность =(R+G+B)*3,4 , а для самого чувствительного (154мс 60х) осв.=(R+G+B)*0,009
Но это ориентировочные цифры , возможно где в документации они прописаны точно
Вот сборка на макете под холодным освещением в комнате , синий , зеленый по 40% , красному лишь 20% остается
а это уже под теплым светодиодом при выключенном общем свете , здесь картина сменилась , на красный приходится 50% , синему лишь 20% осталось
а вот полноспектральный диод , зеленый канал подавлен , всего 13% , красный , синий примерно поровну
По моноцветам уберу картинки под спойлер :
УФ 365нм , в основном пробивается в синий канал
фиолетовый , оба датчика более чем на порядок встрепенулись относительно УФ
Синий , синий канал прям взбесился , зеленому хорошо перепадает , а красный практически закрыт
Да и люксметр его не жалует
зеленый , всем сестрам по серьгам (окромя красной падчерицы ) , особенно люксметр захлебывается от счастья
желтый , люксметр чуток подостыл , красный балдеет , зато синий начинает сосать лапу
красный 620-630нм , красный все на себя взял , другим крохи
красный 660нм , вроде по смыслу еще сильней должен отсечь зеленый , синий , но тут обратная тенденция просматривается , похоже из-за близости излучения к ИК , там у фотодатчиков какой-то психоз случается (физику процесса не знаю), не зря они его основательно от ИК фильрами защищают
и ближний ИК 730нм , люксметр почти заткнулся , а зеленый , синий потекли
чуть ближе поднес диод к 4372 матрице , и защита пала , все три канала взбесились , на люксметр можно не смотреть , на него свет не попадает
Изменено пользователем feniсs
Перейти к содержанию
0 Комментариев
Рекомендуемые комментарии
Комментариев нет
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти