[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
Kliknąłeś podejrzany link? Co zrobić, aby uniknąć katastrofy?
Twórca koncepcji sztucznej inteligencji został wykastrowany, ale intelektualnie zapłodnił setki naśladowców
W jaki sposób wizja maszynowa poprawia bezpieczeństwo i wydajność automatyzacji 



