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

 

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

Автор: admin от 1-10-2018, 01:55, посмотрело: 156

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


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



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



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

прошлой раз, будем использовать STM32VLDISCOVERY. Подключение также не поменялось.



Настройка APDS-9960



Производим первоначальную настройку сенсора.



Вот так вот:





Что же здесь происходит? Давайте разбираться.



i2c1_write(APDS9960_CONTROL, DEFAULT_PGAIN);


PGAIN (Proximity Gain Control) — это параметр который управляет коэффициентом усиления чувствительности приближения. Присвоим ему значение 2, что соответствует усилению в четыре раза.



i2c1_write(APDS9960_GPENTH, DEFAULT_GPENTH);
i2c1_write(APDS9960_GEXTH, DEFAULT_GEXTH); 


GPENTH (Gesture Proximity Enter Threshold Register) — этот параметр устанавливает пороговое значение близости для определения начала распознавания жеста.



GEXTH (Gesture Exit Threshold Register), соответственно, устанавливает пороговое значение для определения окончания распознавания жеста.



i2c1_write(APDS9960_GCONF2, DEFAULT_GGAIN); 


В регистре GCONF2 (Gesture configuration two) мы явно устанавливаем только параметр GGAIN (Gesture Gain Control) в значение усиления в четыре раза.



i2c1_write(APDS9960_GPULSE, DEFAULT_PULSE_LENGTH);
i2c1_write(APDS9960_PPULSE, DEFAULT_PULSE_LENGTH); 


Подсветка. По умолчанию значение для источника тока ИК светодиода подсветки установлено в 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 с функциями работы с жестами и приближением.



GesturesSet(GESTURES_START); 


И сразу же начинаем отслеживать параметр GVALID. GVALID (Gesture FIFO Data) — это параметр регистра GSTATUS (Gesture Status Register), который, находясь в отличном от нуля состоянии, сообщает нам о том, что у сенсора имеются пригодные для использования данные о жестах.



Документация учит нас, что информация о жестах находится в буфере, в области оперативной памяти, которая в общем случае имеет размер 32 x 4 байт.



На практике, фактический размер этого буфера можно узнать прочитав значение регистра GFLVL (Gesture FIFO level), т.е. по моим сугубо эмпирическим экспериментальным наблюдениям, получается GFLVL*4. Как-то так:



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



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



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



GestureUp = i2c1_read(APDS9960_GFIFO_U);
GestureDown = i2c1_read(APDS9960_GFIFO_D);
GestureLeft = i2c1_read(APDS9960_GFIFO_L);
GestureRight = i2c1_read(APDS9960_GFIFO_R);


Распознавание жестов



Чтобы интерпретировать какой же именно жест произошел, произведем нехитрые вычисления:



GestUpDown = GestureUp-GestureDown;
GestLeftRight = GestureLeft-GestureRight; 


Для определения того какой же именно жест в данный момент случился нам важны не сами значения GestUpDown и GestLeftRight, а только лишь знак, так сказать, вещественного числа.



То есть, иными словами, принимая на вход отрицательные и положительные значения переменных GestUpDown и GestLeftRight определяем какой именно жест совершен.



Таблица истинности для переменных GestUpDown и GestLeftRight представлена на рисунке ниже



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



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



GesturesSet(GESTURES_STOP); 


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



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





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



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

Источник: Хабр / Интересные публикации

Категория: Программирование

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *