Arduino:Примеры/Гайд по использованию датчика цвета TCS230/TCS3200 с Arduino
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Черновик |
Гайд по использованию датчика цвета 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 или TCS230
- Плата Arduino UNO
- Провода-перемычки
Схема
Подключите друг к другу эти компоненты, как показано на картинке ниже:
Контакты датчика TCS3200 и Arduino подключаются следующим образом:
- Контакт S0 на датчике – к цифровому контакту 4 на Arduino
- Контакт S1 – к цифровому контакту 5
- Контакт VCC – к контакту 5V
- Контакт S3 – к цифровому контакту 6
- Контакт S2 – к цифровому контакту 7
- Контакт OUT – к цифровому контакту 8
Код
Для этого проекта понадобится два скетча:
- Считывание и отображение диапазона выходной частоты на мониторе порта (калибровка). В этой части мы будем помещать перед датчиком объекты разного цвета, а затем записывать полученные значения.
- Распознавание разных цветов. В этой части мы будем вставлять в код значения, полученные первым скетчем, благодаря чему датчик начнет определять разные цвета. Этот скетч будет определять только три цвета – красный, зеленый и синий.
Скетч 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(), вы можете задать больше трех цветов для определения.
См.также
Внешние ссылки
- Страницы с устаревшим атрибутом подсветки синтаксиса «enclose»
- Справочник языка Arduino
- Arduino
- Перевод от Сubewriter
- Проверка:myagkij
- Оформление:myagkij
- Редактирование:myagkij
- Черновик
- Надо доработать
- Черновой вариант статьи
- Черновой вариант
- Пример
- Примеры
- Пример программирования Arduino
- Примеры программирования Arduino