Распознавание цвета и уровня освещенности с помощью APDS-9960
Недавно на Habr.com промелькнула статья в которой, среди прочего, сообщалось о датчике освещенности. Некоторое время назад я нашел и приобрел интересную вещь — модуль производства фирмы RobotDyn на основе датчика APDS-9960, который тоже умеет измерять уровень освещенности. Поискав и не сумев отыскать упоминаний сего прибора на данном ресурсе, я решил, что это подходящий повод для написания статьи.
В статье мне бы хотелось в общих чертах познакомить читателей с возможностями которые предоставляет этот датчик и более подробно рассмотреть каким образом с его помощью можно определять цвет и измерять уровень освещенности.
Однако, прежде чем мы приступим к практической части, позвольте сперва несколько слов написать об общих возможностях APDS-9960.
Функциональная схема APDS-9960 представлена на рисунке ниже
Распознавание жестов
Представление о том как выглядит распознавания жестов на APDS-9960 очень неплохо показано на этом видео.
Функция обнаружения приближения
Судя по описанию из все той же документации, механизм обнаружения (приближения) работает по такому же точно принципу, что и распознавание жестов.
Распознавание цвета и уровень окружающего освещения (Color/ALS)
Графики на картинке выше взяты из документации на датчик, слева сверху представлена спектральная характеристика Color Sense (RGBC).
Сигнал RGBC фотодиодов накапливается в течение периода времени, установленного значением регистра ATIME. У SparkFun (в их «apds9960.h») это значение определено константой DEFAULT_ATIME и равно 219 что соответствует 103 ms.
Усиление регулируется в диапазоне от 1x до 64x и определяется настройкой параметра CONTROL AGAIN. Константа DEFAULT_AGAIN, равная, в свою очередь значению 1, что соответствует усилению в 4 раза.
Практическая часть
Итак, вся документация (чертеж, распиновка и принципиальная электрическая схема) на модуль доступна на сайте производителя.
Подключим наш модуль 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.
Функциональная схема APDS-9960 представлена на рисунке ниже
Распознавание жестов
Представление о том как выглядит распознавания жестов на APDS-9960 очень неплохо показано на этом видео.
Функция обнаружения приближения
Судя по описанию из все той же документации, механизм обнаружения (приближения) работает по такому же точно принципу, что и распознавание жестов.
Распознавание цвета и уровень окружающего освещения (Color/ALS)
Графики на картинке выше взяты из документации на датчик, слева сверху представлена спектральная характеристика Color Sense (RGBC).
Сигнал RGBC фотодиодов накапливается в течение периода времени, установленного значением регистра ATIME. У SparkFun (в их «apds9960.h») это значение определено константой DEFAULT_ATIME и равно 219 что соответствует 103 ms.
Усиление регулируется в диапазоне от 1x до 64x и определяется настройкой параметра CONTROL AGAIN. Константа DEFAULT_AGAIN, равная, в свою очередь значению 1, что соответствует усилению в 4 раза.
Практическая часть
Итак, вся документация (чертеж, распиновка и принципиальная электрическая схема) на модуль доступна на сайте производителя.
Подключим наш модуль 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 контакта.
Фото Пояснения Подключение к Flora:
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
Фото Пояснения Откройте пример ColorView и загрузите его на Arduino.
Запомните, какой именно серийный порт используется для вашего 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 в мониторе порта:
Демонстрация работы датчика
Внешний вид нашего макета: