ویژگی های سنسور شتاب سنج سه محوره ADXL345
با استفاده از سنسور شتاب سنج ADXL345 میتوان جهتگیری زاویه و مسیر جسم مورد نظر را اندازهگیری کرد. این سنسور در سه جهت y ،x و z این عمل را انجام میدهد. این سنسور همچنین قادر به اندازهگیری نیروی شتاب دینامیک و استاتیک است. نیروی شتاب دینامیک بر اثر حرکت و لرزش و نیروی شتاب استاتیک به علت جاذبه زمین رخ میدهد. رنج حساسیت سنسور شتاب سنج ADXL345 از +-2g تا +-16g است. (g تقریبا برابر با 9.8 است.) برای مثال وقتی این سنسور بر روی یک سطح صاف قرار بگیرد، مقدار آن در جهت محور z، 1g+ و در جهت محورهای x و z، صفر است.
ارتباط این سنسور با میکروکنترلر میتواند از طریق دو پروتکل I2C و SPI باشد. رباتیک و رباتهای پرنده، دستگاههای جهتیاب، کنسول های بازی، ریموت کنترولرهای سه بعدی و … ازجمله موارد استفاده از این سنسور میباشد.
دیتاشیت سنسور ADXL345 را می توانید از اینجا دانلود کنید.
ADXL345 Accelerometer Module Datasheet Datasheet
معرفی پایه های (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 استفاده شده است.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
راه اندازی سنسور شتاب سنج سه محوره 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)
سلام ممنون از اموش خوب وکاملتون
اگر بخواهیم این مقادیر به درجه نمایش داده بشن یعنی بین صفر تا 180درجه باشن باید چکار کنیم؟
سلام. ممنون از لطف شما
زاویه یک بردار به صورت زاویه اون با یکی از محورهای مختصات تعریف میشه. فرمول زاویه یک بردار با محور x در یک فضای 3بعدی به شکل زیر هست:
cos2(alpha) = x2/(x2 + y2 + z2).
فرمول زاویه با هر کدوم از محورهای y و z هم با جایگزین کردن x2 در صورت کسر با y2 و z2 به دست میان.
عدد 2 در فرمولهای بالا توان هست.
امکانش هست یک کد سمپل بدین درمورد این موضوع
سلام
شما همین فرمول cos2(alpha) = x2/(x2 + y2 + z2). میتونید در داخل لوپ اصلی برنامه قرار بدید و خروجی هر محور رو در داخل این فرمول بزارید
در کامنت های قبلی آقای ملکی توضیح دادن
سلام کقتتون بخیر میشه در مورد چایه های اینتراپ این ماژول هم توضیح بدید که چه جوری کار میکنن و چه زمانی بک میشن؟
سلام ببخشید اگه بخوام نمودار های شتاب های بدست آمده رو برام رسم کنه باید چ کاری انجام بدم
خواهشمندم راهنماییم کنید
سلام
در خود ide آردوینو میتونید به جای serial print از تابع serial plot استفاده کنید و از منوی tools گرینه serial plotter رو بزنید که براتون نمودار رو نمایش بده
یا اینکه دیتاهای به دست اومده رو در خروجی serial print جمع آوری کنید و داخل excel ببرید و خودتون نمودارشو رسم کنید
اما اگر تغییرات رو real میخواهید ببینید همون serial plotter بدردتون میخوره
من همه این کار ها رو انجام دادم ولی توی خروجی سریال به من 0 می ده
با سلام
ابتدا با استفاده از فایل I2C Scanner بررسی کنید که ماژول بر روی آدرس درستی می باشد ؟؟
من می زنم کد رو صفر می ده سریال مانیتور
با سلام
ابتدا با استفاده از فایل I2C Scanner بررسی کنید که ماژول بر روی آدرس درستی می باشد ؟؟
سلام
ممنون از آموزش مفیدتون.
مراحل را با دقت تا آخر انجام میدم. خروجی سنسور صفر صفر صفر برای مقادیر شتاب هست.
سه بار شتاب سنج adxl345 جدید تست کردم، با برد آردوینو اونو و نانو جدید هم تست کردم جواب نداد. یوتیوب چندتا ویدئو دیدم که گفته بودند حتما باید با لول کانورتر وصل کنم. این کار هم انجام دادم همچنان خروجی ها صفر هستند. ممنون میشم راهنمایی بفرمایید.
با سلام
ابتدا با استفاده از کد I2C اسکنر که در بخش مثال های آردوینو می باشد. بررسی کنید که آدرس ماژول به شما بر میگردد یا خیر. تا زمانی که آدرس را دریافت نکنید هیچ دیتایی نخواهید گرفت.
در صورتی که دیتا را دریافت کردید. سپس بررسی کنید که این آدرس با آدرسی که کتابخانه استفاده میکند یکی می باشد یا خیر.