10/02/2023
ĐÃ BAO GIỜ BẠN XOAY TAY LÊN XUỐNG TRÁI PHẢI MÀ CÓ ĐỨA NÓ HIỂU HẾT BẠN MUỐN GÌ PHẢI KHÔNG❓ ĐÓ LÀ CÁCH THỨC HOẠT ĐỘNG CỦA CẢM BIẾN PAJ7620
✴️Hôm nay mình sẽ cùng tìm hiểu về cách cảm biến PAJ7620 nhận biết cử chỉ bàn tay (Cái này chưa làm được với khuôn mặt đâu nhé và tất nhiên không quan trọng là tay trái hay tay phải👍) rồi hiển thị lên LCD 16x2 xem nó như thế nào nhé
✴️Đầu tiên phải xem cảm biến cứ chỉ PAJ7620 có gì ❓
- Đầu tiên đến với công nghệ nhận dạng cử chỉ đó là một công nghệ sử dụng các cảm biến để đọc và giải thích các động tác của tay như lệnh.Từ đó chúng ta có thể sử dụng hệ thống nhận dạng cử chỉ trong các ứng dụng y tế hoặc điều khiển đèn, robot, giao diện người dùng, trò chơi bằng cách kết hơp với nhiều cảm biến khác.
- Đối vơi các cử chỉ xuất phát từ bất kỳ động tác hoặc tình trạng nào của cơ thể (có thể xuất phát từ khuôn mặt hoặc tay) thường sẽ truyền đi một thông điệp nào đó .Tuy nhiên để hiểu được thông điệp đó thì cảm biến cử chỉ PAJ7620 chỉ có thể nhận diện 9 loại cử chỉ tay
bao gồm
✔️ Lên
✔️Xuống
✔️Trái
✔️Phải
✔️Tiến
✔️Lùi
✔️Theo chiều kim đồng hồ
✔️ Ngược chiều kim đồng hồ
✔️Sóng tay.
- Điều quan trọng nhất là cảm biến PAJ7620 sử dụng giao diện I2C cực kì thông dụng vì vậy khả năng kết nối với Arduino các cảm biến khác.
- Với con cảm biến này chúng ta có thể điều khiển không chạm theo đúng nghĩa đen (không quá xa với khoảng cách tương tác là 50- 100mm) nhưng vẫn quá thích hợp với điều khiển nhà thông minh, xe hơi, y tế không tiếp xúc,.. hoặc có thể nhận lệnh trực tiếp từ robot luôn không cần đến con người nữa.
✴️Sau khi đã biết về cảm biến PAJ7620 thì mình cùng tìm hiểu về cách nối dây với Arduino Nano (vì toàn là kết nối I2C nên rất dễ nha mọi người) còn về Arduino và LCD I2C mình đã có bài rồi anh em xem ở đây nhé👉https://www.facebook.com/linhkiendientunongnghiep/posts/pfbid0i19cCNVQMdKfFvK9BfVSd71EErTpJg9hpr1eY7ynad1XQ3o1TDZzw45xXUjjfa3Xl
- Giờ sang phần đấu dây nào:
✔️Chân SDA (PAJ7620, LCD)- chân A4 của Arduino
✔️Chân SCL (PAJ7620, LCD)- chân A5 của Arduino
✔️Chân Vcc của PAJ7620- chân 3v3 của Arduino (mọi người lưu ý nhé)
✔️Chân Vcc của LCD 16x2- chân 5v của Arduino
⚠️Lưu ý: Mọi người nên giữ cảm biến PAJ7620 trên mặt phẳng để đảm độ chính xác và có 2 trường hợp với khả năng phát hiện:
✔️Khi tay ở gần khoảng cách 5-15 cm với góc 60° thì cảm biến sẽ phát hiện.
✔️Khi tay ở xa khoảng cách 15-30 cm với góc 30° thì cảm biến sẽ phát hiện.
✴️Sau khi setup xong thì chúng ta cùng đi vào phần code (tất nhiên là anh em phải đầy đủ thư viện paj7620.h và LiquidCrystal_I2C.h. Mình sẽ để code ở dưới mọi người tham khảo nhé👇
"paj7620.h"
LiquidCrystal_I2C lcd(0x27, 16, 2);
GES_REACTION_TIME 300 // Thời gian phản ứng bạn có thể thay đổi độ nhạy ở đây
GES_ENTRY_TIME 500 //Dể nhận biết tiến lên và lùi xuống thì phải để thời gian GES_ENTRY_TIME dưới 0.8s).
GES_QUIT_TIME 1000
void setup()
{
lcd.init();
lcd.backlight();
Serial.begin(9600);
Serial.println("\nPAJ7620U2 TEST DEMO: Recognize 9 gestures.");
lcd.setCursor(0, 0);
lcd.print(" Gesture ");
lcd.setCursor(0, 1);
lcd.print(" Recognition ");
delay(4000);
uint8_t error = 0;
error = paj7620Init(); // Khởi tạo PAJ7620
if (error)
{
Serial.print("INIT ERROR,CODE:");
Serial.println(error);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("INIT ERROR,CODE:");
lcd.setCursor(0, 1);
lcd.print(error);
delay(3000);
}
else
{
Serial.println("INIT OK");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("INIT OK");
delay(3000);
}
Serial.println("Please input your gestures:\n");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input You");
lcd.setCursor(0, 1);
lcd.print("Gestures");
delay(3000);
}
void loop()
{
uint8_t data = 0, data1 = 0, error;
error = paj7620ReadReg(0x43, 1, &data); // Địa chỉ thanh ghi của cảm biến PAJ7620
if (!error)
{
switch (data)
{ // Khi các cử chỉ khác nhau được phát hiện biến dữ liệu trên thanh ghi 0x43 sẽ thay đổi
case GES_RIGHT_FLAG:
delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43, 1, &data);
if (data == GES_FORWARD_FLAG)
{
Serial.println("Forward");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Forward");
delay(GES_QUIT_TIME);
}
else if (data == GES_BACKWARD_FLAG)
{
Serial.println("Backward");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Backward");
delay(GES_QUIT_TIME);
}
else
{
Serial.println("Right");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Right");
}
break;
case GES_LEFT_FLAG:
delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43, 1, &data);
if (data == GES_FORWARD_FLAG)
{
Serial.println("Forward");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Forward");
delay(GES_QUIT_TIME);
}
else if (data == GES_BACKWARD_FLAG)
{
Serial.println("Backward");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Backward");
delay(GES_QUIT_TIME);
}
else
{
Serial.println("Left");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Left");
}
break;
case GES_UP_FLAG:
delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43, 1, &data);
if (data == GES_FORWARD_FLAG)
{
Serial.println("Forward");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Forward");
delay(GES_QUIT_TIME);
}
else if (data == GES_BACKWARD_FLAG)
{
Serial.println("Backward");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Backward");
delay(GES_QUIT_TIME);
}
else
{
Serial.println("Up");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Up");
}
break;
case GES_DOWN_FLAG:
delay(GES_ENTRY_TIME);
paj7620ReadReg(0x43, 1, &data);
if (data == GES_FORWARD_FLAG)
{
Serial.println("Forward");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Forward");
delay(GES_QUIT_TIME);
}
else if (data == GES_BACKWARD_FLAG)
{
Serial.println("Backward");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Backward");
delay(GES_QUIT_TIME);
}
else
{
Serial.println("Down");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Down");
}
break;
case GES_FORWARD_FLAG:
Serial.println("Forward");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Forward");
delay(GES_QUIT_TIME);
break;
case GES_BACKWARD_FLAG:
Serial.println("Backward");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Backward");
delay(GES_QUIT_TIME);
break;
case GES_CLOCKWISE_FLAG:
Serial.println("Clockwise");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Clockwise");
break;
case GES_COUNT_CLOCKWISE_FLAG:
Serial.println("anti-clockwise");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Anti-Clockwise");
break;
default:
paj7620ReadReg(0x44, 1, &data1);
if (data1 == GES_WAVE_FLAG)
{
Serial.println("wave");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wave");
}
break;
}
}
delay(100);
}