تشخیص ژست حرکت دست با آردوینو و سنسور PAJ7620
محتویات
در گذشته سوئیچ های فیزیکی کنترل را انجام میدادند، سپس از صفحه نمایش های لمسی استفاده شد و اکنون ما میتوانیم با ایجاد ژست و حرکت دست ماشین ها را کنترل کنیم. شاید این گفته تبلیغاتی به نظر برسد اما کاملا قابل انجام است و قابلیت اضافه شدن به هر پروژه ای را دارد.
در این مقاله ما از ماژول تشخیص حرکت PAJ7620 استفاده میکنیم. این یک ماژول مناسب برای انواع پروژه ها است زیرا قابلیت تشخیص 9 ژست را دارد و قیمت بسیار مناسبی دارد.
سنسور تشخیص حرکت PAJ7620
سنسور ژست PAJ7620 یک ماژول همه کاره و کاربرپسند است و برای علاقه مندان به الکترونیک ایده آل است. در قلب این ماژول تراشه PAC720 قرار دارد که قابلیت های تشخیص ژست را با پروتکل محبوب I2C ادغام می کند و یک سیستم حسگر تحلیلی تصویر جامع را ایجاد می کند. این ماژول پیشرفته می تواند انواع حرکات دست انسان را تشخیص دهد که آن را برای بسیاری از کاربرد های تعاملی بسیار مفید می کند.
این سنسور می تواند 9 حرکت مختلف را تشخیص دهد: حرکت به بالا، پایین، چپ، راست، جلو، عقب، جهت عقربه های ساعت، خلاف جهت عقربه های ساعت و تکان دادن.
در تصویر بالا می توانید قسمت های جلو و عقب ماژول تشخیص ژست PAJ7620 را مشاهده کنید. این یک ماژول کوچک و کاربردی است.
مشخصات ماژول تشخیص ژست PAJ7620
پارامتر | نماد | محدوده | محدوده | محدوده | واحد |
Min | Typical | Max | |||
ولتاژ تغذیه | Vcc | 3.3 | 5 | 6 | V |
ولتاژ پین IO | Vio | 1.8 | – | 3.3 | v |
جریان تغذیه | Ic | – | 370 | 800 | mA |
محدوده تشخیص ژست | Dop | 5 | – | 15 | cm |
دمای کاری | Top | -40 | – | 85 | °C |
دمای ذخیره | Tstorage | -40 | – | 125 | °C |
در بالا می توانید جدول کوچکی را مشاهده کنید که مشخصات در آن ذکر شده است. این ماژول با هر میکروکنترلری که از سخت افزار I2C پشتیبانی می کند سازگار است. تنها چیزی که باید به خاطر بسپارید سطح ولتاژ پین IO است. این ماژول فقط ولتاژ تا 3.3 ولت را می پذیرد. اگر از یک میکروکنترلر 5 ولت یا چیزی بالاتر از آن استفاده می کنید، پیشنهاد می کنم از یک تغییر دهنده سطح منطقی یا مدار تقسیم ولتاژ برای کاهش ولتاژ به 3.3 ولت بین خطوط داده استفاده کنید.
این سنسور تا 20 سانتی متر قابلیت تشخیص دارد اما بهترین محدوده آن زیر 15 سانتی متر است.
در زیر جدولی وجود دارد که شامل توضیحات پین های این ماژول PAJ7620 است. همه چیز در اینجا بسیار ساده است.
شماره | نام پین | توضیحات |
1 | VCC | ولتاژ + |
2 | GND | ولتاژ – |
3 | SCL | پین کلاک I2C |
4 | SDA | پین داده I2C |
5 | INT | پین وقفه |
GIF بالا عملکرد پین وقفه راتوضیح می دهد.
ماژول تشخیص ژست PAJ7620 چگونه کار می کند؟
میخواهیم عملکرد این ماژول را در دو بخش داخلی و خارجی توضیح بدهیم.
عملکرد داخلی PAJ7620
عملکرد داخلی این سنسور اصلا گیج کننده نیست زیرا فقط یک دوربین دارد که این جادو! را انجام میدهد. در این بخش یک دوربین 60 در 60 پیکسل به همراه یک ال ای دی مادون قرمز به علاوه یک آی سی پردازنده وجود دارد. تصاویر از طریق دوربین گرفته میشود و واحد پردازش ژست را تشخیص میدهد و نتیجه از طریق ارتباط I2C به میکروکنترلر یا برد آردوینو شما ارسال میشود.
عملکرد خارجی PAJ7620
عملکرد خارجی این سنسورنیز ساده است، شما در محدوده 5 تا 15 سانتی با زاویه دید 60 درجه نسبت به سنسور میتوانید حرکات را انجام بدهید.
در تصویر بالا میتوانید ژست های قابل تشخیص توسط این سنسور را مشاهده کنید.
مدار PAJ7620 ماژول سنسور ژست با Arduino UNO
ما برای نمایش ژست تشخیص داده شده از یک ماژول ال سی دی کاراکتری I2C استفاده میکنیم.
ما از دو مقاومت برای اتصال سنسور به برد آردوینو استفاده کردیم تا باعث آسیب به ماژول نشود. این یک راه حل کاملا مناسب نیست و بهتر هست از مبدل های سطح منطقی یا حتی مدار های تقسیم ولتاژ استفاده کنید.
کد آردوینو برای تشخیص ژست
از آنجایی که در عصر آردوینو هستیم نیازی نیست نگران کدنویسی های پیچیده باشید زیرا همیشه کتابخانه های از پیش آماده برای سنسور ها و ماژول های مختلف داریم. من یک کتابخانه ساخته شده توسط DFRobot را انتخاب کردم که DFRobot_PAJ7620U2 است. میتوانید این کتابخانه را به سادگی از طریق library manager خود آردوینو نصب کنید.
شما میتوانید به سادگی در example های این کتابخانه کد مناسبی را پیدا کنید اما در این جا ما یک نمونه اصلاح شده برای شما قرار دادیم و یک ال سی دی کاراکتری به آن اضافه کردیم.
#include <DFRobot_PAJ7620U2.h> #include <Wire.h> #include <LiquidCrystal_I2C.h>
سه کتابخانه فوق در ابتدا اضافه می شوند.
uint8_t rightChar[8] = { B00000, B00000, B00100, B00010, B11111, B00010, B00100, B00000 }; uint8_t leftChar[8] = { B00000, B00000, B00100, B01000, B11111, B01000, B00100, B00000 }; uint8_t upChar[8] = { B00000, B00000, B00100, B01110, B10101, B00100, B00100, B00000 }; uint8_t downChar[8] = { B00000, B00100, B00100, B10101, B01110, B00100, B00000, B00000 }; uint8_t forwardChar[8] = { B00100, B10101, B01110, B00100, B00000, B00000, B01110, B01110 }; uint8_t backwardChar[8] = { B00100, B01110, B10101, B00100, B00000, B00000, B01110, B01110 }; uint8_t clockwiseChar[8] = { B01110, B10001, B00001, B00001, B01010, B01100, B01110, B00000 }; uint8_t antiClockwiseChar[8] = { B00000, B01110, B01100, B01010, B00001, B00001, B10001, B01110 }; uint8_t waveRightChar[8] = { B00111, B00011, B00101, B01000, B00010, B10100, B11000, B11100 }; uint8_t waveLeftChar[8] = { B11100, B11000, B10100, B00010, B01000, B00101, B00011, B00111 };
برای نمایش بهتر، ما چند کاراکتری سفارشی را مطابق کد بالا به برنامه اضافه میکنیم.
void setup() { Serial.begin(115200); delay(300); lcd.begin(); lcd.createChar(1, waveRightChar); lcd.createChar(2, waveLeftChar); lcd.createChar(3, upChar); lcd.createChar(4, downChar); lcd.createChar(5, forwardChar); lcd.createChar(6, backwardChar); lcd.createChar(7, clockwiseChar); lcd.createChar(8, antiClockwiseChar); Serial.println("Gesture recognition system base on PAJ7620U2"); while (paj.begin() != 0) { Serial.println("initial PAJ7620U2 failure! Please check if all the connections are fine, or if the wire sequence is correct?"); delay(500); } Serial.println("PAJ7620U2init completed, start to test the gesture recognition function"); paj.setGestureHighRate(false); }
سپس باید در تابع void setup پیکربندی های اولیه از جمله ارتباط با ال سی دی و سنسور را انجام بدهیم.
Serial.println("Gesture recognition system base on PAJ7620U2"); while (paj.begin() != 0) { Serial.println("initial PAJ7620U2 failure! Please check if all the connections are fine, or if the wire sequence is correct?"); delay(500); } Serial.println("PAJ7620U2init completed, start to test the gesture recognition function");
در مرحله بعدی بررسی میکنیم که ارتباط با سنسور به خوبی برقرار است و به خوبی داده ها دریافت میشود.
paj.setGestureHighRate(false);
با کد بالا نرخ تازه سازی را پایین تر قرار میدهیم که در این حالت از 9 حرکت از پیش تعیین شده بدون حرکت های سفارشی میتوانیم استفاده کنیم.
void loop() { DFRobot_PAJ7620U2::eGesture_t gesture = paj.getGesture(); if (gesture != paj.eGestureNone) { lcd.clear(); String description = paj.gestureDescription(gesture); Serial.println("--------------Gesture Recognition System---------------------------"); Serial.print("gesture code = "); Serial.println(gesture); Serial.print("gesture description = "); Serial.println(description); Serial.println(); switch (gesture) { case 1: lcd.setCursor(3, 0); lcd.write(byte(1)); lcd.print(" "); lcd.print("RIGHT"); lcd.print(" "); lcd.write(byte(1)); break; // … program for other conditions are used default: lcd.print("New Gesture"); break; } } }
در کد بالا خطوط مربوط به تابع void loop را مشاهده میکنید. در این قسمت ما کد هگز آخرین ژست شناسایی شده را دریافت میکنیم. اگر این کد 0 باشد، یعنی هیچ حرکتی تشخیص داده نشده است. اگر مورد دیگری باشد با توجه به لیست زیر متوجه میشویم چه حرکتی تشخیص داده شده است.
– None = 0
– Right = 1
– Left = 2
– Up = 4
– Down = 8
– Forward = 16
– Backward = 32
– Clockwise = 64
– AntiClockwise = 128
– Wave = 256
– WaveSlowlyDisorder = 512
– WaveSlowlyLeftRight = 3
– WaveSlowlyUpDown = 12
– WaveSlowlyForwardBackward = 48
– All = 255
در مرحله بعد، این مقادیر دریافت شده برای انجام عملکرد مربوطه به یک سوئیچ کیس منتقل میشوند. میتوانید نسخه نمایشی این پروژه را در گیف های زیر مشاهده کنید.
نمایش عملکرد ماژول تشخیص حرکت PAJ7620 با آردوینو UNO
پس از آپلود کد در آردوینو، پروژه ما برای تشخیص حرکات و نمایش آنها بر روی ال سی دی کاراکتری آماده است. در زیر می توانید گیف های دموی کاری ژست های قابل تشخیص را مشاهده کنید که عبارتند از: راست، چپ، بالا، پایین، جلو، معکوس، جهت عقربه های ساعت، ضد جهت عقربه های ساعت و موج.
موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود