Руководство по датчику цвета TCS230/TCS3200 с Arduino
В этом руководстве показано, как определять цвета с помощью Arduino, используя датчик цвета TCS230/TCS3200.
Датчик цвета TCS3200 может определять широкий спектр цветов на основе их длины волны. Этот датчик особенно полезен для проектов распознавания цвета, таких как подбор цвета, сортировка по цвету, считывание тест-полосок и многое другое.
Введение
Датчик цвета TCS3200 — показанный на рисунке ниже — использует RGB-чип TAOS TCS3200 для определения цвета. Он также содержит четыре белых светодиода, которые подсвечивают объект перед ним.
Характеристики
Вот характеристики датчика:
Питание: от 2,7 В до 5,5 В
Размер: 28,4 x 28,4 мм (1,12 x 1,12 дюйма)
Интерфейс: цифровой TTL
Высокоточное преобразование интенсивности света в частоту
Программируемый цвет и полномасштабная выходная частота
Прямое взаимодействие с микроконтроллером
Где купить?
Вы можете найти датчик цвета TCS3200 или TCS230 на Maker Advisor и найти лучшую цену.
Как работает датчик TCS3200?
TCS3200 имеет массив фотодиодов с 4 различными фильтрами. Фотодиод — это просто полупроводниковый прибор, который преобразует свет в электрический ток. Датчик содержит:
16 фотодиодов с красным фильтром — чувствительных к длине волны красного цвета
16 фотодиодов с зелёным фильтром — чувствительных к длине волны зелёного цвета
16 фотодиодов с синим фильтром — чувствительных к длине волны синего цвета
16 фотодиодов без фильтра
Если вы внимательно посмотрите на чип TCS3200, вы увидите различные фильтры.
Выборочно считывая показания фотодиодов с разными фильтрами, вы можете определять интенсивность различных цветов. Датчик имеет преобразователь тока в частоту, который преобразует показания фотодиодов в прямоугольный сигнал с частотой, пропорциональной интенсивности света выбранного цвета. Эта частота затем считывается Arduino — это показано на рисунке ниже.
Распиновка
Вот распиновка датчика:
Название вывода |
Вх/Вых |
Описание |
|---|---|---|
GND (4) |
Земля питания |
|
OE (3) |
Вх |
Разрешение выходной частоты (активный низкий) |
OUT (6) |
Вых |
Выходная частота |
S0, S1 (1, 2) |
Вх |
Входы выбора масштабирования выходной частоты |
S2, S3 (7, 8) |
Вх |
Входы выбора типа фотодиода |
VDD (5) |
Напряжение питания |
Выбор фильтра
Для выбора цвета, считываемого фотодиодом, используются управляющие выводы S2 и S3. Поскольку фотодиоды соединены параллельно, установка S2 и S3 в LOW и HIGH в различных комбинациях позволяет выбирать различные фотодиоды. Посмотрите на таблицу ниже:
Тип фотодиода |
S2 |
S3 |
|---|---|---|
Красный |
LOW |
LOW |
Синий |
LOW |
HIGH |
Без фильтра (прозрачный) |
HIGH |
LOW |
Зелёный |
HIGH |
HIGH |
Масштабирование частоты
Выводы S0 и S1 используются для масштабирования выходной частоты. Она может быть масштабирована до следующих предустановленных значений: 100%, 20% или 2%. Масштабирование выходной частоты полезно для оптимизации показаний датчика для различных частотомеров или микроконтроллеров. Посмотрите на таблицу ниже:
Масштабирование выходной частоты |
S0 |
S1 |
|---|---|---|
Выключение |
L |
L |
2% |
L |
H |
20% |
H |
L |
100% |
H |
H |
Для Arduino обычно используется масштабирование частоты 20%. Поэтому вы устанавливаете вывод S0 в HIGH, а вывод S1 в LOW.
Определение цвета с Arduino и TCSP3200
В этом примере вы будете определять цвета с помощью Arduino и датчика цвета TCSP3200. Этот датчик не очень точный, но хорошо работает для определения цветов в простых проектах.
Необходимые компоненты
Вот компоненты, необходимые для этого проекта:
Arduino UNO — прочитайте Лучшие стартовые наборы Arduino
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения
Подключение датчика TCSP3200 к Arduino довольно простое. Просто следуйте приведённой ниже схеме.
Вот соединения между TCSP3200 и Arduino:
S0: цифровой вывод 4
S1: цифровой вывод 5
VCC: 5V
S3: цифровой вывод 6
S4: цифровой вывод 7
OUT: цифровой вывод 8
Код
Для этого проекта вам понадобятся два скетча:
Чтение и отображение выходной частоты в мониторе последовательного порта. В этой части вам нужно записать значения частоты, когда вы размещаете перед датчиком объекты разных цветов.
Различение разных цветов. В этом разделе вы подставите значения частоты, полученные ранее, в код, чтобы ваш датчик мог различать разные цвета. Мы будем определять красный, зелёный и синий цвета.
1. Чтение выходной частоты
Загрузите следующий код на плату Arduino.
/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/
// TCS230 or TCS3200 pins wiring to Arduino
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
// Stores frequency read by the photodiodes
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
void setup() {
// Setting the outputs
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// Setting the sensorOut as an input
pinMode(sensorOut, INPUT);
// Setting frequency scaling to 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
// Begins serial communication
Serial.begin(9600);
}
void loop() {
// Setting RED (R) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Reading the output frequency
redFrequency = pulseIn(sensorOut, LOW);
// Printing the RED (R) value
Serial.print("R = ");
Serial.print(redFrequency);
delay(100);
// Setting GREEN (G) filtered photodiodes to be read
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Reading the output frequency
greenFrequency = pulseIn(sensorOut, LOW);
// Printing the GREEN (G) value
Serial.print(" G = ");
Serial.print(greenFrequency);
delay(100);
// Setting BLUE (B) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Reading the output frequency
blueFrequency = pulseIn(sensorOut, LOW);
// Printing the BLUE (B) value
Serial.print(" B = ");
Serial.println(blueFrequency);
delay(100);
}
Откройте монитор последовательного порта со скоростью передачи 9600 бод.
Поместите синий объект перед датчиком на разных расстояниях. Вам нужно сохранить два измерения: когда объект расположен далеко от датчика и когда объект расположен близко к нему.
Проверьте значения, отображаемые в мониторе последовательного порта. Частота синего (B) должна быть наименьшей по сравнению с показаниями частоты красного (R) и зелёного (G) — смотрите рисунок ниже.
Когда мы размещаем синий объект перед датчиком, значения частоты синего (B) колеблются между 59 и 223 (смотрите выделенные значения).
Примечание: вы не можете использовать эти значения частоты (59 и 223) в своём коде, вам следует измерить цвета для вашего конкретного объекта с помощью вашего собственного датчика цвета. Затем сохраните верхний и нижний пределы частоты для синего цвета, потому что они понадобятся вам позже.
Повторите этот процесс с зелёным и красным объектами и запишите верхний и нижний пределы частоты для каждого цвета.
2. Различение разных цветов
Следующий скетч преобразует значения частоты в значения RGB (которые находятся в диапазоне от 0 до 255).
На предыдущем шаге при максимальном синем мы получили частоту 59, а при синем на большем расстоянии мы получили 223.
Таким образом, 59 в частоте соответствует 255 (в RGB), а 223 в частоте — 0 (в RGB). Мы сделаем это с помощью функции Arduino map(). В функции map() вам нужно заменить параметры XX на ваши собственные значения.
/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/
// TCS230 or TCS3200 pins wiring to Arduino
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
// Stores frequency read by the photodiodes
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
// Stores the red. green and blue colors
int redColor = 0;
int greenColor = 0;
int blueColor = 0;
void setup() {
// Setting the outputs
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// Setting the sensorOut as an input
pinMode(sensorOut, INPUT);
// Setting frequency scaling to 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
// Begins serial communication
Serial.begin(9600);
}
void loop() {
// Setting RED (R) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Reading the output frequency
redFrequency = pulseIn(sensorOut, LOW);
// Remaping the value of the RED (R) frequency from 0 to 255
// You must replace with your own values. Here's an example:
// redColor = map(redFrequency, 70, 120, 255,0);
redColor = map(redFrequency, XX, XX, 255,0);
// Printing the RED (R) value
Serial.print("R = ");
Serial.print(redColor);
delay(100);
// Setting GREEN (G) filtered photodiodes to be read
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Reading the output frequency
greenFrequency = pulseIn(sensorOut, LOW);
// Remaping the value of the GREEN (G) frequency from 0 to 255
// You must replace with your own values. Here's an example:
// greenColor = map(greenFrequency, 100, 199, 255, 0);
greenColor = map(greenFrequency, XX, XX, 255, 0);
// Printing the GREEN (G) value
Serial.print(" G = ");
Serial.print(greenColor);
delay(100);
// Setting BLUE (B) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Reading the output frequency
blueFrequency = pulseIn(sensorOut, LOW);
// Remaping the value of the BLUE (B) frequency from 0 to 255
// You must replace with your own values. Here's an example:
// blueColor = map(blueFrequency, 38, 84, 255, 0);
blueColor = map(blueFrequency, XX, XX, 255, 0);
// Printing the BLUE (B) value
Serial.print(" B = ");
Serial.print(blueColor);
delay(100);
// Checks the current detected color and prints
// a message in the serial monitor
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!");
}
}
Чтобы различать разные цвета, у нас есть три условия:
Когда R является максимальным значением (в параметрах RGB), мы знаем, что перед нами красный объект
Когда G является максимальным значением, мы знаем, что перед нами зелёный объект
Когда B является максимальным значением, мы знаем, что перед нами синий объект
Теперь поместите что-нибудь перед датчиком. В мониторе последовательного порта должен отображаться обнаруженный цвет: красный, зелёный или синий.
Совет: ваш датчик также может определять другие цвета, добавив больше операторов if.
Заключение
В этом руководстве вы узнали, как определять цвета с помощью датчика цвета TCSP3200.
Вы можете легко построить машину для сортировки по цвету, просто добавив сервопривод.
Есть ли у вас идеи проектов, связанных с сортировкой по цвету?
Дайте нам знать, оставив комментарий ниже.
Если вам понравилось это руководство, вам, вероятно, понравятся и эти: