[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:
- Moduł z czujnikiem wykrywania gestów GY-PAJ7620U2,
- Moduł modOLED130_I2C BLUE z wyświetlaczem OLED 1,3”,
- Płytka zgodna z Arduino UNO, np. Cytron Maker Uno,
- Płytka stykowa,
- Przewody połączeniowe męsko-męskie.
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 |
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