Датчик жестов, приближения, освещенности, цвета (Trema-модуль)
Trema-модуль Датчик жестов, приближения, освещенности, цвета — способен определять уровень освещённости в Lux (как общий, так и по трём каналам спектра — красный, зелёный, синий), приближение объектов (препятствий) и жесты (движение объектов влево, вправо, вверх, вниз, к датчику и от него). У более ранней модели APDS9930 имеются только функции определения приближения и уровня общей освещённости.
Видео:
Спецификация:
- Входное напряжение питания (VCC): 5В постоянного тока;
- Ток, потребляемый ИК-светодиодом через драйвер: 100 / 50 / 25 / 12.5 мА (устанавливается программно);
- Ток потребляемый модулем без учёта ИК-светодиода:
- В режиме измерений уровня освещённости: до 250 мкА;
- В режиме определения приближений: до 790 мкА;
- В режиме обнаружения жестов: до 790 мкА;
- В режиме ожидания: до 38 мкА;
- В спящем режима: до 10 мкА;
Все модули линейки «Trema» выполнены в одном формате
Подключение:
Для удобства подключения к Arduino воспользуйтесь Trema Shield, Trema Power Shield, Motor Shield или Trema Set Shield.
Модуль подключается к аппаратной шине I2C Arduino. Для удобства подключения, предлагаем воспользоваться TremaShield.
Модуль удобно подключать 4 способами, в зависимости от ситуации:
Способ — 1 : Используя проводной шлейф и Piranha UNO
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.
Способ — 2 : Используя Trema Set Shield
Модуль можно подключить к любому из I2C входов Trema Set Shield.

Способ — 3 : Используя проводной шлейф и Shield
Используя 4-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

Питание:
Напряжение питания модуля 5В постоянного тока, подаётся на выводы «VCC» и «GND» модуля.
Подробнее о модуле:
Модуль построен на базе датчика APDS9960, в состав которого входят:
- ИК-светодиод с программируемым драйвером;
- 4 фотодиода для обнаружения жестов;
- 3 фотодиода, реагирующих на разные спектры для определения цвета;
- 1 фотодиод общей освещённости;
- Уф- и ИК-фильтры;
- Усилители с программируемым коэффициентом усиления;
- МК;
- АЛУ;
- АЦП;
- ОЗУ;
- и множество дополнительных блоков.
Результаты освещённости в Lux выводятся с использованием эмпирической формулы для аппроксимации реакции человеческого глаза.
Распознавание жестов с помощью APDS-9960

Читая комментарии к моей предыдущей статье про APDS-9960, где речь шла про распознавание цвета и уровня освещенности для меня стали очевидными две вещи: 1) тема распознавания жестов интересна и 2) тема эта не раскрыта.
Действительно, если уж взялся за описание APDS-9960, то без рассмотрения жестов описание это выглядит несколько незавершенным. Поэтому я нашел свободное время, чтобы исследовать и эту тему тоже.
В данной статье я предлагаю Вашему вниманию обзор возможностей для распознавания жестов которые предоставляет сенсор APDS-9960.
В статье будет рассмотрен механизм настройки сенсора, сбор данных, их обработка и представление. Вы сами сможете убедиться в том насколько это просто — работать с жестами с помощью APDS-9960.
Как и в прошлый раз, статья будет сопровождаться кодом, все происходящее в котором будет подробно описано. Полная версия кода доступна в конце статьи.
Сразу небольшая ремарка: встроенного автоматического механизма определения жестов у APDS-9960 не предусмотрено; то есть такого, чтобы прям вот, прочитал, значит, регистр, а там уже и жест обработанный лежит — такого в APDS-9960 нет; а это означает, что придется писать свой алгоритм интерпретации жестов, чем впоследствии и займемся.
Вообще, это одновременно и хорошо и не очень. Не очень — потому что может усложнить исследование данного сенсора для начинающего, а хорошо, потому что, вкупе с данными о приближении, можно, изощряясь, вообще напридумывать собственных жестов различных каких угодно разнообразных и всяких.
Но, поскольку данная статья несет лишь обзорную функцию, мы ограничимся только базовыми UP-DOWN-LEFT-RIGHT жестами.
Ну что же, приступим.
Теория
Позволю себе чуточку матчасти.
Для получения необходимой информации о движении и направлении движения в APDS-9960 используются ИК светодиод и четыре фотодиода, которые, как наглядно проиллюстрировано на рисунке ниже, регистрируют сигналы в диапазоне ближнего ИК (NIR).

ИК светодиод (LED) несет функцию подсветки, а фотодиоды (UDLR) регистрируют отраженный от «препятствия» свет.
Фотодиоды расположены на сенсоре таким образом, что в зависимости от направления движения «препятствия», соответствующий фотодиод получит большую часть отраженного ИК-сигнала на входе и меньшую часть на выходе. В то же время документация на APDS-9960 недвусмысленно подсказывает нам, что интерпретировать направление движения можно измеряя и сравнивая амплитуду и разность фаз сигналов с фотодиодов UDLR.

Практика
Для работы с APDS-9960, как и в прошлой раз, будем использовать STM32VLDISCOVERY. Подключение также не поменялось.
Производим первоначальную настройку сенсора.
Что же здесь происходит? Давайте разбираться.
PGAIN (Proximity Gain Control) — это параметр который управляет коэффициентом усиления чувствительности приближения. Присвоим ему значение 2, что соответствует усилению в четыре раза.
GPENTH (Gesture Proximity Enter Threshold Register) — этот параметр устанавливает пороговое значение близости для определения начала распознавания жеста.
GEXTH (Gesture Exit Threshold Register), соответственно, устанавливает пороговое значение для определения окончания распознавания жеста.
В регистре GCONF2 (Gesture configuration two) мы явно устанавливаем только параметр GGAIN (Gesture Gain Control) в значение усиления в четыре раза.
Подсветка. По умолчанию значение для источника тока ИК светодиода подсветки установлено в 0, что соответствует току в 100 мА, нас это вполне устроит — менять не будем.
ИК подсветка в APDS-9960 представляет собой последовательность импульсов и характеризуется соответствующими параметрами регистров для жестов GPULSE (Gesture pulse count and length): GPLEN (Gesture Pulse Length) и GPULSE (Number of Gesture Pulses), а также приближения PPULSE (Proximity Pulse Count Register): PPLEN (Proximity Pulse Length) и PPULSE (Proximity Pulse Count) задающими количество импульсов и период каждого отдельного импульса.
Определим, что GPLEN и PPLEN примут значение 2 равное 16 мкс, а GPULSE и PPULSE значение 9, которое соответствует 10 импульсам.
Как видите, настройка оказалась ненамного сложнее аналогичной для распознавания цветов и освещения из предыдущего обзора APDS-9960.
Теперь переместимся в основной цикл программы, в котором начнем то и дело регистрировать и интерпретировать данные с фотодиодов, а также научимся находить отличия одного жеста от другого.
Перво-наперво, стартуем APDS-9960 с функциями работы с жестами и приближением.
И сразу же начинаем отслеживать параметр GVALID. GVALID (Gesture FIFO Data) — это параметр регистра GSTATUS (Gesture Status Register), который, находясь в отличном от нуля состоянии, сообщает нам о том, что у сенсора имеются пригодные для использования данные о жестах.
Документация учит нас, что информация о жестах находится в буфере, в области оперативной памяти, которая в общем случае имеет размер 32 x 4 байт.
На практике, фактический размер этого буфера можно узнать прочитав значение регистра GFLVL (Gesture FIFO level), т.е. по моим сугубо эмпирическим экспериментальным наблюдениям, получается GFLVL*4. Как-то так:

Ну и как следует из названия буфера, данные в нем располагаются в порядке First In — First Out. То есть, грубо говоря, чем «раньше» поступил сигнал с каждого из фотодиодов тем «выше» в GFLVL он располагается.
Данные с фотодиодов (UDLR) можно прочитать из соответствующих регистров Gesture FIFO Register:
— GFIFO_U (Gesture FIFO Data, UP)
— GFIFO_D (Gesture FIFO Data, DOWN)
— GFIFO_L (Gesture FIFO Data, LEFT)
— GFIFO_R (Gesture FIFO Data, RIGHT)После каждого чтения значений из этих регистров, GFLVL декрементируется; таким образом, по хорошему, необходимо произвести чтение полностью всего буфера до момента пока GFLVL не достигнет нуля.
Для определения жестов нам понадобятся только первые четыре байта этого буфера, не больше. Поэтому и прочитаем мы только их.
Чтобы интерпретировать какой же именно жест произошел, произведем нехитрые вычисления:
Для определения того какой из жестов в данный момент случился нам важны не сами значения GestUpDown и GestLeftRight, а только лишь знак, так сказать, вещественного числа.
То есть, иными словами, принимая на вход отрицательные и положительные значения переменных GestUpDown и GestLeftRight определяем какой жест совершен.
Таблица истинности для переменных GestUpDown и GestLeftRight представлена на рисунке ниже

Теперь обнулим GFLVL:
… и вернемся в начало основного цикла программы.
А теперь весь код целиком:
Хочу отметить, что механизм жестов у APDS-9960 работает очень даже неплохо. Распознавание стабильное, хорошо работают встроенные в APDS-9960 UV and IR фильтры.
Надеюсь, данный материал кому-нибудь окажется полезен. Спасибо за внимание.
APDS-9960 light and gesture sensor
When compiling your build add the following to user_config_override.h :
Broadcom APDS-9960 is a digital RGB, ambient light, proximity and gesture sensor device in a single 8-pin package. The device has an I2C compatible interface providing red, green, blue, clear (RGBC), proximity and gesture sensing with IR LED. The RGB and ambient light sensing feature detects light intensity under various lighting conditions and through various attentuation materials including darkened glass. In addition, the integrated UV-IR blocking filter enables accurate ambient light and correlated color temperature sensing.
Configuration
Wiring
Breakout ESP VCC/VIN +3.3VDC GND GND SCL GPIOy SDA GPIOx INT/IRQ not used Tasmota Settings
In the Configuration -> Configure Module page assign:
- GPIOx to I2C SDA
- GPIOy to I2C SCL
After configuring the GPIO’s the driver will detect the APDS-9960 automatically. On first boot sensor will start in gesture mode. It will not appear in the webUI but it can be observed via MQTT messages in console:
When you enable RGBC mode with Sensor27 0 sensor will show up in web UI:
Commands
Command Value Description Sensor27 Show APDS9960 gesture/RGBC mode Sensor27 0 / off Disable APDS9960 gesture mode/Enable RGBC mode Sensor27 1 / on Enable APDS9960 gesture mode/Disable RGBC mode Sensor27 2 / on Enable APDS9960 gesture mode/Disable RGBC mode with half gain Sensor27 3 . 255 Set ATIME register for different integration times Example Rules
Device will be in RGBC mode until something is close to it, then it switches into gesture mode for 60 seconds.
Relay ON when ambient light is below 100 lux.
Control ON/OFF, brightness and color temperature with gestures
Known Issues
The different PCB’s on the market seem to differ quite substantially regarding to their electrical characteristics. We have at least one case report, where this led to a malfunction on an ESP8266-board within Tasmota but in another library too. The exact technical reason can only be suspected, but it is probably related to electrical noise and/or power consumption.
In the case from above the sensor measured an incorrect high proximity value, which resulted in repeated triggering of a «LONG» gesture. The solution was to decrease the gain factor for proximity and gesture. Therefore the argument 2 ( sensor27 2 ) was introduced to change this at runtime.
If you experience gesture sensing problems you could try this out, but if you measure proximity values <25 with nothing in front of the sensor (e.g. web interface after sensor27 0 ), then there is very likely another problem. It can be assumed, that the gesture sensitivity will suffer with reduced gain, so first try option 1 (=default).
Beside that better wiring and maybe an additional capacitor over VCC and GROUND might be helpful.The measurement of the light level is briefly described in the datasheet and the open-source-libraries use the ambient-light-value directly from the sensor or calculate a LUX-value from RGB. Both variants are usable and differentiate between low and strong light, but the absolute values are questionable and at the moment we have an uncalibrated sensor.
All known solutions use a fixed integration time, which is more or less the same as a fixed exposure time in photography. In contrast the TSL2561-library uses various integration times and maybe this is possible on the APDS9960 too.
To eventually achieve this in the future, the option to set this integration time at runtime was added. Every argument between 3 and 255 sets the ATIME-register.
The formula is: integration time = (256-ATIME)2,78 ms, so with the default value of 219 we get (256-219)2,78 = 102,86 ms. That means a smaller ATIME makes the integration time longer and more photons are captured, which might be usable for (very) low light conditions, because otherwise the sensor will saturate too early. The opposite is valid for a bigger ATIME value.
The change of this value only makes sense for: users who need to change the sensitivity, if the sensor resides behind dark glass or want to contribute to the development of a new LUX-calculation in the driver. If we get enough feedback, this could lead to an improvement on the software side. Feel free to open (or search for) an issue, if you have measured the APDS9960 against other devices with different ATIME-values at different light levels. This is not a trivial task though.Датчик жестов Ардуино APDS-9960 подключение
Датчик распознавания жестов GY-9960 APDS Arduino — это модуль со встроенным сенсором, который обеспечивает обнаружение света и цвета, определение приближения и бесконтактное распознавание жестов. С помощью этого модуля простым жестом руки можно управлять роботами, освещением и другими устройствами. Рассмотрим, как подключить SparkFun APDS 9960 модуль распознавания жестов к плате Ардуино.
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- сенсор SparkFun APDS-9960
- дисплей lcd 1602 i2c
- коннекторы
- библиотека SparkFun_APDS9960.h и LiquidCrystal_I2C.h
Датчик жестов GY-9960 APDS SparkFun имеет встроенный датчик окружающего освещения, ультрафиолетовый и инфракрасный фильтр, четыре отдельных фотодиода (приемники, которые обнаруживают ИК-излучение, отраженное от объекта) и ИК-светодиод (передатчик). Когда мы делаем жест рукой, датчик получает отраженное ИК-излучение, а микроконтроллер Arduino вычисляет направление движения руки.
APDS-9960 Arduino характеристики, распиновка

Характеристики APDS-9960 (datasheet)
- Напряжение питания: 3,3 В
- Адрес I2C: 0x39
- Обнаружение приближения
- Обнаружение жестов
- Окружающее освещение и определение цвета RGB
- Рабочий диапазон: от 10 до 20 см
На передней панели модуля находятся 2 перемычки PS и I2C PU:
PS — эта перемычка подключает питание к модулю и ИК-светодиоду. Когда перемычка замкнута, питание должно подаваться только на вывод VCC на модуле. Когда перемычка разомкнута, для включения ИК-светодиода необходимо подать отдельное питание на вывод VL датчика SparkFun от Ардуино. По умолчанию эта перемычка замкнута.
I2C PU — эта перемычка используется для подключения подтягивающих резисторов к линиям SDA и SCL. Если резисторы не требуются, разомкните перемычку.
Как подключить датчик жестов APDS-9960 Ардуино

APDS-9960 i2c Arduino Uno Arduino Nano Arduino Mega GND GND GND GND VDD 5V 5V 5V SDA A4 A4 20 SCL A5 A5 21 Датчик способен определять общий уровень освещенности в люксах или уровень освещенности в трех каналах спектра — красном, зеленом, синем (RGB). Определяет приближение и удаление объекта от сенсора, простые жесты рукой (движение влево, вправо, вверх, вниз). Для работы с модулем необходимо установить библиотеку APDS9960.h, а после сборки схемы загрузите следующую программу в плату Arduino.
Скетч для распознавания жестов с помощью APDS-9960
Подключение датчика APDS-9960 к Ардуино с дисплеем

LCD 1602 i2c Arduino Uno Arduino Nano Arduino Mega GND GND GND GND VDD 5V 5V 5V SDA A4 A4 20 SCL A5 A5 21 Скетч для датчика APDS-9960 с дисплеем LCD 1602
Заключение. Датчик GY 9960 LLC легко определяет приближение и удаление объекта, простые жесты, свет и цвета (яркость цветовых значений RGB). В библиотеке SparkFun_APDS9960.h есть другие примеры, демонстрирующие возможности датчика. Например, скетч AmbientLightInterrupt позволяет измерять окружающее освещение, а пример ColorSensor считывает значения красного, зеленого и синего света.
