Распознавание цвета с помощью Arduino и TCS 3200
Рассмотрим как обнаруживать и распознавать цвета с помощью Arduino, датчика TCS 3200, и как отображать всё на ЖК-дисплее.
Комплектующие
Ниже перечислим детали, которые используются в этом проекте, чтобы с помощью Ардуино распознавать цвета.
Оборудование
- Arduino Nano × 1
- Модуль датчика цвета TCS 3200 × 1
- Стандартный ЖК-дисплей Adafruit — 16×2, белый на синем × 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 с Ардуино следующим образом:
Соединяем I2C LCD 2/16 ЖК-дисплей:
Установите Arduino Nano на макетную плату. Подключите выход Nano 5V и GND к обеим силовым шинам.
Код Ардуино для распознавания цвета
Первое, что нужно определить, — это масштабирование частоты, как определено в приведенной выше таблице. Для этого используются контакты S0 и S1. Масштабирование выходной частоты полезно для оптимизации показаний датчиков для различных частотных счетчиков или микроконтроллеров. Мы установим S0 и S1, оба в HIGH (100%):
Следующее, что нужно сделать, это выбрать цвет, который будет считываться фотодиодом (красный, зеленый или синий), для этого мы используем управляющие контакты S2 и S3. Поскольку фотодиоды подключены параллельно, настройка S2 и S3 LOW и HIGH в разных комбинациях позволяет выбирать разные фотодиоды, как показано в таблице выше.
В окончательном коде мы несколько раз прочитаем каждый из компонентов RGB и возьмем среднее значение, чтобы мы могли снизить ошибку, если одно из показаний неверное.
Когда у нас есть 3 компонента (RGB), мы должны определить, какой это цвет. Чтобы сделать это, нужно предварительно откалибровать проект. Вы можете использовать известную цветную тестовую бумагу или объект и прочитать 3 сгенерированных компонента.
Вы можете изначально использовать наш код, изменив параметры для вашего уровня освещенности:
Как вы можете видеть выше, мы предопределили 6 цветов: белый, черный, красный, зеленый, желтый и синий. По мере того, как рассеивается окружающий свет, параметры становятся все выше. Внутри цикла loop() мы определяем показания на ЖК-дисплее каждую 1 секунду.
Все программы, которые нужны для проекта и библиотеки вы можете найти в архиве ниже:
Итоговый результат (видео)
В итоге наш проект Ардуино распознавание цвета работает следующим образом:
Источник
Датчик цвета с большим динамическим диапазоном
Hamamatsu S9032
Изображенная на Рисунке 1 схема датчика цвета способна в широком динамическом диапазоне генерировать RGB-триплеты, являющиеся очень полезным атрибутом приложений машинного зрения. В схеме реализовано автоматическое управление экспозицией, благодаря которому значения RGB инвариантны относительно интенсивности освещения.
Рисунок 1. | Датчик RGB с автоматическим управлением экспозицией. |
Пока микроконтроллер удерживает активный уровень сигнала сброса RES, три RGB фотодиода с общими катодами (U1, Рисунок 2) остаются слегка смещенными в обратном направлении до напряжения VR (в типичном случае до 0.5 В) через три N-канальных MOSFET M1, M2 и M3. После завершения фазы сброса напряжения в узлах R, G и B начинают линейно увеличиваться пропорционально интенсивности каждой цветовой компоненты. Эти сигналы поступают на три компаратора (U2), выходы которых объединены по схеме монтажного «ИЛИ». Первое из напряжений, достигших порогового уровня VTH (с типичным значением 2.6 В), переключает соответствующий компаратор, выходной сигнал которого через инвертор U3A стробирует усилители выборки-хранения (УВХ) U4.
Рисунок 2. | RGB датчик S9032. |
Затем Arduino Nano оцифровывает сохраненные напряжения RH, GH и BH для дальнейшей обработки. В принципе, аналого-цифровое преобразование можно выполнять с помощью микроконтроллера и без использования УВХ U4, однако последовательные преобразования привели бы к появлению ошибки выборки сигналов, которая была бы тем больше, чем ярче сигналы и, соответственно, выше скорость нарастания. Альтернативой микроконтроллеру может быть использование трех АЦП.
Диод D1 добавляет дополнительный гистерезис компараторам, а D2 нужен для того, чтобы дать Arduino возможность, установив низкий уровень в узле T2, сохранить сигналы RGB и определить максимальное время экспозиции. Эта функция необходима для того, чтобы гарантировать фиксированный темп преобразования. Временные диаграммы сигналов схемы показаны на Рисунке 3. В момент времени t1, когда R = VTH, уровень напряжения на выходе компаратора U2A становится низким, триплет [RH, GH, BH] фиксируется в УВХ, и в конце процесса оцифровывается микроконтроллером (TADC). По истечении максимального времени экспозиции (t2) микроконтроллер устанавливает на SH1 низкий уровень и начинает преобразование входных сигналов.
Рисунок 3. | Временная диаграмма работы датчика цвета. |
Подводя итог, отметим, что поскольку время экспозиции t1 определяется самым ярким из сигналов R, G и B, насыщения какого-либо из каналов не происходит. Компрессия сигналов позволяет при 8-битном АЦП получить динамический диапазон 100 дБ. Более того, чтобы достичь таких характеристик, не требуется настройка ни одного из параметров схемы.
Рисунок 4 поясняет, каким образом автоматическое управление экспозицией позволяет получить большой динамический диапазон измерений. С учетом поставленной цели, для каждой интенсивности света время экспозиции всегда будет таким, чтобы гарантированно имелся участок, на котором значения [RH, GH, BH] постоянны.
Рисунок 4. | Пример двух RGB-триплетов, полученных от одного объекта при разных уровнях освещенности. [R1,G1,B1] – яркие сигналы, выборка которых произошла в момент времени Ta, в то время как [R2,G2,B2] – слабые сигналы, выбранные в момент Tb. Поскольку [R1,G1,B1]Ta = [R2,G2,B2]Tb, цветность объекта не зависит от интенсивности освещения. |
Хотя промышленностью выпускаются законченные RGB датчики с цифровыми интерфейсами (например, Avago APDS-9950, ams TMG3993), возможность автоматического управления экспозицией в них не предусмотрена, поэтому для получения аналогичной функциональности потребовались бы многократные измерения и активное использование вычислительных ресурсов микроконтроллера.
Источник
Определитель цвета
Попала мне в руки как-то вещь, а точнее датчик под маркировкой TCS3200. В первом приближении при изучении документации на эту микросхему (сам датчик в виде микросхемы с прозрачным корпусом) весьма приличная вещь. Под прозрачным корпусом матрица из фотодиодов размером 8 на 8 штук. Эта матриц разделена на 4 зоны: 16 фотодиодов с красным фильтром, 16 фотодиодов с зеленым фильтром, 16 фотодиодов с синим фильтром и 16 фотодиодов без фильтра. Таким образом можно измерять частоту (уровень или интенсивность цвета по частоте) отдельных основных цветов — красного, зеленого и синего. После получения данных об этих цветах, можно открыть какой-нибудь графический редактор, например, Paint и ввести значения красного, зеленого и синего в соответствующие поля редактора цветовой палитры и убедиться, что все таки датчик определяет цвет правильно (ну или почти правильно, все зависит от яркости).
Продолжаем изучение датчика. Микросхема имеет корпус SOIC-8. Один вывод — выход для измерения частоты, преобразованной из интенсивности цвета. Два вывода — плюс и минус питания. Еще один вывод служит для включения датчика (активный уровень — 0). Ну, и самое интересное — это четыре вывода, определяющие режим работы датчика — S0 — S3. Выводы S0, S1 определяют шкалу частоты (в зависимости от комбинации высоких и низких потенциалов на этих выводах). Два вывода могут дать четыре комбинации режимов:
- 0 — отключить выход частоты
- 1 — шкала 2% от 600 кГц максимальной возможной частоты
- 2 — шкала 20% от 600 кГц максимальной возможной частоты
- 3 — шкала 100% от 600 кГц максимальной возможной частоты
Далее два вывода S2, S3, они определяют режим измерения цвета, также два вывода дают четыре комбинации режимов:
- 0 — используются фотодиоды с красным фильтром
- 1 — используются фотодиоды с синим фильтром
- 2 — используются фотодиоды без фильтра
- 3 — используются фотодиоды с зеленым фильтром
Теперь, зная назначение и функционал выводов датчика можно спокойно подключать его к микроконтроллеру и измерять цвета, управляя датчиком. Таким образом, датчик работает следующим образом — выводы S2, S3 задают используемый фильтр фотодиодов, свет, отраженный от поверхности предмета определенного цвета попадает на фотодиоды датчика, далее интенсивность света конвертируется в частоту (шкала частоты задана выводами S0, S1) и полученная частоты поступает на выход датчика. Однако не все так просто, если просто измерить частоту и принять ее за цвета, то получим скорее всего кашу. В документации на датчик имеется таблица, определяющая пропускную способность фильтров фотодиодов относительно определенных длин волны (как вам известно, длина волны определяет спектр видимых цветов). И относительно этих данных нужно подобрать коэффициенты для частот трех цветов фильтров, чтобы измеренные данные соответствовали действительности. Для удобства измеренные частоты можно перевести в формат R-G-B (от 0 до 255 по каждому из цветов). Для этого берется используемая шкала (2%, 20% или 100%) и принимается за максимум, то есть за 255 (для шкалы 20% значение 255 будет соответствовать 120 кГц) и через пропорцию находим текущее значение цвета относительно измеренной частоты. Но просто цветная бумажка обладает маленькой яркостью, поэтому полученные данные можно просто умножить все на 5 или другое удобное значение, иначе все полученные цвета будут близки к серым или темным оттенкам, подсветка при свете дня не сильно помогает, зато при отсутствии света как раз кстати. При измерении цвета RGB светодиода домножать не потребуется, потому что излучение светодиодов дают хорошую яркость для нашего датчика цвета.
Параметры микросхемы (датчика):
- напряжение питания от 2,7 В до 5,5 В
- высокий входной уровень от 2 В до напряжения питания
- низкий входной уровень от 0 В до 0,8 В
- температура использования от -40 до 70 градусов по Цельсию
- ток потребления от 1,4 до 2 мА
- максимальная температура пайки 260 градусов по Цельсию
Для построения конструкции на микроконтроллере будем использовать готовый китайский модуль датчика на TCS3200 (TCS230):
Модуль содержит непосредственно саму микросхему датчика в центре платы, необходимые конденсаторы, ограничивающие резисторы, а также подсветку из четырех белых светодиодов также с ограничивающими ток резисторами. Китайская сборка себя выдает всегда по не смытому флюсу, перед использованием все же отмыл его для создания более эстетического вида без пятен и разводов.
Схема устройства определителя цвета представлена ниже:
Сердцем схемы является микроконтроллер Atmega8. Данный микроконтроллер можно использовать как в корпусе DIP-28, так и в СМД исполнении в корпусе TQFP-32. Резистор R3 необходим для предотвращения самопроизвольного перезапускания микроконтроллера в случае появления случайных помех на выводе PC6. Резистор R3 подтягивает плюс питания к этому выводу, надежно создавая потенциал на нем. Для индикации используется жидко кристаллический (ЖК или LCD) дисплей SC1602. Он имеет 2 строки символов по шестнадцать штук в каждой из них. ЖК дисплей подключается к микроконтроллеру по четырех битной системе. Переменный резистор R2 необходим для регулировки контраста символов на дисплее. Вращением движка этого резистора добиваемся наиболее четких для нас показаний на экране. Подсветка ЖК дисплея организована через вывод «А» и «К» на плате дисплея. Подсветка включается через резистор, ограничивающий ток — R1. Чем больше номинал, тем более тускло будет подсвечиваться дисплей. Однако пренебрегать этим резистором не стоит во избежание порчи подсветки. Кнопка S1 осуществляет сброс микроконтроллера (всей схемы). В качестве тактового генератора используется внутренний генератор микроконтроллера на частоту 8 МГц. Проект данного устройства разрабатывался только для ознакомления и обучения. Для более точного измерения рекомендуется использовать внешний кварцевый генератор (хотя в нормальных условиях при нормальной комнатной температуре особой разницы в точности можно и не заметить между внутренним генератором и кварцем).
Питается вся схема от простого модуля питания на силовом трансформаторе. Переменное напряжение выпрямляется четырьмя диодами VD1 — VD4 марки 1N4007, пульсации сглаживаются конденсаторами C1 и C2. Четыре выпрямительных диода можно заменить одним диодным мостом. Трансформатор применен марки BV EI 382 1189 — преобразует 220 вольт переменного тока в 9 вольт переменного тока. Мощность трансформатора составляет 4,5 Вт, этого вполне достаточно и еще с запасом. Такой трансформатор можно заменить любым другим силовым трансформатором, подходящим для Вас. Либо данный питающий модуль схемы заменить на импульсный источник напряжения, можно собрать схему обратноходового преобразователя либо применить иже готовый блок питания от телефона, например — все это дело вкусов и потребностей. Выпрямленное напряжение с трансформатора стабилизируется на микросхеме линейного стабилизатора L7805, ее можно заменить на отечественный аналог пяти вольтового линейного стабилизатора КР142ЕН5А, либо применить другу микросхему стабилизатора напряжения в соответствии с подключением ее в схеме (например LM317 или импульсные стабилизаторы LM2576, LM2596, MC34063 и так далее).
В качестве датчика цвета используется выше упомянутый модуль.
Устройство собиралось на макетной печатной плате для микроконтроллера Atmega8:
Алгоритм работы микроконтроллера следующий: вкратце это в начале инициализируются все настройки, потом запускается разрешение на прерывания, по внешним прерываниям считается количество импульсов частоты от датчика, когда сработает прерывание по переполнению таймера определенное количество раз (чтобы прошла 1 секунда), прерывания глобально запрещаются и происходит подсчет частоты и ее конвертация в нужное значение, а также вывод этого значения на дисплей, потом применяются настройки для другого фильтра датчика цвета, по завершении этих операций прерывания снова глобально разрешаются и происходит подсчет импульсов по внешним прерываниям и так далее по кругу перебирая все три фильтра фотодиодов. На экране отображается три значения цветов — красного, зеленого и синего. Калибровочные коэффициенты подбирались экспериментально многократными экспериментами с показаниями и прошивкой микроконтроллера. Исходный код прилагается ниже.
В итоге можно сказать следующее: при цене на датчик порядка 4 — 5 условных (что не так и мало для такого датчика) результаты определения цвета обычных предметов не так уж и точны. Особого применения такому датчику я так и не смог придумать, буду рад комментариям по этому поводу (можно, например, обучить своего робота выбирать предметы по цвету и манипулировать ими или что-то в этом роде по надобности). Поэтому эту схему отнес к ознакомительным и обучающим проектам, не несущим большой практической ценности.
Для программирования микроконтроллера ATmega8 необходимо знать конфигурацию фьюз битов (скриншот сделан в программе AVR Studio):
К статье прилагается прошивка для микроконтроллера Atmega8, проект протеус (вместо датчика цвета — генератор частоты), документация на датчик TCS3200, исходный код прошивки в программе AVR Studio, а также видео работы устройства на основе датчика цвета (на видео определяются цвета картонок, если ввести полученные данные в редактор цветов Paint, то можно заметить, что результаты более менее соответствуют действительности).
Источник