Рассмотрим как обнаруживать и распознавать цвета с помощью Arduino, датчика TCS 3200, и как отображать всё на ЖК-дисплее.
Комплектующие
Ниже перечислим детали, которые используются в этом проекте, чтобы с помощью Ардуино распознавать цвета.
Оборудование
- Arduino Nano × 1
- Модуль датчика цвета TCS 3200 × 1
- Стандартный ЖК-дисплей Adafruit - 16x2, белый на синем × 1
- Макет × 1
- Перемычки
Программы
Идея проекта
Это простое руководство, в котором мы рассмотрим, как считывать цвета, используя Arduino и сенсоры, такие как TCS 3200. Идея будет заключаться в том, чтобы обнаружить цвет объекта и отобразить это на ЖК-дисплее.
Этот проект в будущем будет прототипом более крупного проекта, который будет представлять собой манипулятор робота, который выбирает правильное действие в зависимости от цвета объекта. Приведенная выше блок-схема показывает основные компоненты.
В итоге процесс работы данного устройства по распознаванию цвета вы сможете увидеть на видео в конце урока.
Сенсор цвета TSC 3200
Как описано в техническом описании, TCS3200 является программируемым преобразователем цветового света в частоту, который сочетает в себе настраиваемые кремниевые фотодиоды и преобразователь тока в частоту на одной монолитной интегральной схеме CMOS.
На выходе получается прямоугольная волна (коэффициент заполнения 50%) с частотой, прямо пропорциональной интенсивности света (освещенности). Полномасштабная выходная частота может быть масштабирована одним из трех предустановленных значений с помощью двух управляющих входных контактов (S0 и S1).
Цифровые входы и цифровой выход обеспечивают прямой интерфейс с микроконтроллером или другими логическими схемами.
Разрешение выхода (OE, Output enable) переводит выход в состояние высокого импеданса для совместного использования нескольких входных линий микроконтроллера. В TCS3200 преобразователь света в частоту считывает матрицу 8 x 8 фотодиодов.
- 16 фотодиодов имеют синие фильтры
- 16 фотодиодов имеют зеленые фильтры
- 16 фотодиодов имеют красные фильтры
- 16 фотодиодов без фильтров.
Контакты S2 и S3 используются для выбора активной группы фотодиодов (красный, зеленый, синий, прозрачный). Фотодиоды имеют размер 110 х 110 мкм и расположены на 134-мкм центрах.
OE (Enable) должен быть подключен к GND (LOW).
Датчик инкапсулирован и должен питаться от 2,7 до 5,5 В постоянного тока. Мы будем использовать выход Arduino 5 В для питания датчика. Чтобы правильно использовать датчик, мы установим небольшое резиновое кольцо, чтобы изолировать датчик от бокового света. Мы использовали горячий клей для этого.
Схема соединения
Вы можете скачать файл схемы для программы Fritzing ниже:
Соединяем сенсор TSC3200 с Ардуино следующим образом:
- S0 ==> Nano pin D4
- S1 ==> Nano pin D5
- S2 ==> Nano pin D6
- S3 ==> Nano pin D7
- OUT ==> Nano Pin D8
- EN ==> GND
- VCC ==> +5V
- GND ==> GND
Соединяем I2C LCD 2/16 ЖК-дисплей:
- SDA ==> Nano Pin A4
- SCL ==> Nano Pin A5
Установите Arduino Nano на макетную плату. Подключите выход Nano 5V и GND к обеим силовым шинам.
Код Ардуино для распознавания цвета
Первое, что нужно определить, - это масштабирование частоты, как определено в приведенной выше таблице. Для этого используются контакты S0 и S1. Масштабирование выходной частоты полезно для оптимизации показаний датчиков для различных частотных счетчиков или микроконтроллеров. Мы установим S0 и S1, оба в HIGH (100%):
digitalWrite(s0,HIGH); digitalWrite(s1,HIGH);
Следующее, что нужно сделать, это выбрать цвет, который будет считываться фотодиодом (красный, зеленый или синий), для этого мы используем управляющие контакты S2 и S3. Поскольку фотодиоды подключены параллельно, настройка S2 и S3 LOW и HIGH в разных комбинациях позволяет выбирать разные фотодиоды, как показано в таблице выше.
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 и возьмем среднее значение, чтобы мы могли снизить ошибку, если одно из показаний неверное.
Когда у нас есть 3 компонента (RGB), мы должны определить, какой это цвет. Чтобы сделать это, нужно предварительно откалибровать проект. Вы можете использовать известную цветную тестовую бумагу или объект и прочитать 3 сгенерированных компонента.
Вы можете изначально использовать наш код, изменив параметры для вашего уровня освещенности:
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() мы определяем показания на ЖК-дисплее каждую 1 секунду.
Все программы, которые нужны для проекта и библиотеки вы можете найти в архиве ниже:
Итоговый результат (видео)
В итоге наш проект Ардуино распознавание цвета работает следующим образом:
На этом наш урок завершен.