Руководство по датчику цвета TCS230/TCS3200 с Arduino

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

Датчик цвета TCS3200 может определять широкий спектр цветов на основе их длины волны. Этот датчик особенно полезен для проектов распознавания цвета, таких как подбор цвета, сортировка по цвету, считывание тест-полосок и многое другое.

Датчик цвета TCS230/TCS3200 с Arduino

Введение

Датчик цвета TCS3200 — показанный на рисунке ниже — использует RGB-чип TAOS TCS3200 для определения цвета. Он также содержит четыре белых светодиода, которые подсвечивают объект перед ним.

Модуль датчика цвета 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, вы увидите различные фильтры.

Фильтры датчика цвета TCS3200

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

Схема работы датчика цвета TCS3200

Распиновка

Вот распиновка датчика:

Распиновка датчика цвета TCS3200

Название вывода

Вх/Вых

Описание

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. Этот датчик не очень точный, но хорошо работает для определения цветов в простых проектах.

Необходимые компоненты

Вот компоненты, необходимые для этого проекта:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

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

Подключение датчика TCSP3200 к Arduino довольно простое. Просто следуйте приведённой ниже схеме.

Схема подключения датчика цвета TCS3200 к Arduino

Вот соединения между TCSP3200 и Arduino:

  • S0: цифровой вывод 4

  • S1: цифровой вывод 5

  • VCC: 5V

  • S3: цифровой вывод 6

  • S4: цифровой вывод 7

  • OUT: цифровой вывод 8

Код

Для этого проекта вам понадобятся два скетча:

  1. Чтение и отображение выходной частоты в мониторе последовательного порта. В этой части вам нужно записать значения частоты, когда вы размещаете перед датчиком объекты разных цветов.

  2. Различение разных цветов. В этом разделе вы подставите значения частоты, полученные ранее, в код, чтобы ваш датчик мог различать разные цвета. Мы будем определять красный, зелёный и синий цвета.

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 бод.

Поместите синий объект перед датчиком на разных расстояниях. Вам нужно сохранить два измерения: когда объект расположен далеко от датчика и когда объект расположен близко к нему.

Считывание синего объекта датчиком цвета TCS3200

Проверьте значения, отображаемые в мониторе последовательного порта. Частота синего (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.

Вы можете легко построить машину для сортировки по цвету, просто добавив сервопривод.

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

Дайте нам знать, оставив комментарий ниже.

Если вам понравилось это руководство, вам, вероятно, понравятся и эти: