Перейти к содержанию
Клуб помидороводов - tomat-pomidor.com


  • записей
    6
  • комментарий
    1
  • просмотров
    345

RGB датчик цвета на TCS3472


feniсs

147 просмотров

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

Датчик подсвечивает белыми светодиодами исследуемый объект , а отраженный от него свет уже обрабатывает фотоматрица , которая состоит из красного, зеленого, синего и прозрачного фотодиода

Вся матрица закрыты ИК-фильтром, которая минимизирует влияние ИК-излучения на показания

Лет 8 назад игрался с подобной игрушкой , но на другом модуле (TCS3200) , но сейчас он уже антикваром можно сказать стал и цена на него неадекватно выросла , так что для новых игр возьмем датчик посвежее - TCS3472

Чтоб игрушка оказалась повеселей добавил в нее еще люксметр , в принципе и с 3472 матрицы можно затребовать данные об освещенности , но там эта функция как-то в кривых попугаях дает ответ:sad:

Комплектация :

Arduino nano

HD44780 2004 + модуль посл.интерфейса

TCS3472

BH1750

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

TCS3472.thumb.JPG.f28307b5db9edbe7afa665be182207ab.JPG

Светодиоды с модуля 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

Но это ориентировочные цифры , возможно где в документации они прописаны точно

1148743194_-3472.thumb.JPG.403191eb7374ba5a5dfb897c1b6e0676.JPG

Вот сборка на макете под холодным освещением в комнате , синий , зеленый по 40% , красному лишь 20% остается

608596465_4372.thumb.JPG.bae63d559718376c3aca886cfd75a1d9.JPG а это уже под теплым светодиодом при выключенном общем свете , здесь картина сменилась , на красный приходится 50% , синему лишь 20% осталось

2054034676_4372.thumb.JPG.7dd022f7f02e01f35baa701b64b7da3e.JPG а вот полноспектральный диод , зеленый канал подавлен , всего 13% , красный , синий примерно поровну
По моноцветам уберу картинки под спойлер :

Спойлер

 

1273338771_4372365.thumb.JPG.912be68b4a669832be5358d2eeaa5c6a.JPG УФ 365нм , в основном пробивается в синий канал

1090039792_4372.thumb.JPG.8068c5e8eeffe6791e9efd40560ad74f.JPG фиолетовый , оба датчика более чем на порядок встрепенулись относительно УФ

505285334_4372.thumb.JPG.a4ca0a87ee46cedccfd6953805692ed1.JPG Синий , синий канал прям взбесился , зеленому хорошо перепадает , а красный практически закрыт

Да и люксметр его не жалует

978624764_4372.thumb.JPG.0533ca86a9dd8e4f8e7220105017f9e3.JPG зеленый , всем сестрам по серьгам (окромя красной падчерицы ) , особенно люксметр захлебывается от счастья

449095250_4372.thumb.JPG.5a0cbf2ce87004095ea421fb32484669.JPG  желтый , люксметр чуток подостыл , красный балдеет , зато синий начинает сосать лапу

906527030_4372620.thumb.JPG.7624388194a8f3a9df60058160f5bdff.JPG красный 620-630нм , красный все на себя взял , другим крохи

998403484_4372660.thumb.JPG.b77692db52e693be311663806c05b10e.JPG красный 660нм , вроде по смыслу еще сильней должен отсечь зеленый , синий , но тут обратная тенденция просматривается , похоже из-за близости излучения к ИК , там у фотодатчиков какой-то психоз случается (физику процесса не знаю), не зря они его основательно от ИК фильрами защищают

220223312_4372730.thumb.JPG.79662a0fe0d1b981c4b5fc703607e57e.JPG и ближний ИК 730нм , люксметр почти заткнулся , а зеленый , синий потекли

11.thumb.JPG.39192bb5bb84eb89411a9d8516abc8d2.JPG чуть ближе поднес диод к 4372 матрице , и защита пала , все три канала взбесились , на люксметр можно не смотреть , на него свет не попадает

 

 

Изменено пользователем feniсs

0 Комментариев


Рекомендуемые комментарии

Комментариев нет

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...