Распознавание цвета и уровня освещенности с помощью APDS-9960
Недавно на Habr.com промелькнула статья в которой, среди прочего, сообщалось о датчике освещенности. Некоторое время назад я нашел и приобрел интересную вещь — модуль производства фирмы RobotDyn на основе датчика APDS-9960, который тоже умеет измерять уровень освещенности. Поискав и не сумев отыскать упоминаний сего прибора на данном ресурсе, я решил, что это подходящий повод для написания статьи.
В статье мне бы хотелось в общих чертах познакомить читателей с возможностями которые предоставляет этот датчик и более подробно рассмотреть каким образом с его помощью можно определять цвет и измерять уровень освещенности.
APDS-9960 — это датчик от компании Avago, он представляет собой комбинированный цифровой датчик с целым рядом разных интересных и полезных функций.
Он умеет распознавать жесты, определять приближение, а еще он умеет регистрировать интенсивность окружающего освещения и определять цвет.
Вот именно об этом и пойдет речь в данной статье — с помощью старенькой STM32VLDISCOVERY и APDS-9960 мы с Вами измерим освещенность и будем определять цвет во всем его богатстве оттенков Красного, Зеленого и Синего.
Однако, прежде чем мы приступим к практической части, позвольте сперва несколько слов написать об общих возможностях APDS-9960.
Функциональная схема APDS-9960 представлена на рисунке ниже
Распознавание жестов
Представление о том как выглядит распознавания жестов на APDS-9960 очень неплохо показано на этом видео.
В документации описан принцип регистрации жестов:
Для распознавания жеста используется четыре направленных фотодиода которые регистрируют отраженный свет (в ИК диапазоне) излучаемый встроенным светодиодом.
Функция обнаружения приближения
Судя по описанию из все той же документации, механизм обнаружения (приближения) работает по такому же точно принципу, что и распознавание жестов.
Распознавание цвета и уровень окружающего освещения (Color/ALS)
Согласно функциональной схеме, датчик определяет цвет/уровень освещенности с помощью соответствующих фотодиодов. Также заявлено, что APDS-9960 имеет встроенные фильтры блокирующие ультрафиолетовый и инфракрасный диапазоны.
Упрощенно это выглядит так: зарегистрированные фотодиодами сигналы измеряются с помощью АЦП, заносятся в буфер и затем данные отправляются по i2c.
Графики на картинке выше взяты из документации на датчик, слева сверху представлена спектральная характеристика Color Sense (RGBC).
Сигнал RGBC фотодиодов накапливается в течение периода времени, установленного значением регистра ATIME. У SparkFun (в их «apds9960.h») это значение определено константой DEFAULT_ATIME и равно 219 что соответствует 103 ms.
Усиление регулируется в диапазоне от 1x до 64x и определяется настройкой параметра CONTROL AGAIN. Константа DEFAULT_AGAIN, равная, в свою очередь значению 1, что соответствует усилению в 4 раза.
Практическая часть
Лично меня в APDS-9960 интересовала только функция Color/ALS, поэтому я решил рассмотреть ее наиболее подробно и написал небольшой код демонстрирующий ее работу.
Код я намеренно старался сделать максимально компактным, лаконичным и предельно простым для понимания; весь код целиком будет представлен в конце статьи.
Итак, вся документация (чертеж, распиновка и принципиальная электрическая схема) на модуль доступна на сайте производителя.
Подключим наш модуль APDS-9960 к STM32VLDISCOVERY
APDS9960 для связи с внешним миром использует интерфейс i2c, поэтому у STM32VLDISCOVERY задействуем шину I2C1 подключив вывод модуля SCL к ножке PB6, а вывод SDA, соответственно к ножке PB7. Не забываем подключить питание и общий провод. Прерывания в данном случае использоваться не будут, поэтому вывод Int можно не подключать. У меня на фото он подключен, но не используется.
А теперь немножко кода. Поскольку все общение с модулем происходит с помощью i2c, создадим необходимую конфигурацию и определим функции чтения/записи для i2c.
Описание
Датчик цвета позволяет определять цвет поверхности. По сути это два устройства в одном — трехцветный светодиод и датчик освещенности, которые можно использовать по отдельности.
Принцип работы: Датчик цвета имеет два основных компонента -трехцветный (RGB) светодиод, который излучает красный, синий и зеленый свет, а также светочувствительный датчик (фоторезистор), который определяет интенсивность падающего на него света.
Белый свет состоит из всех цветов радуги. Когда свет падает на поверхность, некоторые цвета поглощаются, а некоторые отражаются. Отраженные цвета – это цвета воспринимаемого нами объекта. Для измерения и определения количества цвета с помощью электронной схемы, вам необходимо измерить интенсивность различных длин волн света, отраженного от поверхности. Самый простой способ сделать это – осветить поверхность разными цветами и измерить, какой из цветов поверхность отражает лучше. Измеряя отраженный свет для каждого цвета можно вычислить цвет объекта.
Для улучшения результатов измерений следуйте следующим советам:
Подключение
Датчик использует два стандартных 3-пиновых разъема, однако, подключается не совсем обычно:
Коннектор 1 (без цветового обозначения) подключается в любой из портов IN контроллера "Трекдуино", сигнальный провод этой шины подключен к фоторезистору, поэтому, подключив только эту шину, вы сможете использовать датчик как датчик освещенности.
Коннектор 2 (с цветовой маркировкой) служит для управления трехцветным светодиодом. Каждый из проводов подключен напрямую соответствующему каналу светодиода. Наклейка с цветовой маркировкой на коннекторе указывает, к какому из каналов соответствует каждый из проводов. Подключается в любые три порта OUT и в любые порты IN контроллера "Трекдуино". Подключается горизонтально в верхнюю (сигнальную, «S») линию контактов.. Для того, чтобы использовать только RGB-светодиод, коннектор №1 все равно придется подключить, т.к. земляной провод (GND) общий для светодиода и фоторезистора.
Программирование
Блоки, необходимые для работы с датчиком цвета, расположены в группе блоков «Датчики».
Калибровка
Каждый раз при перезагрузке программы, использующей датчик цвета, в момент выполнения блока Настройка датчика цвета будет производится калибровка датчика под текущие условия освещения. Процедура калибровки выполняется следующим образом:
Для удобной работы с датчиком, сделайте 2 карточки 5х8 см. черного и белого цвета.
Что такое rgb датчик цвета
Датчик цвета позволяет определять цвет поверхности. По сути это два устройства в одном — трехцветный светодиод и датчик освещенности, которые можно использовать по отдельности.
Принцип работы: Датчик цвета имеет два основных компонента -трехцветный (RGB) светодиод, который излучает красный, синий и зеленый свет, а также светочувствительный датчик (фоторезистор), который определяет интенсивность падающего на него света.
Белый свет состоит из всех цветов радуги. Когда свет падает на поверхность, некоторые цвета поглощаются, а некоторые отражаются. Отраженные цвета – это цвета воспринимаемого нами объекта. Для измерения и определения количества цвета с помощью электронной схемы, вам необходимо измерить интенсивность различных длин волн света, отраженного от поверхности. Самый простой способ сделать это – осветить поверхность разными цветами и измерить, какой из цветов поверхность отражает лучше. Измеряя отраженный свет для каждого цвета можно вычислить цвет объекта.
Для улучшения результатов измерений следуйте следующим советам:
Подключение
Датчик использует два стандартных 3-пиновых разъема, однако, подключается не совсем обычно:
Коннектор 1 (без цветового обозначения) подключается в любой из портов IN контроллера «Трекдуино», сигнальный провод этой шины подключен к фоторезистору, поэтому, подключив только эту шину, вы сможете использовать датчик как датчик освещенности.
Коннектор 2 (с цветовой маркировкой) служит для управления трехцветным светодиодом. Каждый из проводов подключен напрямую соответствующему каналу светодиода. Наклейка с цветовой маркировкой на коннекторе указывает, к какому из каналов соответствует каждый из проводов. Подключается в любые три порта OUT и в любые порты IN контроллера «Трекдуино». Подключается горизонтально в верхнюю (сигнальную, «S») линию контактов.. Для того, чтобы использовать только RGB-светодиод, коннектор №1 все равно придется подключить, т.к. земляной провод (GND) общий для светодиода и фоторезистора.
Программирование
Блоки, необходимые для работы с датчиком цвета, расположены в группе блоков «Датчики».
Каждый раз при перезагрузке программы, использующей датчик цвета, в момент выполнения блока Настройка датчика цвета будет производится калибровка датчика под текущие условия освещения. Процедура калибровки выполняется следующим образом:
Для удобной работы с датчиком, сделайте 2 карточки 5х8 см. черного и белого цвета.
Ардуино: датчик цвета
В одном из предыдущих уроков — Ардуино: трехцветный светодиод — RGB — мы разобрали, что такое RGB и научились работать с трёхцветным светодиодом. В этом уроке мы разберёмся, как работать с датчиком цвета, научим нашу Ардуино распознавать красный, синий и зелёный и выведем полученные данные при помощи RGB-светодиода!
Как работает датчик цвета
Датчик TCS230, расположенный в центре платы, состоит из фотодиодов четырёх типов: 16 фотодиодов с красным фильтром, 16 фотодиодов с зелёным фильтром, 16 фотодиодов с синим фильтром и 16 фотодиодов без светофильтра . К датчику подносят образец одного из трёх цветов — красного, зелёного или синего. Образец освещается светодиодами на плате вокруг датчика. Датчик имеет преобразователь тока в частоту, он преобразует показания фотодиодов в квадратную волну с частотой, пропорциональной интенсивности света выбранного цвета. Эта частота затем считывается Arduino.
Распиновка на плате с датчиком TCS230 имеет следующее значение:
- GND – земля;
- OE – контакт включения;
- S1, S0 – настройка масштабирования частоты импульсов.
- S3, S2 – входной сигнал настройки фильтра;
- OUT – выходная частота;
- VCC – напряжение питания.
Для определения цвета, который будет считываться фотодиодами, датчик TCS230 оснащен контактами 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 |
Для Ардуино мы будем использовать масштабирование 20%.
Подключение датчика к Ардуино
Для визуального отображения определяемого цвета мы воспользуемся RGB-светодиодом. Схема должна работать следующим образом: к датчику подносят образец выбранного цвета и на светодиоде загорается тот же цвет.
TCS230 | GND | VCC | OUT | S0 | S1 | S2 | S3 |
Arduino Uno | GND | +5V | 8 | 4 | 5 | 6 | 7 |
Принципиальная схема:
Внешний вид макета:
Когда мы запустим программу и откроем монитор порта на скорости 9600 бод, то при поднесении к датчику образца мы увидим значения для каждого из трёх цветов и сообщение о том, какой цвет выбран. Следует заметить, что в случае, если сообщение о цвете не соответствует реальному цвету, то необходимо подредактировать значения частот в программе, подстраивая их по значениям R, G и B в мониторе порта:
Демонстрация работы датчика
Внешний вид нашего макета:
Распознавание цвета и уровня освещенности с помощью APDS-9960
Недавно на Habr.com промелькнула статья в которой, среди прочего, сообщалось о датчике освещенности. Некоторое время назад я нашел и приобрел интересную вещь — модуль производства фирмы RobotDyn на основе датчика APDS-9960, который тоже умеет измерять уровень освещенности. Поискав и не сумев отыскать упоминаний сего прибора на данном ресурсе, я решил, что это подходящий повод для написания статьи.
В статье мне бы хотелось в общих чертах познакомить читателей с возможностями которые предоставляет этот датчик и более подробно рассмотреть каким образом с его помощью можно определять цвет и измерять уровень освещенности.
APDS-9960 — это датчик от компании Avago, он представляет собой комбинированный цифровой датчик с целым рядом разных интересных и полезных функций.
Он умеет распознавать жесты, определять приближение, а еще он умеет регистрировать интенсивность окружающего освещения и определять цвет.
Вот именно об этом и пойдет речь в данной статье — с помощью старенькой STM32VLDISCOVERY и APDS-9960 мы с Вами измерим освещенность и будем определять цвет во всем его богатстве оттенков Красного, Зеленого и Синего.
Однако, прежде чем мы приступим к практической части, позвольте сперва несколько слов написать об общих возможностях APDS-9960.
Функциональная схема APDS-9960 представлена на рисунке ниже
Распознавание жестов
Представление о том как выглядит распознавания жестов на APDS-9960 очень неплохо показано на этом видео.
В документации описан принцип регистрации жестов:
Для распознавания жеста используется четыре направленных фотодиода которые регистрируют отраженный свет (в ИК диапазоне) излучаемый встроенным светодиодом.
Функция обнаружения приближения
Судя по описанию из все той же документации, механизм обнаружения (приближения) работает по такому же точно принципу, что и распознавание жестов.
Распознавание цвета и уровень окружающего освещения (Color/ALS)
Согласно функциональной схеме, датчик определяет цвет/уровень освещенности с помощью соответствующих фотодиодов. Также заявлено, что APDS-9960 имеет встроенные фильтры блокирующие ультрафиолетовый и инфракрасный диапазоны.
Упрощенно это выглядит так: зарегистрированные фотодиодами сигналы измеряются с помощью АЦП, заносятся в буфер и затем данные отправляются по i2c.
Графики на картинке выше взяты из документации на датчик, слева сверху представлена спектральная характеристика Color Sense (RGBC).
Сигнал RGBC фотодиодов накапливается в течение периода времени, установленного значением регистра ATIME. У SparkFun (в их «apds9960.h») это значение определено константой DEFAULT_ATIME и равно 219 что соответствует 103 ms.
Усиление регулируется в диапазоне от 1x до 64x и определяется настройкой параметра CONTROL AGAIN. Константа DEFAULT_AGAIN, равная, в свою очередь значению 1, что соответствует усилению в 4 раза.
Практическая часть
Лично меня в APDS-9960 интересовала только функция Color/ALS, поэтому я решил рассмотреть ее наиболее подробно и написал небольшой код демонстрирующий ее работу.
Код я намеренно старался сделать максимально компактным, лаконичным и предельно простым для понимания; весь код целиком будет представлен в конце статьи.
Итак, вся документация (чертеж, распиновка и принципиальная электрическая схема) на модуль доступна на сайте производителя.
Подключим наш модуль APDS-9960 к STM32VLDISCOVERY
APDS9960 для связи с внешним миром использует интерфейс i2c, поэтому у STM32VLDISCOVERY задействуем шину I2C1 подключив вывод модуля SCL к ножке PB6, а вывод SDA, соответственно к ножке PB7. Не забываем подключить питание и общий провод. Прерывания в данном случае использоваться не будут, поэтому вывод Int можно не подключать. У меня на фото он подключен, но не используется.
А теперь немножко кода. Поскольку все общение с модулем происходит с помощью i2c, создадим необходимую конфигурацию и определим функции чтения/записи для i2c.
Датчик цвета и Arduino
С использованием датчика цвета ваш Arduino может научиться распознавать цвета.
На данный момент один из лучших сенсоров цвета — TCS34725.
На многих датчиках на базе TCS34725 устанавливаются дополнительные чувствительные фотодиоды, которые минимизируют ультрафиолетовую составляющую спектра, что значительно увеличивает точность снятия показаний. Работа фильтра состоит в том, чтобы откинуть ультрафиолетовую компоненту освещения, так как человеческий глаз ее не воспринимает. В результате, точность распознавания цветов значительно увеличивается. Датчики цвета от компании Adafruit (работа с этим датчиком и рассматривается в дальнейшей статье), например, обладают потрясающим динамическим диапазоном: 3,800,000:1 (диапазон можно настраивать). Кроме того, регулируется коэффициент усиления.
TCS34725 RGB sensor имеет встроенный регулятор 3.3 В, так что вы можете запитывать модуль постоянным током в диапазоне от 3 до 5 В. I2C контакты работают с питанием логики 3.3 или 5 В. Кроме того, на модуле предусмотрен светодиод с MOSFET драйвером, который отображает цвет объекта, который вы «рассматриваете». Светодиод можно включать-отключать в зависимости от ваших потребностей.
Данный модуль производится в двух форм-факторах: версия для беспаечной монтажной платы (на рисунке слева) и версия крепежа к одежде и работы на базе Arduino Flora (на рисунке справа).
Сборка датчика цвета и подключение к Arduino
Датчик цвета в круглом форм-факторе можно подключить с помощью контактов с крокодилами на концах или с помощью токопроводящей нити.
Датчика цвета для беспаечной монтажной платы продается с нераспаянными рельсами для монтажа. Ниже приведена пошаговая инструкция по распайке рельс на модуль сенсора цвета. Если следовать этой небольшой инструкции, процесс пройдет быстро и безболезненно ;).
Датчик цвета подключается к Arduino с помощью I2C интерфейса. Для подключения будет использовано 4 контакта.
3.3 V -> 3 V (красный проводник)
GND -> GND (черный проводник)
SCL -> SCL (зеленый проводник)
5 V -> VIN (красный проводник)
GND -> GND (черный проводник)
SDA -> SDA (оранжевый проводник)
Примечание: На более старых версиях Arduino, таких как Duemilanove и предшественникам версии R3 UNO, SDA — это пин Analog 4, а SCL — Analog 5.
На версиях-предшественниках Arduino Mega R2, SDA находится на пине digital 21.
На платах Arduino Leonardo, SDA Находится на пине 2, а SCL — на digital 3.
Управляем светодиодом
(Только для версии датчика цвета для беспаечной монтажной платы). Светодиод можно отключить следующими способами:
1. Подключитесь к Земле для полного отключения.
2. Подключитесь к цифровому контакту на Arduino и управляйте его состоянием с помощью функции digitalWrite().
3. Подключите светодиод к пину INT и управляйте его состоянием с помощью setInterrupt() (более детальную информацию можно найти в даташите библиотеки).
Используем датчик цвета!
Установка библиотеки
Скачайте библиотеку Adafruit_TCS34725 с Github. Если вы устанавливаете дополнительную библиотеку впервые, рекомендуем почитать статью «Библиотеки и Arduino».
Тестируем датчик цвета
Запустите тестовый скетч TCS34725 для проверки работоспособности сенсора.
Загрузите скетч на ваш Arduino Uno или Flora и откройте окно серийного монитора, чтобы отследить результат. Скетч должен выводить в окне серийного монитора результат в виде строк с цветами (смотрите на рисунке ниже). Переместите, сенсор, чтобы оценить как он реагирует на различные источники света.
Параметры цвета выводятся в следующем формате:
- Цветовая температура — измеряется в Кельвинах;
- Уровень освещенности — Люкс или Люмен на квадратный метр;
- R, G и B (отфильтрованные) значения;
- Чистое (нефильтрованное) значение;
Скетч ColorView
Скетч ColorView предполагает отображение цвета с помощью встроенного светодиода. Белый светодиод используется для подсветки близко расположенных объектов, а датчик контролирует свет, отраженный от этого объекта. После этого скетч ColorView задействует RGB выходы и RGB светодиод отображает цвет объекта, который мы контролируем!
Подключение RGB светодиода
Помимо Arduino и датчика цвета, вам понадобится RGB светодиод и резисторы:
1 резистор на 1 КОм (Коричневый, Черный, красный и золотой);
2 резистора на 560 Ом (Зеленый, голубой, коричневый и золотой).
Кроме базового питания и I2C подключения, вам надо подключить:
Общий анод светодиода (длинная нога) -> 5 V;
«Красный» контакт светодиода -> резистор 1 КОм -> контакт 3 на Arduino;
«Зеленый» контакт светодиода -> резистор на 560 Ом -> контакт 5 на Arduino;
«Синий» контакт светодиода -> резистор На 560 Ом -> контакт 6 на Arduino;
Загрузите скетч ColorView на ваш Arduino и поэкспериментируйте, поднося к датчику объекты разных цветов. Светодиод должен угадывать цвет объекта!
Задействуем Processing!
В библиотеку Adafruit_TCS34725 Library включен скетч для Processing, с помощью которого скетч ColorView для Arduino взаимодействует с Processing и отображает цвет на вашем мониторе в режиме реального времени.
К сожалению, скетч для Processing работает только с версией Processing 1.5.1 и не совместим с версией Processing 2.0!
Датчик цвета и Processing
Запомните, какой именно серийный порт используется для вашего Arduino.
Библиотека Adafruit_TCS34725 — гайд по функциям
Объявление и инициализация:
Объявляем сенсор TCS34725, указывая время интегрирования и значения коэффициента усиления.
Инициализируем сенсор цвета TCS34725. Эта функция должна вызываться раньше остальных.
Усиление и время интегрирования:
void Adafruit_TCS34725::setIntegrationTime(tcs34725IntegrationTime_t it)
Устанавливаем время интегрирования для отдельных сэмплов цветов с датчика. Чем больше это значение, тем больше чувствительность датчика цвета при малых уровнях освещенности. Корректные значения приведены ниже:
Ардуино: датчик цвета
В одном из предыдущих уроков — Ардуино: трехцветный светодиод — RGB — мы разобрали, что такое RGB и научились работать с трёхцветным светодиодом. В этом уроке мы разберёмся, как работать с датчиком цвета, научим нашу Ардуино распознавать красный, синий и зелёный и выведем полученные данные при помощи RGB-светодиода!
Как работает датчик цвета
Датчик TCS230, расположенный в центре платы, состоит из фотодиодов четырёх типов: 16 фотодиодов с красным фильтром, 16 фотодиодов с зелёным фильтром, 16 фотодиодов с синим фильтром и 16 фотодиодов без светофильтра . К датчику подносят образец одного из трёх цветов — красного, зелёного или синего. Образец освещается светодиодами на плате вокруг датчика. Датчик имеет преобразователь тока в частоту, он преобразует показания фотодиодов в квадратную волну с частотой, пропорциональной интенсивности света выбранного цвета. Эта частота затем считывается Arduino.
Распиновка на плате с датчиком TCS230 имеет следующее значение:
- GND – земля;
- OE – контакт включения;
- S1, S0 – настройка масштабирования частоты импульсов.
- S3, S2 – входной сигнал настройки фильтра;
- OUT – выходная частота;
- VCC – напряжение питания.
Для определения цвета, который будет считываться фотодиодами, датчик TCS230 оснащен контактами 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 |
Для Ардуино мы будем использовать масштабирование 20%.
Подключение датчика к Ардуино
Для визуального отображения определяемого цвета мы воспользуемся RGB-светодиодом. Схема должна работать следующим образом: к датчику подносят образец выбранного цвета и на светодиоде загорается тот же цвет.
TCS230 | GND | VCC | OUT | S0 | S1 | S2 | S3 |
Arduino Uno | GND | +5V | 8 | 4 | 5 | 6 | 7 |
Принципиальная схема:
Внешний вид макета:
Программа:
Когда мы запустим программу и откроем монитор порта на скорости 9600 бод, то при поднесении к датчику образца мы увидим значения для каждого из трёх цветов и сообщение о том, какой цвет выбран. Следует заметить, что в случае, если сообщение о цвете не соответствует реальному цвету, то необходимо подредактировать значения частот в программе, подстраивая их по значениям R, G и B в мониторе порта:
Демонстрация работы датчика
Внешний вид нашего макета: