Главная » Arduino » PAJ7620U2 — датчик обнаружения жестов с Arduino

PAJ7620U2 — датчик обнаружения жестов с Arduino

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

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

Одним из недорогих датчиков жестов, созданный компанией 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, который можно использовать для передачи прерывания от датчика к микроконтроллеру.

PAJ7620U2

В этой статье мы приведем скетч для 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

Тестер транзисторов / ESR-метр / генератор
Многофункциональный прибор для проверки транзисторов, диодов, тиристоров...
Подробнее

Таблица 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;
}
}

На следующем скриншоте показано, как работает код.

Работа примера кода для работы с датчиком PAJ7620U2

Подключение OLED-дисплея

На этом этапе мы изменим дизайн устройства таким образом, чтобы при обнаружении жеста информация выводилась на OLED-дисплей. Для этой цели мы будем использовать дисплей modOLED130_I2C BLUE с диагональю 1,3 дюйма. Это монохромный дисплей с драйвером SH1106, отображающий текст или графику синим цветом. Связь осуществляется по I2C шине. Разрешение дисплея составляет 128×64 пикселя. Благодаря технологии OLED дисплей обеспечивает низкое энергопотребление — всего 0,08 Вт.

Модуль дисплея, как и датчик жестов, обменивается данными по шине I2C. Однако ничто не мешает обоим модулям обмениваться данными одновременно через одну шину. Поэтому подключение дисплея такое же, как и для датчика жестов.

Таблица 2. Подключение дисплея ModOLED130_I2C BLUE к плате Maker Uno

Таблица 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, скачано: 74)

Блок питания 0...30В/3A
Набор для сборки регулируемого блока питания...
Подробнее



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