Как определить цвет с помощью Arduino и TCS230/TCS3200
В этом примере будет показано, как определять цвета с помощью Arduino и датчика цвета TCS230 / TCS3200.

Датчик TCS3200 может определять широкий спектр цветов в зависимости от их длины волны. Этот датчик особенно полезен для проектов распознавания цветов, таких как подбор цветов, сортировка цветов, чтение тест-полосок и многое другое.
Модуль датчика цвета TCS3200, показанный на рисунке ниже, использует RGB-датчик TAOS TCS3200 для определения цвета. Он также содержит четыре белых светодиода, которые освещают объект перед ним. Рабочее напряжение датчика составляет от 2,7 В до 5,5 В.

TCS3200 имеет массив фотодиодов с 4 различными фильтрами. Фотодиод – это просто полупроводниковое устройство, которое преобразует свет в ток. Датчик имеет 16 фотодиодов с красным фильтром (чувствительны к длине волны красного цвета), 16 фотодиодов с зеленым фильтром (чувствительны к длине волны зеленого цвета), 16 фотодиодов с синим фильтром (чувствительны к длине волны синего цвета) и 16 фотодиодов без фильтра. Если вы внимательно посмотрите на чип TCS3200, вы можете увидеть различные фильтры.

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

Распиновка датчика цвета показана на следующем рисунке.

Здесь OE (3) – активирует выходную частоту (при низком уровне), OUT (6) – выходной сигнал частоты, S0, S1 (1,2) – входы выбора масштабирования выходной частоты, S2, S3 (7,8) – входы выбора типа фотодиода.
Чтобы выбрать цвет, считываемый фотодиодом, используйте управляющие контакты S2 и S3. Поскольку фотодиоды подключены параллельно, настройка S2 и S3 в LOW (низкий уровень сигнала) и HIGH (высокий уровень сигнала) в разных комбинациях позволяет выбирать разные фотодиоды: красный (S2, S3: LOW, LOW), синий (S2, S3: LOW, HIGH), без фильтров (S2, S3: HIGH, LOW), зеленый (S2, S3: HIGH, HIGH).
Контакты S0 и S1 используются для масштабирования выходной частоты. Ее можно масштабировать до следующих предустановленных значений: 100%, 20% или 2%. Масштабирование выходной частоты полезно для оптимизации показаний датчиков для различных частотных счетчиков или микроконтроллеров: отключение питания (S0, S1: LOW, LOW), 2% (S0, S1: LOW, HIGH), 20% (S0, S1: HIGH, LOW), 100% (S0, S1: HIGH, HIGH). Для Arduino обычно используется частотное масштабирование 20%.
В этом примере мы собираемся обнаруживать цвета с помощью Arduino и датчика цвета TCSP3200. Этот датчик не очень точный, но отлично работает для определения цветов в простых проектах. Подключить датчик TCSP3200 к Arduino довольно просто, схема подключения Arduino и TCSP3200 показана далее.

Код довольно простой и хорошо комментирован, поэтому разобраться в нем не составит особых хлопот.
// Контакты подключения TCS230 или TCS3200 к Arduino
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
// Хранение частоты считывания фотодиодов
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
void setup() {
// Настройка выходов
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// Установка sensorOut в качестве входа
pinMode(sensorOut, INPUT);
// Установка масштабирования частоты на 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
// Запускаем связь по последовательному порту
Serial.begin(9600);
}
void loop() {
// Настройка фотодиодов с фильтром красного цвета для чтения
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Чтение выходной частоты
redFrequency = pulseIn(sensorOut, LOW);
// Выводим значение красного цвета
Serial.print("R = ");
Serial.print(redFrequency);
delay(100);
// Настройка фотодиодов с фильтром зеленого цвета для чтения
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Чтение выходной частоты
greenFrequency = pulseIn(sensorOut, LOW);
// Выводим значение зеленого цвета
Serial.print(" G = ");
Serial.print(greenFrequency);
delay(100);
// Настройка фотодиодов с фильтром синего цвета для чтения
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Чтение выходной частоты
blueFrequency = pulseIn(sensorOut, LOW);
// Выводим значение синего цвета
Serial.print(" B = ");
Serial.println(blueFrequency);
delay(100);
}
Откройте последовательный монитор со скоростью 9600 бод. Поместите синий предмет перед датчиком при разных расстояниях. Вы должны сохранить два измерения: когда объект расположен далеко от датчика и когда объект находится близко к нему.

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

Когда мы помещаем синий объект перед датчиком, значения синей частоты (B) колеблются между 59 и 223 (см. выделенные значения). Повторите этот процесс с зелеными и красными объектами и запишите верхний и нижний пределы частоты для каждого цвета.

Теперь научим Arduino различать цвета. Следующий скетч отображает значения частоты в значения RGB (от 0 до 255). На предыдущем шаге, когда у нас было максимальное количество синего цвета, мы получили частоту 59, а когда у нас синий цвет на более высоком расстоянии, мы получили 223. Так, 59 по частоте соответствует 255 (в RGB) и 223 по частоте 0 (в RGB). Мы сделаем это с помощью Arduino-функции map(). В функции map() вам нужно заменить параметры XX вашими собственными значениями.
// Контакты подключения TCS230 или TCS3200 к Arduino
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
// Хранение частоты считывания фотодиодов
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
// Хранение значений цветов
int redColor = 0;
int greenColor = 0;
int blueColor = 0;
void setup() {
// Настройка выходов
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// Установка sensorOut в качестве входа
pinMode(sensorOut, INPUT);
// Установка масштабирования частоты на 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
// Запускаем связь по последовательному порту
Serial.begin(9600);
}
void loop() {
// Настройка фотодиодов с фильтром красного цвета для чтения
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Чтение выходной частоты
redFrequency = pulseIn(sensorOut, LOW);
// Переназначение значения частоты красного цвета от 0 до 255
// Вы должны заменить своими собственными значениями. Вот пример:
// redColor = map(redFrequency, 70, 120, 255,0);
redColor = map(redFrequency, XX, XX, 255,0);
// Выводим значение красного цвета
Serial.print("R = ");
Serial.print(redColor);
delay(100);
// Настройка фотодиодов с фильтром зеленого цвета для чтения
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Чтение выходной частоты
greenFrequency = pulseIn(sensorOut, LOW);
// Переназначение значения частоты зеленого цвета от 0 до 255
// Вы должны заменить своими собственными значениями. Вот пример:
// greenColor = map(greenFrequency, 100, 199, 255, 0);
greenColor = map(greenFrequency, XX, XX, 255, 0);
// Выводим значение зеленого цвета
Serial.print(" G = ");
Serial.print(greenColor);
delay(100);
// Настройка фотодиодов с фильтром синего цвета для чтения
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Чтение выходной частоты
blueFrequency = pulseIn(sensorOut, LOW);
// Переназначение значения частоты синего цвета от 0 до 255
// Вы должны заменить своими собственными значениями. Вот пример:
// blueColor = map(blueFrequency, 38, 84, 255, 0);
blueColor = map(blueFrequency, XX, XX, 255, 0);
// Выводим значение синего цвета
Serial.print(" B = ");
Serial.print(blueColor);
delay(100);
// Проверяем текущий обнаруженный цвет и печатаем
// сообщение в последовательном мониторе
if(redColor > greenColor && redColor > blueColor){
Serial.println(" - RED detected!");
}
if(greenColor > redColor && greenColor > blueColor){
Serial.println(" - GREEN detected!");
}
if(blueColor > redColor && blueColor > greenColor){
Serial.println(" - BLUE detected!");
}
}
Теперь поместите что-нибудь перед датчиком. Он должен вывести в последовательном мониторе обнаруженный цвет: красный (RED), зеленый (GREEN) или синий (BLUE).
© digitrode.ru