تحلیل کتابخانه

تحلیل و بررسی کتابخانه SparkFun_ADXL345.h

نوشته شده توسط معین صابری

سنسورهای شتاب سنج یکی از پرکاربردترین ابزارها در طراحی سیستم ها به شمار می روند. از این سنسور در تلفن های همراه، گجت های هوشمند، دستگاه های پزشکی، سیستم های اعلام سرقت و… استفاده می شود.  سنسور ADXL345 یک سنسور شتاب سنج سه محوره با خروجی دیجیتال است. به کمک این سنسور می توان شتاب گرانش را در جهت های مختلف اندازه گیری نمود. برای راه اندازی و کار با این سنسور، کتابخانه های متعددی وجود دارد. در این آموزش ما به شرح و استفاده از کتابخانه SparkFun_ADXL345.h می پردازیم. در ابتدا توابع کلیدی کتابخانه معرفی شده و در نهایت با یک نمونه کد، مثالی از کاربرد را خواهیم داشت. در ادامه با مرجع تخصصی آردوینو به زبان فارسی ، دیجی اسپارک همراه باشید.

 


نصب کتابخانه SparkFun_ADXL345


به منظور استفاده از کتابخانه، ابتدا می بایست آن را نصب کنیم. در این قسمت به نصب کتابخانه سنسور شتاب سنج با جستجو در مخازن آردوینو می پردازیم. به همین منظور، ابتدا در نرم افزار آردوینو بر روی گزینه Tools و سپس Manage Libraries را کلیک کنید. پس از کلیک بر روی این گزینه، با تصویر زیر رو به می شوید. این منو کتابخانه های در دسترس را به شما نشان می دهد. شما نیز می توانید با جستجوی نام کتابخانه مورد نظر خود، آن را در مخازن آردوینو یافته و سپس نصب کنید.

Analysis of the SparkFun_ADXL345.h library

مطابق فلش مشخص شده در تصویر فوق، در کادر جستجو عبارت ADXL345 را تایپ کنید. پس از چند لحظه، تعداد زیادی کتابخانه مرتبط در صفحه ظاهر خواهند شد. در این مرحله، لطفا کتابخانه SparkFun adxl345 را مطابق کادر قرمز رنگ در تصویر زیر، یافته و سپس بر روی گزینه install کلیک کنید.

 

Analysis of the SparkFun_ADXL345.h library

پس از نصب کتابخانه، نوبت به استفاده از آن می رسد. بنابراین در قسمت بعدی، به بررسی توابع کلیدی کتابخانه سنسور شتاب سنج پرداخته و پس از آن با ذکر مثالی، نحوه کار با توابع را مشاهده خواهیم نمود. اما پیش از آن، نگاهی به بردهای مورد پشتیبانی این کتابخانه و الزامات فنی آن پرداخته و سپس بحث را ادامه می دهیم.

 


ماژول های سازگار با کتابخانه


سنسور شتاب سنج ADXL345 دارای خروجی دیجیتال و از نوع I2C است. کتابخانه SparkFun نیز جهت ارتباط با سنسور، از رابط سریال I2C سخت افزاری استفاده می کند. بنابراین، برد مورد نظر شما می بایست از i2c سخت افزاری پشتیبانی کند. ذکر این نکته ضروریست که بردهای آردوینو UNO و MEGA به سادگی از این کتابخانه پشتیبانی می کنند.

Analysis of the SparkFun_ADXL345.h library

 


توابع کلیدی کتابخانه


در این قسمت به بررسی توابع کلیدی کتابخانه سنسور شتاب سنج می پردازیم. در رابطه با توابع، در نظر بگیرید که ورودی ها از سمت چپ به راست، به ترتیب شماره های یک، دو، سه و… را به خود اختصاص می دهند. به عبارت دیگر، منظور از ورودی اول سمت چپ ترین ورودی بوده و سایر رورودی ها از ۲ به بعد، به خود شماره اختصاص می دهند.

 

توابع کتابخانه SparkFun_ADXL345.h - دیجی اسپارک

 


اجرای یک نمونه برنامه


در این قسمت به بررسی یک نمونه برنامه می پردازیم. در کدهای زیر، مقدار شتاب هر محور خوانده می شود. سپس به کمک وقفه، علت وقوع وقفه تشخیص داده می شود.

#include <SparkFun_ADXL345.h>         // اضافه کردن کتابخانه سنسور شتاب
ADXL345 adxl = ADXL345(); // ایجاد یک شی از کتابخانه adxl، توجه: در این حالت ارتباط به صورت i2c تعریف می شود. چنانچه قصد راه انداز به صورت SPI دارید، لطفا ورودی تابع سازنده ADXL345 را عدد ۱۰ قرار دهید
int interruptPin = 2;                //انتخاب پین ۲ آردوینو به عنوان دریافت وقفه از سنسور شتاب سنج، پایه ۲ در آردوینو UNO، پایه وقفه خارجی است
void setup() {
  Serial.begin(9600);                 // تنظیم باودریت ارتباط سریال
  Serial.println(F("TEST ADXL345"));
                 Serial.flush();
                 adxl.powerOn();                     // روشن و فعال سازی سنسور
                 adxl.setRangeSetting(16);           // تنظیم بازه اندازه گیری
                 adxl.setActivityXYZ(1, 0, 0);       // تنظیم وضعیت تشخیص حرکت محورها
                 adxl.setActivityThreshold(75);      // تنظیم آستانه نیروی لازم جهت تشخیص حرکت
                 adxl.setInactivityXYZ(1, 0, 0);     // تنظیم تشخیص عدم حرکت در محورها
                 adxl.setInactivityThreshold(75);    // مقدار آستانه جهت تشخیص عدم حرکت در محورخا این تابع مقداری بین ۰ الی ۲۵۵ پذیرفته و ه رواحد افزایش معادل ۶۲٫۵mg است.
                 adxl.setTimeInactivity(10);         //تنظیم زمان لازم جهت تشخیص عدم حرکت
                 adxl.setTapDetectionOnXYZ(0, 0, 1); // تنظیم تشخیص ضربه یا tap
                 adxl.setTapThreshold(50);           // تنظیم آستانه نیروی لازم جهت تشخیص ضربه
                 adxl.setFreeFallThreshold(7);       // تنظیم آستانه نیروی لازم جهت تشخیص سقوط ازاد
                 adxl.setFreeFallDuration(30);       // (تنظیم حداقل زمان لازم جهت تشخیص سقوط آزاد
                 adxl.setImportantInterruptMapping(1, 1, 1, 1, 1);
                 //به کمک این تابع کلیه وقفه های خروجی بر رو ی پایه INT1 سنسور تنظیم می شوند. ووردی این تابع از چپ  به راست عبارت است از:
                 //وقفه تشخیص تک ضربه یا SINGLE TAP
                 //وقفه تشخیص دوبار ضربه یا DOUBLE TAP
                 //وقفه تشخیص سقوط آزاد
                 //وقفه حرکت
                 //وقفع عدم حرکت
                 //در توابع زیر وقفه هر یک از قابلیت ها با عدد یک فعال و با عدد ۰ غیر فعال می شود.
                 adxl.InactivityINT(1);
                 adxl.ActivityINT(1);
                 adxl.FreeFallINT(1);
                 adxl.doubleTapINT(1);
                 adxl.singleTapINT(1);
                 attachInterrupt(digitalPinToInterrupt(interruptPin), ADXL_ISR, RISING);   // تنظمی پایه  به عنوان وقفه خارجی در آردوینو

}

void loop() {

  // Accelerometer Readings
  int x, y, z;
  adxl.readAccel(&x, &y, &z);         // خواندن شتاب در محورهای X,Y,Z و ذخیره آن در ووردی ها، توجه داشته باشید که مقادیر ورودی این تابع اشاره گر است.
  Serial.print("x:");
  Serial.flush();
  Serial.println(x);
  Serial.flush();
  //********************************
  Serial.print("y:");
  Serial.flush();
  Serial.println(y);
  Serial.flush();
  //**************************************
  Serial.print("z:");
  Serial.flush();
  Serial.println(z);
  Serial.flush();
  //***********************************
  ADXL_ISR(); //فعال سازی سرویس وقفه

}
//تابع (روتین) وقفه سنسور شتاب سنج
void ADXL_ISR() {

  byte interrupts = adxl.getInterruptSource();  //به کمک این تابع دلیل و یا منبع وقفه تشخیص داده می شود.
  if (adxl.triggered(interrupts, ADXL345_FREE_FALL)) { //در صورتیکه علت وقفه سقوط آزاد باشد
    Serial.println("Interrupt source: FREE FALL ");
    Serial.flush();
  }


  if (adxl.triggered(interrupts, ADXL345_INACTIVITY)) { //درصورتیکه وقفه عدم فعالیت رخ دهد(عدم حرکت)
    Serial.println("Interrupt source: INACTIVITY ***");
    Serial.flush();
  }

  if (adxl.triggered(interrupts, ADXL345_ACTIVITY)) { //وقفه حرکت
    Serial.println("Interrupt source: ACTIVITY");
    Serial.flush();
  }
 
  if (adxl.triggered(interrupts, ADXL345_DOUBLE_TAP)) {   //وقفه دابل تپ
    Serial.println("Interrupt source: DOUBLE TAP ");
    Serial.flush();
  }

 
  if (adxl.triggered(interrupts, ADXL345_SINGLE_TAP)) {  //وقفه تپ یا ضربه تکی
    Serial.println("Interrupt source: TAP");
    Serial.flush();
  }
}

 


وسایل مورد نیاز


  1. سنسور شتاب سنج ADXL345
  2. انواع برد آردوینو
  3. انواع ماژول ESP

 


جمع بندی


در این آموزش به بررسی کتابخانه SparkFun_ADXL345 جهت راه اندازی سنسور شتاب سنج ADXL345 پرداختیم. این کتابخانه قادر است تا با برقراری ارتباط با شتاب سنج ADXL345، شتاب گرانشی را به سادگی از سنسور خوانده و نمایش دهد. علاوه بر این، این کتابخانه قابلیت تشخیص ضربه(TAP)، سقوط آزاد، حرکت در جهت های مختلف و امکانات بی شمار دیگری را در خود جای داده است. در این آموزش ضمن بررسی توابع، به ارائه یک مثال از چگونگی عملکرد، پرداخته شده است.

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

درباره نویسنده

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه

۶ دیدگاه

  • سلام
    خسته نباشید
    جناب مهندس در انجام پروژه ایی نیازمند کمک هستیم . امکانش هست به صورت خصوصی اموزش بدین . اگر هم مقدور نیست ممنون میشم کسی رو معرفی کنید . بنده از این سیستم ها چیزی بلد نیستم و نه تحصیلاتی در این خصوص دارم پروژه شخصی میباشد . باسپاس فراوان
    ali*******@gmail.com
    ۰۹۱۲*****

    • با سلام
      کاربر گرامی لطفا به قوانین سایت احترام بگذارید و از ارسال درخواست‌هایی خارج از موضوع سایت خودداری کنید. اینجا محلی برای ارایه آموزش است و درگاهی برای یافتن متخصص نیست.

  • سلام
    ممنونم از مطلب فوق العادتون
    ولی یک مشکلی که هست پایه وفقه درست کار نمیکنه یعنی من مجبورم تابع در لوپ اصلی قرار بدم.
    بنظرتون راه حل چیه ؟