Определение цвета объектов с помощью Arduino Nano и датчика TCS3200
Компоненты и материалы
| Arduino Nano R3 | 1 шт. |
| Модуль датчика цвета TCS3200 | 1 шт. |
| LCD-дисплей 16x2 (I2C, синяя подсветка) | 1 шт. |
| Беспаяная макетная плата | 1 шт. |
| Провода-перемычки | набор |
Необходимое ПО
- Arduino IDE
О проекте
В этом уроке мы научимся определять цвет объектов с помощью Arduino и датчика TCS3200. Результат будет выводиться на LCD-дисплей. Этот проект является частью более крупной системы — манипулятора, который выполняет действия в зависимости от цвета объекта.

Шаг 1: Спецификация компонентов (BoM)
Цены и ссылки приведены для ориентира:
- Arduino Nano — ~$8
- Модуль датчика цвета TCS3200 — ~$9
- I2C LCD 1602 с синей подсветкой — ~$8
- Беспаяная макетная плата — ~$2
- Провода для соединений
Шаг 2: Датчик цвета TCS3200

Согласно даташиту, TCS3200 — это программируемый преобразователь цвета света в частоту. Он объединяет настраиваемые фотодиоды и преобразователь тока в частоту в одном CMOS-кристалле.
Выходной сигнал — прямоугольная волна (скважность 50%) с частотой, пропорциональной интенсивности света. Полная шкала выходной частоты масштабируется одним из трёх предустановленных значений через управляющие входы S0 и S1. Цифровые входы и выход позволяют подключать датчик напрямую к микроконтроллеру.

Вход OE (Output Enable) переводит выход в высокоомное состояние для совместного использования линии ввода микроконтроллера несколькими устройствами. В TCS3200 преобразователь света в частоту считывает массив 8×8 фотодиодов:
- 16 фотодиодов с синими фильтрами
- 16 фотодиодов с зелёными фильтрами
- 16 фотодиодов с красными фильтрами
- 16 фотодиодов без фильтров (прозрачные)
Ножки S2 и S3 выбирают активную группу фотодиодов (красную, зелёную, синюю или прозрачную). Размер фотодиодов — 110×110 мкм, шаг — 134 мкм.
Вывод OE следует соединить с GND (LOW). Датчик запитан от 2.7–5.5 В; мы используем 5 В от Arduino. Для защиты от бокового света рекомендуется установить небольшое резиновое кольцо (можно зафиксировать термоклеем).

Шаг 3: Подключение оборудования

Датчик TCS3200:
- S0 → D4 (Nano)
- S1 → D5
- S2 → D6
- S3 → D7
- OUT → D8
- EN → GND
- VCC → +5V
- GND → GND
I2C LCD 16x2:
- SDA → A4 (Nano)
- SCL → A5
Установите Arduino Nano на макетную плату. Соедините выводы 5V и GND Nano с обеими шинами питания.
Шаг 4: Программный код

Сначала задаём масштабирование частоты через S0 и S1. Установим оба в HIGH (100%):
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
Затем выбираем цвет для чтения через S2 и S3. Фотодиоды соединены параллельно, поэтому комбинации LOW/HIGH на S2/S3 позволяют выбрать нужную группу:
digitalWrite(s2, LOW); digitalWrite(s3, LOW); red = pulseIn(outPin, LOW); // Красный
digitalWrite(s2, HIGH); digitalWrite(s3, HIGH); grn = pulseIn(outPin, LOW); // Зелёный
digitalWrite(s2, LOW); digitalWrite(s3, HIGH); blu = pulseIn(outPin, LOW); // Синий
В итоговом коде каждый компонент RGB считывается несколько раз и усредняется для уменьшения погрешности.
После получения трёх компонентов нужно определить цвет. Для этого проводится предварительная калибровка: используйте объекты известного цвета и запишите полученные значения.
Пример функции определения цвета (подстройте пороги под свою освещённость):
void getColor() {
readRGB();
if (red > 8 && red < 18 && grn > 9 && grn < 19 && blu > 8 && blu < 16) color = "WHITE";
else if (red > 80 && red < 125 && grn > 90 && grn < 125 && blu > 80 && blu < 125) color = "BLACK";
else if (red > 12 && red < 30 && grn > 40 && grn < 70 && blu > 33 && blu < 70) color = "RED";
else if (red > 50 && red < 95 && grn > 35 && grn < 70 && blu > 45 && blu < 85) color = "GREEN";
else if (red > 10 && red < 20 && grn > 10 && grn < 25 && blu > 20 && blu < 38) color = "YELLOW";
else if (red > 65 && red < 125 && grn > 65 && grn < 115 && blu > 32 && blu < 65) color = "BLUE";
else color = "NO_COLOR";
}
Здесь заданы 6 цветов: белый, чёрный, красный, зелёный, жёлтый, синий. При снижении освещённости пороговые значения увеличиваются.
В функции loop() показания выводятся на LCD каждую секунду. Полный код доступен на GitHub.
Шаг 5: Заключение

Надеюсь, этот проект поможет вам погрузиться в увлекательный мир электроники, робототехники и IoT!
Обновлённые файлы на GitHub: Color Detector
Блог автора: MJRoBot.org
Привет с юга мира! До встречи в следующем уроке.
С уважением,
Марсело
Исходный код
Фрагмент 2: Чтение RGB-компонентов
digitalWrite(s2, LOW); digitalWrite(s3, LOW); red = pulseIn(outPin, LOW);
digitalWrite(s2, HIGH); digitalWrite(s3, HIGH); grn = pulseIn(outPin, LOW);
digitalWrite(s2, LOW); digitalWrite(s3, HIGH); blu = pulseIn(outPin, LOW);
Фрагмент 3: Функция getColor()
void getColor() {
readRGB();
if (red > 8 && red < 18 && grn > 9 && grn < 19 && blu > 8 && blu < 16) color = "WHITE";
else if (red > 80 && red < 125 && grn > 90 && grn < 125 && blu > 80 && blu < 125) color = "BLACK";
else if (red > 12 && red < 30 && grn > 40 && grn < 70 && blu > 33 && blu < 70) color = "RED";
else if (red > 50 && red < 95 && grn > 35 && grn < 70 && blu > 45 && blu < 85) color = "GREEN";
else if (red > 10 && red < 20 && grn > 10 && grn < 25 && blu > 20 && blu < 38) color = "YELLOW";
else if (red > 65 && red < 125 && grn > 65 && grn < 115 && blu > 32 && blu < 65) color = "BLUE";
else color = "NO_COLOR";
}
Репозиторий
https://github.com/Mjrovai/Color-Detector
Схемы
Fritzing-файл: Color Detector.fzz
Производственный процесс
- Создание потрясающей системы Ambilight для монитора на Arduino
- Создание классической игры Pong на Arduino UNO с OLED-дисплеем: пошаговый урок
- Детектор аудиочастот на Arduino: измеряем пик громкости с высокочувствительным модулем
- Собираем свой Tamagotchi на Arduino: цифровой питомец своими руками
- Умный беспроводной выключатель света: Arduino-контроллер для удаленного управления
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Умный водяной пистолет с датчиком движения на Arduino Nano
- Сборка надежного таймера обратного отсчета на Arduino с 7-сегментным дисплеем SparkFun
- Arduino RGB-микшер цветов: Простой проект для начинающих
- Arduino Sunflower: электронный подсолнух, следящий за солнцем