Apds 9960 как использовать
Перейти к содержимому

Apds 9960 как использовать

Распознавание жестов с помощью APDS-9960

image

Читая комментарии к моей предыдущей статье про APDS-9960, где речь шла про распознавание цвета и уровня освещенности для меня стали очевидными две вещи: 1) тема распознавания жестов интересна и 2) тема эта не раскрыта.

Действительно, если уж взялся за описание APDS-9960, то без рассмотрения жестов описание это выглядит несколько незавершенным. Поэтому я нашел свободное время, чтобы исследовать и эту тему тоже.

В данной статье я предлагаю Вашему вниманию обзор возможностей для распознавания жестов которые предоставляет сенсор APDS-9960.

В статье будет рассмотрен механизм настройки сенсора, сбор данных, их обработка и представление. Вы сами сможете убедиться в том насколько это просто — работать с жестами с помощью APDS-9960.

Как и в прошлый раз, статья будет сопровождаться кодом, все происходящее в котором будет подробно описано. Полная версия кода доступна в конце статьи.

Сразу небольшая ремарка: встроенного автоматического механизма определения жестов у APDS-9960 не предусмотрено; то есть такого, чтобы прям вот, прочитал, значит, регистр, а там уже и жест обработанный лежит — такого в APDS-9960 нет; а это означает, что придется писать свой алгоритм интерпретации жестов, чем впоследствии и займемся.

Вообще, это одновременно и хорошо и не очень. Не очень — потому что может усложнить исследование данного сенсора для начинающего, а хорошо, потому что, вкупе с данными о приближении, можно, изощряясь, вообще напридумывать собственных жестов различных каких угодно разнообразных и всяких.

Но, поскольку данная статья несет лишь обзорную функцию, мы ограничимся только базовыми UP-DOWN-LEFT-RIGHT жестами.

Ну что же, приступим.

Теория

Позволю себе чуточку матчасти.

Для получения необходимой информации о движении и направлении движения в APDS-9960 используются ИК светодиод и четыре фотодиода, которые, как наглядно проиллюстрировано на рисунке ниже, регистрируют сигналы в диапазоне ближнего ИК (NIR).

image

ИК светодиод (LED) несет функцию подсветки, а фотодиоды (UDLR) регистрируют отраженный от «препятствия» свет.

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

image

Практика

Для работы с 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. Как-то так:

image

Ну и как следует из названия буфера, данные в нем располагаются в порядке 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 представлена на рисунке ниже

image

Теперь обнулим GFLVL:

… и вернемся в начало основного цикла программы.

А теперь весь код целиком:

Хочу отметить, что механизм жестов у APDS-9960 работает очень даже неплохо. Распознавание стабильное, хорошо работают встроенные в APDS-9960 UV and IR фильтры.

Надеюсь, данный материал кому-нибудь окажется полезен. Спасибо за внимание.

Управляемый жестами светильник на Arduino, WS2812B и APDS9960.

Всем привет.
Я рад , что могу снова показать Вам свои наработки.
На этот раз я собрал светильник на ардуино управляемый жестами.
Данный проект отнял у меня очень много времени, которого у меня и так всегда не хватает.
Первый вариант светильника я собрал очень быстро и он прекрасно работал у меня на макетной плате, но когда я перенес его на постоянное место в корпус, вот тут все и началось, вылезли все проблемы с подвисаниями, ложными срабатываниями и прочими неприятностями. Погуглив в интернете, я нашел на иностранных сайтах, множество жалоб связанных с проблемами датчика APDS9960, но не нашел решений этих проблем. Пришлось понемножку тратить время на изучения Datasheet этого датчика и на понимание его работы. Что в конце концов это принесло свои плоды и я смог написать стабильно работающий код.
И так все по порядку

Описание светильника
Основной упор в этом светильнике я сделал не на визуализацию, а на управление жестами, все остальные функции второстепенные.

Включается светильник жестами влево или в право, а так же можно включить и жестом на себя, но это не совсем удобно. Далее жестами влево и в право можно перелистывать световые эффекты. Если начать листать вправо, то лампа сначала будет менять свои цвета от белого до красного, включая все основные цвета и переходы между ними.
Если после включения лампы начнем листать влево, то увидим динамические световые эффекты, такие как «Огонь» , «Матрица», «Лава лампа», «Радуга», «Конфетти», «Искры», «Огненный светильник». Если Вам нужно вернуться на обычный светильник, то вместо перелистывания, можно выключить лампу жестом от себя и включить любым из трех жестов.

Выключение производится жестом от себя.

Яркость регулируется жестом приближения и отдаления от датчика. Сначала нужно поднести ладонь на максимально близкое расстояние к сенсору, а потом резко поднять вверх. Светильник перейдет в режим регулировки яркости, приближая и отдаляя ладонь, нужно найти подходящую яркость и зафиксировать руку на пару секунд, для того что бы значение яркости сохранилось. Когда яркость сохранится, светильник даст об этом знать, плавным выключением света с последующим включением уже с новым уровнем яркости.

Я не уделял особого внимания визуальным эффектам, так как планирую сделать вторую версию лампы на контроллере Wemos D1 mini. В которой планирую довести все до идеала. По этой же причине я пока использую только одну линейку светодиодов, состоящую из 4 планок ws2812b, вместо четырех.

Прерывания APDS9960
Собственно основные проблемы светодиодной лампы связаны именно с ним. Прерывания в apds9960 живут своей жизнью, может сработать от чего угодно например от ЭМ помехи или от нахождения рядом с датчиком человека, от пульсации по питанию и возможно от чего то еще.

Сначала попробовал исправить проблему изменениями в железе. Фильтрация питания не помогла, даже от аккумулятора 18650 датчик все равно продолжал жить своей жизнью. Попробовал переключить нагрузочный резистор сигнала INT на +5В и это тоже не принесло успеха.

По мере изучение пришло понимание, от чего происходят ложные срабатывания прерываний. Основная проблема это случайные отражения ИК сигнала. Производитель рекомендует покрыть датчик и все вокруг него черным резиновым напылением. У меня нет такой краски и я не стал с этим заморачиваться. Хотя наверняка это могло бы немного уменьшить число ложных срабатываний.

Я написал код который фильтрует все случайные срабатывания, но столкнулся еще с одной проблемой. После срабатывания прерывания информация о жесте передается по шине I2C не моментально, а имеет определенную задержку. А если питание из-за адресной светодиодной ленты зашумлено, то время передачи с учетом этих помех всегда будет разным. Пришлось учитывать этот факт и по новой переписывать код определения жестов.

Определение жеста
Если в коде не использовать прерывание от датчика, то с определением жеста нет ни каких проблем. Но в таком случаи теряется многозадачность. Если на лампе включен динамический эффект, то соответственно он требует цикличного, постоянно исполняемого кода и что бы вывести контроллер из цикла, потребуется использование прерываний.

Для того, что бы улучшить стабильность распознавания жестов, так же пришлось в библиотеке уменьшить чувствительность приемника. Для этого нужно в файле SparkFun_APDS9960.h заменить строку:
if( !setLEDBoost(LED_BOOST_300) )
на
if( !setLEDBoost(LED_BOOST_150) )

Если Вы скачали библиотеку из этой статьи, то ничего делать не нужно, там уже все исправлено.
Я так же экспериментальным путем подобрал ток светодиода 50 мА, при котором жесты определяются наиболее стабильно и нет надобности насиловать инфракрасный светодиод, током 100 мА.

А так же я допустил ошибку, разместив микроконтроллер в нижней части светильника, а датчик жестов в на верхней крышке. Из-за этого, для соединения arduino и apds9960, пришлось использовать провода длинной 30 см. Что тоже добавило дополнительной нестабильности работы датчика. В итоге я программным путем победил все эти проблемы.

Схема
Для питания устройства я использую зарядное устройство от моего смартфона, с напряжением выхода 5В и током 2А. Но на самом деле светильник при включенном белом свете на максимальной яркости, не потребляет выше 1,3 А. По этому подойдет любой источник питания с выходным током не менее 1,3А.

Стабилизатор dc-dc mini360, можно заменить на любой другой понижающий преобразователь напряжения, с выходным током не менее 150 мА.

В нижеприведенной схеме я не использую преобразователь логических уровней, но это мое личное решение и по этому я заранее снимаю с себя ответственность, в том случаи если у Вас выйдет из строя сенсор APDS9960, подключенный без преобразователя TTL уровней.

Вместо Ардуино Нано можно использовать контроллер Arduino UNO или его клоны.

Обязательно проверьте на датчике жестов наличие перемычек, они отмечены красным цветом на фотографии ниже. В случаи их отсутствия следует паяльником на эти контактные дорожки, нанести и разогреть припой, до образования однородной капли. Сейчас китайцы поставляют эти датчики без перемычек. Без указанных перемычек работа датчика не гарантируется.

Программный код для Ардуино
Код разбит на две части. В первой части находится основной код, который работает с сенсором, а во второй части находится код всех световых эффектов.

Вы можете сами добавить любой эффект по аналогии с моим кодом, но главное не забудьте добавить функцию выхода по жесту из зацикленного эффекта. Для этого нужно добавить в конце цикла, следующую строку if(check_int()) return;

Описание основных функций программы
processingGesture() обрабатывает прерывания от датчика жестов.
processingProximity() обрабатывает прерывания от датчика приближения.
gesture_int() — обработчик прерывания от датчика жестов.
proximity_int() — обработчик прерывания от датчика приближения.

Описание констант
APDS9960_INT — вход для внешнего прерывания. В Arduino Nano и UNO всего два таких входа, 2 и 3.
PIN — здесь нужно указать выход на светодиодную ленту. Можно указывать любой цифровой пин к которому подключены планки ws2812b.
NUM_PIX — здесь указываем количество адресных светодиодов в используемой ленте.
range — предел погрешности от 0 до 10. Если при регулировке яркости зафиксировать руку над датчиком на 2 сек, то показания должны сохраниться, если же показания не сохраняются, то увеличивайте постепенно предел погрешности.

Видео демонстрирующее работу светильника

Итоги
Светильник в живую выглядит лучше чем на видео. Теперь все кто увидел его у меня, просят собрать им такой же. На данный момент мне не нравится как работает регулировка яркости, но я над этим работаю. Не обещаю, что скоро, но уже в разработке следующая версия светильника.

Спасибо, что дочитали статью до конца! Если у Вас остались вопросы, можете задать в комментарии под статьей, регистрация не требуется.

Apds 9960 как использовать

Многофункциональный датчик APDS-9960 позволяет определять цвет поверхности (как этот детектор), оценивать расстояние до препятствия и распознавать простые жесты. Датчик был приобретен на Али за 3 доллара (200 рублей). Датчик традиционно для Китая поставляется в антистатическом пакете.

Многофункциональный датчик для Ардуино APDS-9960

Габаритные размеры устройства 25 х 17 мм, на плате имеются два крепежных отверстия диаметром по 3 мм, расстояние между центрами отверстий 11 мм. Масса датчика 1,4 г. На плате модуля имеется инфракрасный светодиод, тусклое свечение которого вполне можно заметить невооруженным глазом, даже в условиях не слишком яркого дневного освещения, для лучшей заметности следует использовать сильную лупу. Излучение светодиода отражается от исследуемой поверхности и попадает на группу фотодиодов. С другими устройствами взаимодействие происходит по интерфейсу I2C.

Многофункциональный датчик для Ардуино APDS-9960

Подключение многофункционального датчика

Плата устройства имеет 5 контактов:

  • VCC – питание 3,3 В,
  • GND – общий провод,
  • INT – вывод для сигнала прерывания,
  • SDA и SCL – контакты интерфейса I2C [1-4].

Многофункциональный датчик для Ардуино APDS-9960

В простейшем случае использовать датчик можно с неподключенным контактом INT.

Многофункциональный датчик для Ардуино APDS-9960

Модуль потребляет ток 160-140 мкА при напряжении 3,3 В.

Многофункциональный датчик для Ардуино APDS-9960

Для работы с данным устройством написана специальная библиотека SparkFun_APDS-9960_Sensor_Arduino_Library-master [5-6]. К ней прилагается ряд примеров, иллюстрирующих работу устройства в разных режимах. Программа ColorSensor позволяет отличать цвет поверхности. В качестве подопытных поверхностей были использованы папки трех цветов.

Многофункциональный датчик для Ардуино APDS-9960

Экспериментально установлено, что для надежного распознавания цветов расстояние между поверхностью и датчиком должно составлять 1,5-2 см.

Красная папка

Многофункциональный датчик для Ардуино APDS-9960

Зеленая папка

Многофункциональный датчик для Ардуино APDS-9960

Синяя папка

Многофункциональный датчик для Ардуино APDS-9960

Во всех случаях цвет определяется правильно, хотя красная поверхность отличается от зеленой сильнее, чем отличаются друг от друга синяя и зеленые поверхности. Возможно, это связано с тем, что во время опытов поверхность папок дополнительно освещалась белой холодной светодиодной лампой. Во всяком случае, датчик в данных условиях и белую писчую бумагу объявляет красной, хотя в этом случае разница сигналов по разным каналам не велика.

Многофункциональный датчик для Ардуино APDS-9960

Аналогичный результат дает и черная шероховатая поверхность бокса CD-диска, разумеется в этом случае общая яркость отраженного сигнала гораздо меньше.

Многофункциональный датчик для Ардуино APDS-9960

Особенно приятно удивило то, что надежно опознается цвет не только поверхностей большой площади, но и цвет сравнительно небольших предметов.

Многофункциональный датчик для Ардуино APDS-9960

Красная рукоятка отвертки

Многофункциональный датчик для Ардуино APDS-9960

Синяя рукоятка отвертки

Многофункциональный датчик для Ардуино APDS-9960

Зеленый кистевой эспандер

Многофункциональный датчик для Ардуино APDS-9960

Хотя для случая локальных предметов разница в сигнале по разным цветовым каналам меньше, тем не менее, во всех случая цвет с расстояния в 1,5 – 2 см распознается уверенно. Программа AmbientLightInterrupt также замеряет общую освещенность и освещенность по трем цветовым каналам, но с использованием прерывания.

Многофункциональный датчик для Ардуино APDS-9960

Программа ProximitySensor позволяет измерять расстояние до препятствия в диапазоне от 5 до 40 см, результат измерения представляется числом от 0 до 255.

Многофункциональный датчик для Ардуино APDS-9960

Программа ProximityInterrupt реагирует на приближение препятствия, на расстояние 20 см и меньше, программа использует прерывание.

Многофункциональный датчик для Ардуино APDS-9960

Программа GestureTest позволяет распознавать простые жесты. При этом данная программа наиболее надежно распознает жесты “LEFT” и “RIGHT”. При использовании датчика для распознавания жестов следует двигать рукой плавно, без резких движений.

Многофункциональный датчик для Ардуино APDS-9960

В целом отличный датчик, не нуждающийся, в какой-либо сложной настройке, при правильном включении начинает работать сразу и надежно выполняет заявленные функции.

Полезные ссылки

  1. www.theorycircuit.com/arduino-gesture-sensor-apds-9960/
  2. www.youtube.com/watch?v=0iagZdvaxV8
  3. de-news.net/online/датчик-жестов-apds-9960-подключение-к-arduino-0iagZdvaxV8.html
  4. elekt.tech/arduino/sensors/datchik-zhestov-osveshhennosti-tsveta-i-priblizheniya-apds-9960-dlya-arduino.html
  5. github.com/sparkfun/SparkFun_APDS-9960_Sensor_Arduino_Library
  6. iarduino.ru/file/308.html

Файлы управления модуля тут. Автор обзора датчика – Denev.

Добавить комментарий

Ваш адрес email не будет опубликован.