آموزش آردوینوپروژه های آردوینو

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

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

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

معرفی شتاب سنج ADXL345

شتاب سنجی ما در این آموزش استفاده می کنیم شتاب سنج ADXL345 از Adafruit است.

معرفی شتاب سنج ADXL345

فلش ها جهت هر محور حسگر (x، y و z) را در برد فیزیکی نشان می دهد. محور z به سمت بالا و پایین، عمود بر محورهای x و y گسترش می یابد. ADXL345 می تواند با آردوینو از طریق SPI و I2C ارتباط برقرار کند. در این مقاله از I2C استفاده خواهیم کرد، اما اگر بخواهید میتوانید از SPI هم استفاده کنید.

پین های شتاب سنج ADXL345:

  • Vin – به منبع برق 5 ولت وصل می شود.
    3V3 – شتاب سنج ADXL345 را می توان با 3.3 ولت یا 5 ولت تغذیه کرد. این پین محل اتصال منبع برق 3.3 ولتی است.
  • GND – به زمین متصل می شود.
  • CS – پین انتخاب تراشه برای ارتباط SPI.
  • INT1 – پین وقفه سخت افزاری 1
  • INT2 – پین وقفه سخت افزاری 2
  • SDO – پین خروجی داده سریال. به عنوان پین MISO برای ارتباطات SPI دو برابر می شود.
  • SDA – پین SDA برای ارتباط I2C. به عنوان پین MOSI برای ارتباطات SPI دو برابر می شود.
  • SCL – پین SCL برای ارتباط I2C. به عنوان پین SCLK برای SPI دو برابر می شود.

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

شتاب میزان افزایش یا کاهش سرعت است:

فرمول شتاب

اگر سوار ماشین شوید و پا روی گاز بگذارید، ماشین شتاب مثبتی دارد. اگر پا روی ترمز بگذارید، خودرو شتاب منفی دارد. این به عنوان شتاب دینامیکی شناخته می شود.

شتاب استاتیک توسط نیروهایی مانند گرانش ایجاد می شود. شتاب سنج ها هم شتاب استاتیک و هم شتاب دینامیکی را اندازه گیری می کنند. دو واحد متداول شتاب متر بر مجذور ثانیه (m/s2) و g هستند. یک gبه عنوان نرخ شتاب گرانش تعریف می شود که 9.8 m/s2 است.

خروجی ADXL345 اندازه گیری های شتاب برای هر محور، x، y، و z را ارائه میدهد.

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

ADXL345 شتاب را با تشخیص تغییرات در ظرفیت اندازه گیری می کند. در امتداد هر محور یک صفحه کوچک معلق بین دو فنر کوچک وجود دارد که می تواند به جلو و عقب حرکت کند:

ساختار داخلی شتاب سنج

صفحه متحرک و صفحه ثابت شارژ می شوند، بنابراین یک میدان الکتریکی بین آنها تشکیل می شود:

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

بررسی طرز کار شتاب سنج ها

هنگامی که شتاب سنج در حالت سکون است، میدان الکتریکی بین صفحات ثابت است. هنگامی که سنسور شتاب می گیرد، صفحه متحرک حرکت می کند و فاصله بین صفحات تغییر می کند.

تغییر ظرفیت خازنی شتاب سنج

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

مدار اتصال شتاب سنج ADXL345 به آردوینو

بیایید شتاب‌سنج را به آردوینو متصل کنیم و به مقادیر خامی که ارائه می‌کند نگاهی بیندازیم. ما شتاب سنج را با ارتباط I2C وصل می کنیم، بنابراین سیم کشی بسیار ساده است.

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

قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

شتاب سنج را به این صورت به آردوینو وصل کنید:

مدار اتصال شتاب سنج ADXL345 به آردوینو

کد شتاب سنج در آردوینو

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

اولین کاری که انجام می دهیم گنجاندن کتابخانه Sparkfun ADXL345 است. سپس یک شی به نام adxl ایجاد می کنیم که عضوی از کلاس ADXL345 است. شی adxl را برابر با تابع ADXL345() قرار می دهیم. تابع ()ADXL345 حالت ارتباطی را که حسگر برای ارتباط با آردوینو از آن استفاده می کند، پیکربندی می کند. هنگامی که هیچ آرگومانی به تابع ارسال نمی شود، مانند این مورد، حسگر از I2C برای برقراری ارتباط با آردوینو استفاده می کند. برای استفاده از SPI، به جای آن از ADXL345(10) استفاده کنید.

سپس متغیری به نام range اعلام می کنیم که محدوده حساسیت مورد نظر ADXL345 را ذخیره می کند. می تواند 2، 4، 8 یا 16 باشد.

#include <SparkFun_ADXL345.h>

ADXL345 adxl = ADXL345();

int range = 2; // Range: 2g, 4g, 8g, 16g

در بخش setup() ما سریال مانیتور را مقداردهی اولیه می کنیم. سپس ADXL345 را با تابع powerOn() مقداردهی اولیه می کنیم. این تابع از طریق شی adxl که قبلا ایجاد کردیم فراخوانی می شود. سپس تابع setRangeSetting() را فراخوانی می کنیم تا محدوده حساسیت سنسور را تنظیم کنیم. متغیر range را به آن منتقل می کنیم، که تنظیمات محدوده ای را که در زمان اعلام آن تعریف کرده بودیم ذخیره می کند.

void setup() {
  Serial.begin(9600);

  adxl.powerOn();
  adxl.setRangeSetting(range);
}

در بخش loop() اولین کاری که انجام می‌دهیم این است که متغیرهایی را برای نگهداری خوانش‌ های حسگر اعلام می‌کنیم. خروجی ADXL345 اندازه گیری های شتاب مجزا برای هر محور است، بنابراین ما به یک متغیر منحصر به فرد برای هر محور نیاز داریم. بنابراین ما سه متغیر int با نام x، y و z را ایجاد می کنیم.

سپس، خوانش سنسور را از شتاب سنج با تابع readAccel() دریافت می کنیم. آرگومان های تابع readAccel() متغیرهایی هستند که قرائت سنسور را از هر محور نگه می دارند. اندازه گیری محور x حسگر در متغیری که در پارامتر اول قرار می گیرد ذخیره می شود. اندازه‌گیری‌های محور y در متغیر پارامتر دوم و اندازه‌گیری‌های محور z در متغیری که در پارامتر سوم قرار دارد ذخیره می‌شوند.

در مرحله بعد یک سری توابع ()Serial.print برای چاپ مقادیر ذخیره شده در متغیرهای x، y و z در مانیتور سریال داریم. سپس 250 میلی ثانیه تأخیر می کنیم تا سرعت خروجی کمی کاهش یابد.

void loop() {
  int x, y, z;
  adxl.readAccel(&x, &y, &z);

  Serial.print("X: ");
  Serial.print(x);

  Serial.print("    Y: ");
  Serial.print(y);

  Serial.print("    Z: ");
  Serial.println(z);

  delay(250);
}

پس از اتصال ADXL345 به آردوینو و آپلود کد، مانیتور سریال را باز کنید. شما باید مقادیری مانند این را در حال چاپ ببینید:

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

توجه کنید که چگونه مقادیر X و Y نزدیک به صفر هستند، اما محور Z مقداری در حدود 230 دارد. حسگر هنگام گرفتن این اسکرین شات روی میز قرار داشت، بنابراین حرکت نمی کرد. اما داشت شتاب می گرفت که این شتاب ناشی از شتاب گرانش است. سعی کنید حسگر را به اطراف حرکت دهید و ببینید چه اتفاقی برای مقادیر محورهای x، y و z می افتد.

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

3.2 (6 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

1 دیدگاه

  1. سلام امکان این که اگر سنسور قطع شود و یا از کار افتاد متوجه بشیم یا یک تابع ای یا اینتراپی فعال نمیشه که به وسیله آن اردوینو رو متوجه کنیم .تو کتاب خونه های دیگه اینو پیدا کرده اما دقت پایینی داره امکانش هست راهنماییم کنید
    #include ;
    #include ;
    if (!accel.begin())
    {
    lcd.print(“Error ADXL345!!!”);
    while (1);
    }

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *