Все чаще в устройствах бытовой электроники устанавливают датчики жестов, например, в смартфонах, в телевизорах, в игровых приставках и даже в кухонной технике.
По сравнению с сенсорными экранами, управление жестами не представляет серьезной проблемы если пользователь носит перчатки. К тому же подобный датчик позволяет добавить в управление третье измерение, в то время как сенсорные экраны могут работать только в двух измерениях.
Одним из недорогих датчиков жестов, созданный компанией PixArt Imaging, является PAJ7620U2. В одном корпусе датчика содержится как передатчик инфракрасного света, так и весь оптический тракт для приема отраженного света. Система разработана с учетом механизмов энергосбережения, что позволяет использовать датчик PAJ7620U2 в устройствах с батарейным питанием. Кроме того, он обеспечивает работу при внешней освещенности до 100 kLux.
Датчик PAJ7620U2 способен распознавать 9 различных жестов: (вверх, вниз, влево, вправо, толчок, тяга, по часовой стрелке, против часовой стрелки, взмах). Движения руки определяются в диапазоне от 5 до15 см от датчика, при этом угол обзора составляет 60°. Скорость движения, поддерживаемая датчиком, составляет 60-600°/с в обычном режиме или 60-1200°/с в игровом режиме. Датчик обменивается данными по I2C шине.
Модули с датчиком PAJ7620U2
Датчик PAJ7620U2 доступен в виде модулей, которые позволяют легко подключить его к популярным платформам разработки, таким как Arduino, Raspberry Pi или STM32.
В данном проекте мы будем использовать небольшой и недорогой модуль с маркировкой GY‑PAJ7620U2. Плата предоставляет только I2C шину, а это значит, что мы можем работать только в режиме распознавания жестов. Помимо датчика на плате имеется стабилизатор для питания датчика. Модуль может питаться напряжением в диапазоне от 2,8 В до 3,3 В. Среди выводов разъема есть контакт INT, который можно использовать для передачи прерывания от датчика к микроконтроллеру.
В этой статье мы приведем скетч для Arduino, позволяющий считывать жесты с сенсора PAJ7620U2. Затем подключим к системе OLED-дисплей modOLED130_I2C BLUE диагональю 1,3″ с драйвером SH1106 и шиной I2C. На дисплее будут отображаться названия жестов.
В качестве основного модуля проекта использована плата Maker Uno. Она полностью совместим с Arduino Uno и по отношению к оригиналу имеет несколько дополнительных элементов, в т.ч. пьезоэлектрический зуммер, программируемую кнопку и 12 светодиодов в сочетании с цифровыми выходами.
Проект распознавания жестов на Arduino
Для сборки проекта необходимы следующие компоненты:
- Модуль с датчиком распознавания жестов GY‑PAJ7620U2
- Модуль ModOLED130_I2C BLUE с 1,3-дюймовым OLED-дисплеем
- Плата, совместимая с Arduino UNO, например, Cytron Maker Uno
- Макетная плата
- Соединительные провода
Подключить GY‑PAJ7620U2 к Arduino несложно. Достаточно подключить к датчику питание, а также соединить по I2C шине.
Таблица 1. Подключение модуля GY‑PAJ7620U2 к плате Maker Uno

Для тестирования будем использовать скетч с сайта Waveshare. Код определяет распознанный жест и выводит соответствующее название в монитор последовательного порта.
В начале скетча мы подключаем две библиотеки. Одна отвечает за работу с шиной I2C, другая за работу датчика PAJ7620U2. Здесь также инициализируется переменная Gesture_Data, в которой хранится информация о распознаваемом в данный момент жесте.
#include <Wire.h> #include "PAJ7620U2.h" unsigned short Gesture_Data;
В функции setup() инициализируются: последовательный порт, интерфейс I2C и поддержка датчика жестов. Также выбирается банк регистров, и выполняется настройка датчика. Настройка заключается в занесении данных из таблицы Init_Gesture_Array в соответствующие регистры.
void setup() { uint8_t i; Serial.begin(115200); Serial.print("\nGesture Sensor Test Program ...\n"); delayMicroseconds(800); Wire.begin(); delayMicroseconds(10); while(!PAJ7620U2_init()) { Serial.print("\nGesture Sensor Error\n"); delay(500); } Serial.print("\nGesture Sensor OK\n"); I2C_writeByte(PAJ_BANK_SELECT, 0);//Select Bank 0 for (i = 0; i < Gesture_Array_SIZE; i++) { I2C_writeByte(Init_Gesture_Array[i][0], Init_Gesture_Array[i][1]);//Gesture register initializes } }
В основном цикле программы loop() извлекаются данные о только что распознанном жесте из регистра PAJ_INT_FLAG1. Затем в блоке switch данные сопоставляются с конкретным жестом, и эта информация отправляется в последовательный порт.
void loop() { Gesture_Data = I2C_readU16(PAJ_INT_FLAG1); if (Gesture_Data) { switch (Gesture_Data) { case PAJ_UP: Serial.print("Up\r\n"); break; case PAJ_DOWN: Serial.print("Down\r\n"); break; case PAJ_LEFT: Serial.print("Left\r\n"); break; case PAJ_RIGHT: Serial.print("Right\r\n"); break; case PAJ_FORWARD: Serial.print("Forward\r\n"); break; case PAJ_BACKWARD: Serial.print("Backward\r\n"); break; case PAJ_CLOCKWISE: Serial.print("Clockwise\r\n"); break; case PAJ_COUNT_CLOCKWISE: Serial.print("AntiClockwise\r\n"); break; case PAJ_WAVE: Serial.print("Wave\r\n"); break; default: break; } Gesture_Data=0; } }
На следующем скриншоте показано, как работает код.
Подключение OLED-дисплея
На этом этапе мы изменим дизайн устройства таким образом, чтобы при обнаружении жеста информация выводилась на OLED-дисплей. Для этой цели мы будем использовать дисплей modOLED130_I2C BLUE с диагональю 1,3 дюйма. Это монохромный дисплей с драйвером SH1106, отображающий текст или графику синим цветом. Связь осуществляется по I2C шине. Разрешение дисплея составляет 128×64 пикселя. Благодаря технологии OLED дисплей обеспечивает низкое энергопотребление — всего 0,08 Вт.
Модуль дисплея, как и датчик жестов, обменивается данными по шине I2C. Однако ничто не мешает обоим модулям обмениваться данными одновременно через одну шину. Поэтому подключение дисплея такое же, как и для датчика жестов.
Таблица 2. Подключение дисплея ModOLED130_I2C BLUE к плате Maker Uno
Для работы с OLED-дисплеем будем использовать библиотеку Adafruit SH1106 и библиотеку Adafruit GFX. Добавление библиотек в среду производится стандартным способом: Скетч > Подключить библиотеку > Добавить .ZIP библиотеку.
Чтобы код отображал жесты на OLED-экране, код необходимо соответствующим образом изменить. Во-первых, нам нужно добавить библиотеки и инициализировать операцию отображения. Конструктору требуется пин сброса, а в модуле дисплея его нет. Поэтому задан пин 0, что, впрочем, не мешает работе системы:
#include <Adafruit_GFX.h> #include <Adafruit_SH1106.h> #define OLED_RESET 0 Adafruit_SH1106 display(OLED_RESET);
В функцию setup() добавлен код, отвечающий за запуск и удаление данных с дисплея:
display.begin(SH1106_SWITCHCAPVCC, 0x3C); display.clearDisplay();
В свою очередь, основной цикл loop() дополнен тем, что названия жестов отображаются на экране дисплея, а не в мониторе последовательного порта. Кроме того, задается размер текста и начальное положение курсора. Дисплей очищается, когда display.display(); вызывает процедуру обновления экрана, которая позволяет отобразить ранее сохраненные в памяти данные.
Полная функция loop() показана ниже:
void loop() { Gesture_Data = I2C_readU16(PAJ_INT_FLAG1); display.setTextSize(2); display.setTextColor(WHITE); display.clearDisplay(); display.setCursor(0,0); if (Gesture_Data) { switch (Gesture_Data) { case PAJ_UP: display.println("Up"); break; case PAJ_DOWN: display.println("Down"); break; case PAJ_LEFT: display.println("Left"); break; case PAJ_RIGHT: display.println("Right"); break; case PAJ_FORWARD: display.println("Forward"); break; case PAJ_BACKWARD: display.println("Backward"); break; case PAJ_CLOCKWISE: display.println("Clockwise"); break; case PAJ_COUNT_CLOCKWISE: display.println("AntiClockwise"); break; case PAJ_WAVE: display.println("Wave"); break; default: break; } Gesture_Data=0; display.display(); } }
Скачать полный код проекта (698 bytes, скачано: 107)
