[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

Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



