LinkedIn YouTube Facebook
Szukaj

Wstecz
SoM / SBC

[PROJEKT] Czujnik wykrywania gestów PAJ7620U2 i Arduino

Czujniki gestów coraz częściej montowane są w urządzeniach elektroniki konsumenckiej, takich jak smartfony, telewizory, konsoli do gier, a nawet urządzenia kuchenne. W porównaniu do interfejsów opartych o ekrany dotykowe, sterowanie gestami nie stanowi większych problemów wtedy, gdy użytkownik nosi rękawice. Ponadto pozwala wprowadzić do interfejsu trzeci wymiar, gdy ekrany dotykowe mogą jak wiadomo pracować tylko w dwóch wymiarach.

Jednym z niedrogich czujników wykrywających gesty jest układ PAJ7620U2. Sensor jest produkowany przez firmę PixArt Imaging. Zawiera w jednej obudowie zarówno nadajnik światła podczerwonego, jak i cały tor optyczny służący do odbioru światła odbitego. Układ został zaprojektowany z uwzględnieniem mechanizmów oszczędzania energii, co pozwala na wykorzystanie sensora w aplikacjach zasilanych bateryjnie. Dodatkowo czujnik oferuje m.in. niezawodną pracę przy świetle otoczenia do 100 kLux, a także redukcję szumów otoczenia.

Czujnik PAJ7620U2 jest w stanie rozpoznać 9 różnych gestów: (góra, dół, lewo, prawo, pchnięcie, pociągnięcie, ruch w kierunku wskazówek zegara, przeciwnie do wskazówek zegara, fala). Wykrywane są ruchy wykonywane w odległości 5-15 cm od czujnika, natomiast kąt widzenia wynosi 60°. Szybkość wykonywania ruchu obsługiwana przez sensor wynosi 60-600°/s w trybie normalnym lub 60-1200°/s w trybie gry. Sensor komunikuje się za pomocą magistrali I2C i zawiera dodatkowo wbudowany czujnik wilgotności, poprawiający wykrywanie obiektów wchodzących lub wychodzących z pola widzenia.

Sensor, oprócz trybu rozpoznawania gestów, oferuje także tryb obrazowania. Pozwala on na przesyłanie danych o obrazach za pomocą interfejsu SPI. Rozdzielczość takiego obrazu wynosi 30×30 pikseli, a częstotliwość odświeżania – 120 Hz. Intensywność każdego piksela jest przesyłana z 9-bitową głębią. Parametry obrazu w tym trybie można programować przez I2C.

Moduły z czujnikiem PAJ7620U2

Czujnik PAJ7620U2 jest dostępny na rynku także w postaci modułów umożliwiających łatwe podłączenie do popularnych platform rozwojowych, takich jak Arduino, Raspberry Pi czy STM32. Ja w projekcie wykorzystam niewielki i niedrogi moduł oznaczony jako GY-PAJ7620U2. Płytka udostępnia jedynie magistralę I2C, co oznacza, że mogę pracować jedynie w trybie rozpoznawania gestów. Oprócz czujnika na płytce zamontowano także stabilizatory upraszczające zasilanie sensora. Moduł można zasilać jednym napięciem z zakresu od 2,8 V do 3,3V. Na złącze goldpin wyprowadzono także pin INT, który może posłużyć do przekazania przerwania z czujnika do mikrokontrolera.

W zestawie znajduje się także złącze szpilkowe proste, które służy do przylutowania do wyprowadzeń modułu.

Rys. 1. Moduł GY-PAJ7620U2 z czujnikiem gestów PAJ7620U2

W dalszej części artykułu zaprezentuję kod umożliwiający odczyt gestów z czujnika PAJ7620U2 na platformie Arduino. Następnie dołączę do układu wyświetlacz OLED modOLED130_I2C BLUE o przekątnej 1,3” ze sterownikiem SH1106 i komunikacją I2C. Na wyświetlaczu będą prezentowane gesty aktualnie odczytywane przez sensor.

Rys. 2. Moduł modOLED130_I2C BLUE z wyświetlaczem OLED 1,3”

Jako moduł główny projektu zastosowano płytkę Maker Uno z oferty Cytron Technologies. Jest ona w pełni kompatybilna z Arduino Uno i w stosunku do oryginału ma kilka dodatkowych elementów, m.in. brzęczyk piezoelektryczny, programowalny przycisk oraz 12 diod LED sprzężonych z wyprowadzeniami cyfrowymi.

Rys. 3. Płytka Cytron Maker Uno kompatybilna z Arduino Uno

Projekt rozpoznawania gestów na Arduino

Do zmontowania projektu potrzebne są następujące elementy:

Podłączenie modułu z czujnikiem do płytki Arduino jest stosunkowo proste. Wystarczy do sensora podłączyć zasilanie, a także komunikację przez I2C. Dokładny sposób połączenia komponentów przedstawiono na poniższej tabeli.

Tabela 1. Połączenie modułu GY-PAJ7620U2 z płytką Maker Uno

Pin modułu GY- PAJ7620U2 Pin Maker UNO
VCC 5V
GND GND
SDA SDA
SCL SCL
Połączenie zaprezentowano także na poniższej fotografii.

Rys. 4. Moduł GY- PAJ7620U2 podłączony do Maker Uno

Do testów układu wykorzystam przykładowy kod dostępny na stronie Waveshare. Kod identyfikuje rozpoznany gest i wypisuje odpowiednią nazwę na porcie szeregowym.

Na początku kodu dołączana jest biblioteka odpowiedzialna za obsługę magistrali I2C oraz biblioteka z funkcjami do obsługi czujnika PAJ7620U2. Inicjalizowana jest także zmienna Gesture_Data, w której przechowywana jest informacja o aktualnie rozpoznanym geście.

#include <Wire.h>
#include "PAJ7620U2.h"

unsigned short  Gesture_Data;

W funkcji setup() inicjalizowane są: port szeregowy, interfejs I2C oraz obsługa czujnika gestów. Wybierany jest też bank rejestrów, a także przeprowadzana jest konfiguracja czujnika. Konfiguracja polega na wpisaniu do odpowiednich rejestrów danych z tablicy 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
  }
}

Z kolei w pętli głównej programu z rejestru PAJ_INT_FLAG1 pobierane są dane dotyczące właśnie rozpoznanego gestu. Następnie w bloku switch dane są dopasowywane do konkretnego gestu i ta informacja jest wypisywana na port szeregowy.

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;
  }
}

Poniższy zrzut ekranu ilustruje działanie kodu.

Rys. 5. Działanie przykładowego kodu do obsługi sensora PAJ7620U2