Требуются точные значения цвета RGB с помощью датчика цвета tcs3200 RGB

Я использовал датчик TCS3200 для считывания значений цвета RGB.Сначала я откалибровал датчик с помощью белого и черного цветов.Датчик правильно распознает красный, синий и зеленый цвета, но не выдает точного значения.Например, зеленый цвет равен 105 190 150 вместо 0 255 0 . Я должен распознать коричневую медь со значением RGB 138 73 49. Но, похоже, я не могу распознать этот цвет с помощью этого метода.Я буду благодарен, если вы сможете направлять меня.

#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
int redPW = 0 ;
int greenPW = 0 ;
int bluePW = 0 ;

void setup() {
  // Установить S0 - S3 в качестве вывода
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensorOut, INPUT);
  
  // Настройка частоты -масштабирование до 20%
  digitalWrite(S0,HIGH);
  digitalWrite(S1,LOW);
  
  Serial.begin(9600);

}

void loop() {

// Калибровочные значения
int redMin=40;// Красное минимальное значение
int redMax=470;// 346 Красное максимальное значение
int greenMin=40;// Зеленое минимальное значение
int greenMax=510;// 348 Зеленое максимальное значение
int blueMin=30;// Синее минимальное значение
int blueMax=390;// 262 Максимальное значение синего цвета

int redValue;
int greenValue;
int blueValue;

//Считывание красного значения ширины импульса
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Считайте ширину выходного импульса
redPW = pulseIn(sensorOut,LOW);
redValue=map(redPW, redMin,redMax,255,0);
delay(200);

// Считывание зеленой ширины импульса
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Считайте ширину выходного импульса
greenPW = pulseIn(sensorOut,LOW);
greenValue=map(greenPW, greenMin,greenMax,255,0);
delay(200);

// Считывание синей ширины импульса
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Считайте ширину выходного импульса
bluePW = pulseIn(sensorOut,LOW);
blueValue=map(bluePW, blueMin,blueMax,255,0);
delay(200);

// Вывод на последовательный монитор
Serial.print("redValue = ");
Serial.print(redValue);
Serial.print(" - greenValue = ");
Serial.print(greenValue);
Serial.print(" - blueValue = ");
Serial.println(blueValue);

}

, 👍1

Обсуждение

Я не уверен, что действительно понял ваш вопрос, но похоже, что вы хотите преобразовать RGB в HSV и сравнить оттенок с оттенком вашей цели, в основном независимо от значения и, возможно, в некоторой степени насыщенности., @timemage

Как вы выполняете калибровку? Спектр источника света имеет важное значение для калибровки! Это зеленый светодиод?, @Sim Son

Кстати, вы обратили внимание на спектральную чувствительность датчика на странице 5? Ваши показания звучат разумно для зеленого светодиода..., @Sim Son

Как именно вы калибруете датчик цвета, используя только белый и черный цвета?, @chrisl


1 ответ


1

Как я уже сказал, вы ДОЛЖНЫ либо

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

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

,