Arduino:Примеры/Гайд по использованию датчика цвета TCS230/TCS3200 с Arduino

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


Гайд по использованию датчика цвета TCS230/TCS3200 с Arduino[1]

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

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

Описание

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

Характеристики

  • Питание: от 2,7 до 5,5 вольт
  • Размер: 28,4 мм х 28,4 мм
  • Интерфейс: цифровой TTL
  • Преобразование данных о яркости света в частоту (итоговые данные имеют высокое разрешение)
  • Возможность задать цветовой фильтр и масштабирование частоты
  • Коммуницирует напрямую с микроконтроллером

Принцип работы

Датчик TCS3200 состоит из фотодиодов 4 разных типов. Фотодиод – это просто полупроводник, конвертирующий свет в электрический заряд. Итак, TCS3200 имеет следующие светодиоды:

  • 16 фотодиодов с красным фильтром (т.е. они чувствительны к волнам красной области видимого спектра)
  • 16 фотодиодов с зеленым фильтром (т.е. они чувствительны к волнам зеленой области видимого спектра)
  • 16 фотодиодов с синим фильтром (т.е. они чувствительны к волнам синей области видимого спектра)
  • 16 фотодиодов без фильтра

Вы можете разглядеть эти фильтры, рассмотрев TCS3200 поближе:

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

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

Распиновка

Номер контакта Входной/выходной Описание
GND (4) Заземление
OE (3) Входной Включение потока выходных данных (частоты); активируется через LOW
OUT (6) Выходной Вывод частоты
S0, S1 (1, 2) Входной Масштабирование частоты
S2, S3 (7, 8) Входной Выбор типа фотодиодов
VDD (5) Питание

Выбор фильтра

Чтобы выбрать цвет, который будет считываться фотодиодами, датчик TCS3200 оснащен контактами S2 и S3. Поскольку фотодиоды подключены параллельно, разные типы фотодиодов можно выбирать, переключая контакты S2 и S3 в разные комбинации состояний HIGH и LOW. Как именно – смотрите в этой таблице:

Тип фотодиода S2 S3
Красный LOW LOW
Синий LOW HIGH
Без фильтра (чистый) HIGH LOW
Зеленый HIGH HIGH

Масштабирование частоты

Контакты S0 и S1 используются для масштабирования выходной частоты. Ее можно масштабировать до трех заранее заданных значений: 100%, 20% и 2%. Масштабирование частоты используется, чтобы оптимизировать данные, считанные датчиком, для разных микроконтроллеров и прочих частотомеров. Как именно масштабировать частоту – смотрите в таблице ниже:

Масштабирование частоты S0 S1
Отключение LOW LOW
2% LOW HIGH
20% HIGH LOW
100% HIGH HIGH

Для Arduino используется, как правило, масштабирование 20%. Таким образом, контакт S0 нужно выставить на HIGH, а S1 – на LOW.

Проект: Определение цвета с помощью Arduino и TCS3200

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

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

Схема

Подключите друг к другу эти компоненты, как показано на картинке ниже:

Контакты датчика TCS3200 и Arduino подключаются следующим образом:

  • Контакт S0 на датчике – к цифровому контакту 4 на Arduino
  • Контакт S1 – к цифровому контакту 5
  • Контакт VCC – к контакту 5V
  • Контакт S3 – к цифровому контакту 6
  • Контакт S2 – к цифровому контакту 7
  • Контакт OUT – к цифровому контакту 8

Код

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

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

Скетч 1: Определение цветового диапазона

Загрузите этот скетч на плату Arduino:

/*********
  Автор – Руи Сантос (Rui Santos)
  Более подробно о проекте на:  http://randomnerdtutorials.com  
*********/

// Контакты 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() {
  // выставляем контакты S0, S1, S2 и S3 в режим OUTPUT: 
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  
  // выставляем контакт sensorOut в режим INPUT:
  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). Подробнее смотрите на картинке ниже:

Как видите, когда мы помещаем перед датчиком синий объект, частота варьируется от 59 до 223 (см. на картинке значения, обведенные красной рамкой).

Примечание: Мои значения (т.е. «59» и «223») вы в своих проектах использовать не можете – вам нужно замерить диапазон синего цвета самостоятельно, используя для этого собственный датчик. Замерив верхнюю и нижнюю границу, запишите или запомните их. Они пригодятся вам во втором скетче.

Теперь повторите тот же процесс для зеленого и красного объектов.

Скетч 2: Распознавание цветов

Этот скетч подгоняет значения, считанные первым скетчем, к RGB-значениям, которые варьируются между «0» и «255».

Итак, когда объект был вплотную к датчику, минимальным значением для синего цвета было «59», а когда объект была далеко от датчика, максимальным значением было «223».

Таким образом, «59» (от датчика) будет соответствовать «255» (в формате RGB), а «223» (от датчика) – «0» (в формате RGB). Чтобы подогнать эти значения друг к другу, мы воспользуемся функцией map(). В скетче ниже эта функция будет встречаться 3 раза – для синего, зеленого и красного цветов. Найдите ее и замените «XX» на значения, полученные в первом скетче.

/*********
  Автор – Руи Сантос (Rui Santos)
  Более подробно о проекте на: http://randomnerdtutorials.com  
*********/

// Контакты 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() {
  // выставляем контакты S0, S1, S2 и S3 в режим OUTPUT:
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  
  // выставляем контакт sensorOut в режим INPUT:
  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;
  // вместо «XX» нужно поставить собственные значения; например, так:
  // 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;
  // вместо «XX» нужно поставить собственные значения; например, так:
  // 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;
  // вместо «XX» нужно поставить собственные значения; например, так:
  // 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!");  //  " - это СИНИЙ!"
  }
}

Чтобы определить цвет, в конце скетча задано три условия:

  • Если скетч получает максимальное значение R (в формате RGB), то это значит, что перед датчиком – красный объект
  • Если скетч получает максимальное значение G, то это значит, что перед датчиком – зеленый объект
  • Если скетч получает максимальное значение B, то это значит, что перед датчиком – синий объект

Теперь поместите что-нибудь перед датчиком. Он передаст полученные значения на Arduino, а та, определившись, напечатает в мониторе порта один из трех вариантов – красный, зеленый или синий.

Совет: Используя в конце скетча дополнительные операторы if(), вы можете задать больше трех цветов для определения.

См.также

Внешние ссылки