آموزش راه اندازی سنسور شتاب سنج سه محوره ADXL345 با آردوینو

فهرست مطالب

ویژگی های سنسور شتاب سنج سه محوره ADXL345

با استفاده از سنسور شتاب سنج ADXL345 می‌توان جهت‌گیری زاویه و مسیر جسم مورد نظر را اندازه‌‎گیری کرد. این سنسور در سه جهت y ،x و z این عمل را انجام می‌دهد. این سنسور همچنین قادر به اندازه‌گیری نیروی شتاب دینامیک و استاتیک است. نیروی شتاب دینامیک بر اثر حرکت و لرزش و نیروی شتاب استاتیک به علت جاذبه زمین رخ می‌دهد. رنج حساسیت سنسور شتاب سنج ADXL345 از +-2g تا +-16g است. (g  تقریبا برابر با 9.8 است.) برای مثال وقتی این سنسور بر روی یک سطح صاف قرار بگیرد، مقدار آن در جهت محور z، 1g+ و در جهت محورهای x و z، صفر است.

ارتباط این سنسور با میکروکنترلر می‌تواند از طریق دو پروتکل I2C و SPI باشد. رباتیک و ربات‌های پرنده، دستگاه‌های جهت‌یاب، کنسول های بازی، ریموت کنترولرهای سه بعدی و … ازجمله موارد استفاده از این سنسور می‌باشد. 

دیتاشیت سنسور ADXL345 را می توانید از اینجا دانلود کنید.

معرفی پایه های (Pinout) سنسور شتاب سنج سه محوره ADXL345

ماژول ADXL345 دارای 8 پایه به شرح زیر است:

  • VCC: 3v to 6v
  • GND: Ground
  • CS: Chip Select
  • INT1: Interrupt 1 Out
  • INT2: Interrupt 2 Out
  • SDO: Serial Data Out
  • SDA:Serial Data
  • SCL:Serial Clock

پین اوت (Pinout) این ماژول را می توانید در تصویر زیر مشاهده کنید.  در این آموزش از دو پین I2C استفاده شده‌ است.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

آردوینو UNO R3 × 1
سنسور شتاب سنج سه محوره ADXL345 × 1
سیم جامپر × 1

نرم افزارهای مورد نیاز

آردوینو IDE

راه اندازی سنسور شتاب سنج سه محوره ADXL345 با آردوینو

گام اول: سیم بندی

مطابق مدار زیر ماژول را به آردوینو وصل کنید.

گام دوم: کد

کد زیر را روی آردوینو خود آپلود کنید.

/*
  ADXL345-Acceleration-Modole
  modified on 26 oct 2020
  by Amir Mohammad Shojaee @ Electropeak
  
Home
Based on howtomechatronics.com Example */ #include <Wire.h> // Wire library - used for I2C communication int ADXL345 = 0x53; // The ADXL345 sensor I2C address float X_out, Y_out, Z_out; // Outputs void setup() { Serial.begin(9600); Wire.begin(); // Initiate the Wire library Wire.beginTransmission(ADXL345); // Start communicating with the device Wire.write(0x2D); // Access/ talk to POWER_CTL Register - 0x2D Wire.write(8); // (8dec -> 0000 1000 binary) Bit D3 High for measuring enable Wire.endTransmission(); delay(10); } void loop() { // === Read acceleromter data === // Wire.beginTransmission(ADXL345); Wire.write(0x32); // Start with register 0x32 (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(ADXL345, 6, true); // Read 6 registers total, each axis value is stored in 2 registers X_out = ( Wire.read()| Wire.read() << 8); // X-axis value X_out = X_out/256; //For a range of +-2g, we need to divide the raw values by 256, according to the datasheet Y_out = ( Wire.read()| Wire.read() << 8); // Y-axis value Y_out = Y_out/256; Z_out = ( Wire.read()| Wire.read() << 8); // Z-axis value Z_out = Z_out/256; Serial.print("Xa= "); Serial.print(X_out); delay(500); Serial.print(" Ya= "); Serial.print(Y_out); delay(500); Serial.print(" Za= "); Serial.println(Z_out); delay(500); }

در ابتدای برنامه کتابخانه ارتباط I2C فراخوانی می‌شود. در مرحله بعد آدرس I2C سنسور نوشته می‌شود. این آدرس در دیتاشیت سنسور ذکر شده ‌است. در ادامه آن را در وضعیت اندازه‌گیری قرار می‌دهیم. این کار توسط آدرس دهی رجیستر و همچنین بیت موردنظر صورت می‌پذیرد. هر محور شامل 2 رجیستر می‌باشد. عمل خواندن رجیسترها از محور x شروع شده و این فرآیند 6 بار بایستی تکرار شود. در ادامه با توجه به حساسیت +-2g در دیتاشیت آن را بر 256 تقسیم میکنیم. در آخر نیز مقدار خروجی هر محور را در Serial Monitor نمایش می‌دهیم.

با جابه‌جایی سنسور در جهت‌های مختلف، خروجی زیر در Serial Monitor مانند شکل زیر تغییر می‌کند.

آموزش های مشابه

Comments (13)

  • سیدمرتضی Reply

    سلام ممنون از اموش خوب وکاملتون
    اگر بخواهیم این مقادیر به درجه نمایش داده بشن یعنی بین صفر تا 180درجه باشن باید چکار کنیم؟

    آگوست 7, 2021 at 2:10 ب.ظ
    • مهران ملکی Reply

      سلام. ممنون از لطف شما
      زاویه یک بردار به صورت زاویه اون با یکی از محورهای مختصات تعریف میشه. فرمول زاویه یک بردار با محور x در یک فضای 3بعدی به شکل زیر هست:
      cos2(alpha) = x2/(x2 + y2 + z2).
      فرمول زاویه با هر کدوم از محورهای y و z هم با جایگزین کردن x2 در صورت کسر با y2 و z2 به دست میان.
      عدد 2 در فرمول‌های بالا توان هست.

      آگوست 7, 2021 at 5:34 ب.ظ
      • Arash Reply

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

        ژانویه 14, 2023 at 7:20 ب.ظ
        • علی عبدالملکی Reply

          سلام
          شما همین فرمول cos2(alpha) = x2/(x2 + y2 + z2). میتونید در داخل لوپ اصلی برنامه قرار بدید و خروجی هر محور رو در داخل این فرمول بزارید
          در کامنت های قبلی آقای ملکی توضیح دادن

          فوریه 28, 2023 at 10:55 ق.ظ
  • میلاد Reply

    سلام کقتتون بخیر میشه در مورد چایه های اینتراپ این ماژول هم توضیح بدید که چه جوری کار میکنن و چه زمانی بک میشن؟

    دسامبر 3, 2022 at 10:56 ب.ظ
  • امیر Reply

    سلام ببخشید اگه بخوام نمودار های شتاب های بدست آمده رو برام رسم کنه باید چ کاری انجام بدم
    خواهشمندم راهنماییم کنید

    ژانویه 13, 2023 at 7:08 ب.ظ
    • علی عبدالملکی Reply

      سلام
      در خود ide آردوینو میتونید به جای serial print از تابع serial plot استفاده کنید و از منوی tools گرینه serial plotter رو بزنید که براتون نمودار رو نمایش بده
      یا اینکه دیتاهای به دست اومده رو در خروجی serial print جمع آوری کنید و داخل excel ببرید و خودتون نمودارشو رسم کنید
      اما اگر تغییرات رو real میخواهید ببینید همون serial plotter بدردتون میخوره

      فوریه 28, 2023 at 10:57 ق.ظ
  • بردیا Reply

    من همه این کار ها رو انجام دادم ولی توی خروجی سریال به من 0 می ده

    آوریل 9, 2023 at 2:56 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      ابتدا با استفاده از فایل I2C Scanner بررسی کنید که ماژول بر روی آدرس درستی می باشد ؟؟

      آوریل 15, 2023 at 10:59 ق.ظ
  • بیژن Reply

    من می زنم کد رو صفر می ده سریال مانیتور

    آوریل 11, 2023 at 10:33 ق.ظ
    • محمد دمیرچی Reply

      با سلام
      ابتدا با استفاده از فایل I2C Scanner بررسی کنید که ماژول بر روی آدرس درستی می باشد ؟؟

      آوریل 15, 2023 at 11:41 ق.ظ
  • علی رحمانی Reply

    سلام
    ممنون از آموزش مفیدتون.
    مراحل را با دقت تا آخر انجام میدم. خروجی سنسور صفر صفر صفر برای مقادیر شتاب هست.

    سه بار شتاب سنج adxl345 جدید تست کردم، با برد آردوینو اونو و نانو جدید هم تست کردم جواب نداد. یوتیوب چندتا ویدئو دیدم که گفته بودند حتما باید با لول کانورتر وصل کنم. این کار هم انجام دادم همچنان خروجی ها صفر هستند. ممنون میشم راهنمایی بفرمایید.

    می 5, 2024 at 5:34 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      ابتدا با استفاده از کد I2C اسکنر که در بخش مثال های آردوینو می باشد. بررسی کنید که آدرس ماژول به شما بر میگردد یا خیر. تا زمانی که آدرس را دریافت نکنید هیچ دیتایی نخواهید گرفت.
      در صورتی که دیتا را دریافت کردید. سپس بررسی کنید که این آدرس با آدرسی که کتابخانه استفاده میکند یکی می باشد یا خیر.

      می 6, 2024 at 10:39 ق.ظ

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

نشانی ایمیل شما منتشر نخواهد شد.