به نام خدا
آشنایی با شتاب سنج دیجیتال ADXL345 و کالیبره کردن آن
شتاب سنج با محور سه گانه و یک رابط دیجیتال است.
نگاه اجمالی :
ADXL345 یک ماژول شتاب سنج سه بعدی MEMS است که با هر دو رابط I2C و SPI کار میکند. برد Adafruit Breakout برای این ماژول ولتاژ ۳٫۳v را آماده کرده اند ،از این رو آنها با میکروکنترلر های ۵v مثل آردوینو به راحتی ارتباط برقرار میکنند.
ADXL345 دارای ۴ محدوده ی حساسیت +/-۲G تا +/-۱۶G است . از داده های خروجی با د رنج ۱۰Hz تا ۳۲۰۰Hz پشتیبانی میکند.
نحوه ی کار سنسور:
این سنسور از یک ساختار میکرو مکانیکی روی سلیکون ساخته شده است. این ساختار توسط چند سلیکون به صورت تعلیق در آمده است که در صورت تحریک در محور های X،Y و یا Z به همان سمت منحرف میشود. این انحراف باعث تغییر در ظرفیت خازنی بین صفحه ثابت و صفحه ی متصل به ساختار معلق می شود. این تغییر ظرفیت در هر محور به یک ولتاژ خروجی متناسب با شتاب در هر محور تبدیل می شود.
برد و سیم کشی:
تمام اجزا با لحیم به سطح برد لحیم شده است. یک رشته سوراخ پین هدر برای استفاده ی مناسب بروی برد نصب شده است.
مونتاژ:
پین هدر را قرار دهید:
رشته ی پین هدر را در صورت نیاز برش دهید . پین هدر را از سمت سیم های کوتاه ترش بر روی برد بورد سوار کنید.
اضافه کردن Breakout :
برد را روی رشته ی پین هدر ثابت کنید.
لحیم کردن :
از اتصال الکتریکی همه ی پین ها اطمینان حاصل کنید.
ارتباط I2C :
ADXL345 Breakout یک آدرس I2C_0X53 دارد.
برای ارتباط I2C فقط ۴ اتصال لازم است:
زمین به زمین
پین VIN به ۵V
پین SDA به SDA (پین ۴ آنالوگ در آردوینو کلاسیک)
پین SCL به SCL (پین ۵ آنالوگ در آردوینو کلاسیک)
Adafruit breakout دارای سطح بی ثبات و مدار تنظیم کننده است، بنابر این شما میتوانید در ولتاژ بین ۳ و ۵ راه اندازی کنید و از سطح ۳V و ۵V منطقی I2C استفاده کنید.
برنامه نویسی و کالیبراسیون :
کتابخانه را نصب کنید :
کتابخانه ADXL345 را دانلود کرده و آن را نصب کنید.اگه قبلا این کتابخانه را نداشتید شما به کتابخانه Adafruit Sensor نیز نیاز دارید. شما میتوانید کتابخانه ی Adafruit Sensor را از لینک زیر دانلود کنید.
دانلود فایل
امتحان کردن :
بر روی “File->Examples->Adafruit_ADXL345->sensortest” کلیک کنید تا نمونه ای اجرایی از این کتابخانه مشاهده کنید.
حال روی compile/upload کلیک کنید تا طرح به آردوینو آپلود شود. شما باید خروجی مشابه زیر را ببینید. برد را حرکت دهید تا تغییرات را ببینید.
کالیبره کردن:
تراشه های ADXL را در کارخانه در حد معمول کالیبره می کنند. برای برنامه های مهم که در آن به دقت بالاتر نیاز دارید ،ممکن است به کالیبره کردن نیاز پیدا کنید.
کالیبره کردن خروجی های سنسور را تغییر نمی دهد. اما خروجی سنسور را نسبت به مرجعی که برای آن مشخص کرده اید به شما میدهد.
گرانش به عنوان مرجع کالیبرراسیون :
شتاب را می توان در نسبت به گرانش زمین اندازه گیری کرد. جایی که ۱G را نشان میدهد جاذبه در سطح زمین است. گرانش زمین یک نیروی پایدار و یک مرجع کالیبراسیون مناسب و قابل اعتماد است.
روش کالیبراسیون:
برای سنسور کالیبره شده شما باید خروجی را برای هر محور به طور دقیق در جهت محور های گرانش مشخص کنید.
نصب سنسور :
سنسور را به یک تکه چوب وصل کنید. اندازه تا زمانی که تمام گوشه های آن با یک زاویه و سطح آن کاملا صاف باشد مهم نیست.
اسکن کالیبراسیون را انجام دهید.
بار گیری را به صورت زیر انجام دهید و منتظر بمانید.
- تکه چوب را روی یک سطح نرم و صاف مانند یک میز محکم قرار دهید. یک کارکتر را در سریال مانیتور سپس return را وارد کنید.
- این کارکتر اندازه گیری را در این محور انجام میدهد و نتایج را برای ما چاپ میکند.
- بلوک را بچرخانید تا سمت دیگر آن روی میز قرار بگیرد. یک کارکتر دیگر برای اندازه گیری محور آن تایپ کنید.
- برای تمام شش وجه این تکه چوب این کار را انجام دهید.
نکته: برای وجه ی که سیم ها روی آن است کارکتر را وارد کرده و از سطح زیر میز استفاده کنید.
نتایج کالیبراسیون:
هنگامی که تمام شش وجه قطعه چون نمونه برداری شد، مقادیری که در مانیتور چاپ شده اند نشان دهنده ی اندازه ی واقعی برای نیرو های +/-۱G در هر محور است. از این مقادیر میتوان برای دریافت دقت بالاتر استفاده کرد.
طرح کالیبراسیون:
دانلود کد
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_ADXL345_U.h> /* Assign a unique ID to this sensor at the same time */ Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345); float AccelMinX = 0; float AccelMaxX = 0; float AccelMinY = 0; float AccelMaxY = 0; float AccelMinZ = 0; float AccelMaxZ = 0; void setup(void) { Serial.begin(9600); Serial.println("ADXL345 Accelerometer Calibration"); Serial.println(""); /* Initialise the sensor */ if(!accel.begin()) { /* There was a problem detecting the ADXL345 ... check your connections */ Serial.println("Ooops, no ADXL345 detected ... Check your wiring!"); while(1); } } void loop(void) { Serial.println("Type key when ready..."); while (!Serial.available()){} // wait for a character /* Get a new sensor event */ sensors_event_t accelEvent; accel.getEvent(&accelEvent); if (accelEvent.acceleration.x < AccelMinX) AccelMinX = accelEvent.acceleration.x; if (accelEvent.acceleration.x > AccelMaxX) AccelMaxX = accelEvent.acceleration.x; if (accelEvent.acceleration.y < AccelMinY) AccelMinY = accelEvent.acceleration.y; if (accelEvent.acceleration.y > AccelMaxY) AccelMaxY = accelEvent.acceleration.y; if (accelEvent.acceleration.z < AccelMinZ) AccelMinZ = accelEvent.acceleration.z; if (accelEvent.acceleration.z > AccelMaxZ) AccelMaxZ = accelEvent.acceleration.z; Serial.print("Accel Minimums: "); Serial.print(AccelMinX); Serial.print(" ");Serial.print(AccelMinY); Serial.print(" "); Serial.print(AccelMinZ); Serial.println(); Serial.print("Accel Maximums: "); Serial.print(AccelMaxX); Serial.print(" ");Serial.print(AccelMaxY); Serial.print(" "); Serial.print(AccelMaxZ); Serial.println(); while (Serial.available()) { Serial.read(); // clear the input buffer } }
خروجی کالیبراسیون معمولی:
دانلود کد
ADXL345 Accelerometer Calibration Type key when ready... Accel Minimums: 0.00 0.00 0.00 Accel Maximums: 0.12 0.20 1.14 Type key when ready... Accel Minimums: 0.00 0.00 0.00 Accel Maximums: 0.12 0.20 1.14 Type key when ready... Accel Minimums: 0.00 0.00 0.00 Accel Maximums: 0.12 0.20 1.14 Type key when ready... Accel Minimums: 0.00 0.00 0.00 Accel Maximums: 0.12 0.20 1.14 Type key when ready... Accel Minimums: 0.00 0.00 -0.24 Accel Maximums: 0.12 1.37 1.14 Type key when ready... Accel Minimums: 0.00 0.00 -0.24 Accel Maximums: 0.12 1.37 1.14 Type key when ready... Accel Minimums: 0.00 -1.22 -0.27 Accel Maximums: 0.12 1.37 1.14 Type key when ready... Accel Minimums: 0.00 -1.22 -0.27 Accel Maximums: 0.12 1.37 1.14 Type key when ready... Accel Minimums: -1.18 -1.22 -0.27 Accel Maximums: 0.12 1.37 1.14 Type key when ready...
ساختار:
Adafruit_ADXL345(int32_t sensorID = -1)
یک درایور ADXL345 را ایجاد میکند. ‘sensorID’ شناسه ی دستگاه است. در هر فرا خوانی getEvent() مقدار هر sensor_event باز خواهد گشت. sensorID هیچ تاثیری بر عملکرد سنسور ها ندارد ولی برای مدیریت sensor events در سیستم با سنسور های چند گانه مفید است.
bool begin(void)
تابع begin() مقدار دهی دستگاه را آغاز میکند. اگر در اتصال به ADX:345 موفق شود true را برمی گرداند.
void getSensor(sensor_t*);
getSensor() اطلاعات اولیه را در مورد سنسور چاپ میکند.
void setRange(range_t range)
تابع setRange() محدوده عملیاتی برای سنسور را تعیین میکند. هر چه محدوده کوچک تر باشد مقادیر دقیق تر خواهند بود.
محدوده ی معتبر برای این سنسور عبارتند از
- ADXL345_RANGE_16_G
- ADXL345_RANGE_8_G
- ADXL345_RANGE_4_G
- ADXL345_RANGE_2_G (default value)
range_t getRange(void);
تابع getRange() محدوده ی عملیاتی فعلی که توسط setRange() تعیین شده است return میکند.
در یافت و تنظیم رنج اطلاعات :
void setDataRate(dataRate_t dataRate);
setDataRate() اندازه تغییرات خروجی را نمایش میدهد.
ارزش بالاتر از ۱۰۰ هرتز موجب نویز میشود. مقدار کمتر از ۶٫۲۵ به تغییرات دما حساس میشود.
جزئیات داده را ببینیم.
- ADXL345_DATARATE_3200_HZ
- ADXL345_DATARATE_1600_HZ
- ADXL345_DATARATE_800_HZ
- ADXL345_DATARATE_400_HZ
- ADXL345_DATARATE_200_HZ
- ADXL345_DATARATE_100_HZ
- ADXL345_DATARATE_50_HZ
- ADXL345_DATARATE_25_HZ
- ADXL345_DATARATE_12_5_HZ
- ADXL345_DATARATE_6_25HZ
- ADXL345_DATARATE_3_13_HZ
- ADXL345_DATARATE_1_56_HZ
- ADXL345_DATARATE_0_78_HZ
- ADXL345_DATARATE_0_39_HZ
- ADXL345_DATARATE_0_20_HZ
- ADXL345_DATARATE_0_10_HZ (default value)
dataRate_t getDataRate(void);
تابع getDataRate() مقدار داده هایی که توسط setDataRate() تنظیم شده را return میکند.
void getEvent(sensors_event_t*);
تابع getEvent() نتیجه را به صورت یک sensor_event باز میگرداند. sensor_event حاوی sensor_id که به سازنده منتقل شده ، همچنین مقادیری که از محور های X،Y و Z خوانده شده است.
فایل ها :
فایل EagleCAD PCB
دانلود فایل
سلام خسته نباشید میشه لطفا این قسمت کالیبراسیون رو بیشتر توضیح بدید بعد از به دست آوردن مقادیر ماکزیممو مینیمم چیکار باید کرد واقعا ممنون میشم اگه راهنمایی کنید.
سلام... ممنون
به واحد تولید محتوا ارجاع داده میشه
سلام
مقادیر آفست رو در موقعیت خاصی از ماژول بدست آوردم.چطور باید کالیبر کنم؟
سلام
توضیحات داده شده
سلام خیلی عالی بود. ببخشید من یک دیتالاگر دارم و برای مچ کردن با این شتاب سنج میخواستم ازتون بپرسم به چه ترتیبی عمل کنم؟ با تشکر
سلام. ممنون
منظورتون چیه به چه ترتیبی عمل کنم؟!!!
یه ماژول ساعت بذارید با توجه به زمان داده ها رو توی sd کارت ( با ماژول میکرو sd ) ذخیره کنید دیگه
با سلام نیاز به راهنمایی و کمک دارم در استفاده از این شتاب سنج، آیا برای سنجش g وارد شده به چتر باز در هنگام سقوط از ارتفاع میشه از این ماژول استفاده کرد؟ اساسا تفاوت g با شتاب چیه؟
سلام
بله میشه
g شتاب گرانش هست که تقریبا برابر 10 هستش ولی شتاب میتونه هر عددی داشته باشه