داغ ترین ها

ورود / عضویت

Arduino Tech

عضویت در سایت

فراموشی رمز عبور

در سری پروژه های آردوینو اینبار قصد داریم پروژه راه اندازی ماژول شتاب سنج سه محوره ADXL345  با استفاده از آدوینو Uno را شرح دهیم. با تکنولوژی آردوینو همراه باشید

سخت افزار مورد نیاز

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

Arduino Uno

مسخصات کلی ماژول ADXL345:

ولتاژ تغذیه ماژول ۳٫۳

رزولوشن بالای ۱۳ بیت در ±۲g   الی ±۱۶g

پشتیبانی از پروتکلI2C , SPI

تشخیص وضعیت سقوط آزاد

قابلیت تشخیص تک ضربه و دو ضربه

ADXL345 یک ماژول شناب سنج سه محوره می باشد که می توان آن را توسط دو پروتکل ارتباطی I2C   و  SPI راه اندازی نمود.

 ماژول  ADXL345 قادر است  رنج ±۲g   الی ±۱۶g را باا مقادیر پیش فرض۲و۴و۸و۱۶   با رزولوشن بالای ۱۳ بیت اندازه گیری کند..ماژول ADXL345 قادر است شتاب استاتیک و شتاب داینامیک را اندازه گیری کند. منظور از شتاب استاتیک گرانش در کاربردهایی مثل اندازه گیری زاویه کجی و شتاب داینامیک   حاصل از تکان یا حرکت ناگهانی می باشد.با اسنفادده از یک FIFO    ۳۲ سطحی میتوان اطلاعات سنسور را ذخیره نمود تا بار پردازش از پروسسور میزبان کاهش یابد.اين سنسور مجهز به ساختار هوشمند مديريت مصرف توان است كه متناسب با اعمال شتاب به سنسور عمل ميكند و نهايتاً باعث اتلاف كمترين توان روي چيپ خواهد شد.برای برنامه نویسی از دو کتابخانه  Adafruit_ADXL345   و Adafruit Sensor Library  کمپانی Adafruit استفاده میکنیم(قابل ذکر است برنامه و کتابخانه بر اساس پروتکل ارتباطی I2C می باشند)

شماتیک

برای راه اندازی ماژول از پروتوکل I2C استفاده شده است.

پایه SDA به پایه A4 آردوینو Uno متصل شده

پایه ی SCL به پایه A5 آردوینو Uno متصل شده

adxl3451

برنامه

در این برنامه  ۵ LED در روی برد برد قرار گرفته است .LED وسط سقوط آزاد را تشخیص میدهد و در هنگا م سقوط آزاد چراغ آن خاموش میشود.۴ LED اطراف با متمایل شدن برد برد به سمت هر یک ازLED ها، آن LED روشن شده و با افزایش زاوایه شدن نور آن تغییر میکند.کد کلی برنامه به صورت زیر می باشد.

  
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
#define x_up 3
#define x_down 5
#define y_up 6
#define  y_down 9
#define z_  10
float x , y , z;
Adafruit_ADXL345_Unified accel (54321);
void setup()
{
Serial.begin(9600);
Serial.println("Accelerometer Test"); Serial.println("");
pinMode(z_ , 1);
if (!accel.begin())
{
Serial.println(" no ADXL345 detected ... Check your wiring!");
while (1);
}
accel.setRange(ADXL345_RANGE_16_G);
accel.setDataRate(ADXL345_DATARATE_25_HZ);
}
void loop(void)
{
sensors_event_t event;
accel.getEvent(&event);
x = event.acceleration.x;
y = event.acceleration.y;
z = event.acceleration.z;
Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print("  ");
Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print("  ");
Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print("  "); 
Serial.println("m/s^2 ");
if (z > -11 && z < -9)
{
digitalWrite(z_ , 1);
}
else
{
digitalWrite(z_ , 0);
}
if (x > 0)
{
x = map(x, 0, 11, 0, 255);
analogWrite(x_up , x);
}
else if (x < 0)
{
x = map(x, 0, -10, 0, 255);
analogWrite(x_down , x);
}
if (y < 0)
{
y *= -1;
y = map(y , 0, 10, 0, 255);
analogWrite(y_down , y);
}
else if ( y > 0)
{
y = map(y , 0 , 10 , 0, 255);
analogWrite(y_up , y);
}
}

توضیح کدها

در ابتدا کتابخانه ی Adafruit_ADXL345  را از این لینک دانلود کنید.

سپس کتابخانه  Adafruit_Sensor را از این لینک دانلود کنید.

کتابخانه ی این ماژول را با نام Adafruit_ADXL345_U.h به برنامه اضافه میکنیم.

برای استفاده از این کتابخانه باید کتابخانه های Adafruit_Sensor.h و Wire.h را نیز به برنامه اضافه کنیم.

Adafruit_ADXL345_Unified accel (54321);

از کلاس Adafruit_ADXL345_Unified یک شی به نام accel میسازیم.درون سازنده آن ID دلخواهی برای سنسور انتخاب میکنیم.انجام این کار زمانی که از چند ماژول استفاده میکنیم بسیار مفیدمی باشد.

    if (!accel.begin())
    {
    Serial.println(" no ADXL345 detected ... Check your wiring!");
    while (1);
    }

با استفاده از این کد بالا اگر در تشخیص  ماژول و یا ارتباط با آن با مشکلی برخوردیم ،بر روی سریال مانیتور ارور no ADXL345 detected … Check your wiring به نمایش در می آید و برنامه متوقف می شود.

accel.setRange(ADXL345_RANGE_16_G);

تابع  setRange(range_t range)  دقت اندازه گیری سنسور را مشخص میکند. این تابع ممیتواند مقادیر زیر را دریافت کند.

ADXL345_RANGE_16_G

ADXL345_RANGE_8_G

ADXL345_RANGE_4_G

ADXL345_RANGE_2_G

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

accel.setDataRate(ADXL345_DATARATE_0_20_HZ);

با استفاده از این تابع  میتوان سرعت آپدیت شدن مقادیر خروجی را تنظیم نمود. این تابع میتواند مقادیر زیر را دریافت کند:

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

در صورت  استفاده از فرکانس بیش از ۱۰۰ هرتز ، نویزگیری بسیار زیاد میشود.وو ددر صورت استفاده از فرکانس کمتر از ۶٫۲۵ هرتز ، سنسور به تغییرات دما بسیار حساس میشود .در صورتی که از این تابع  در برنامه استفاده نشود ، کامپایلر به طور پیش فرض مقدار ADXL345_DATARATE_0_10_HZ را برای ماژول در نظر میکیرد.

sensors_event_t event;

یک اینستنس از  sensors_event_t به نام evevnt می سازیم و توسط تابع ()getEvent ،به شی ساخته شده از کلاس Adafruit_ADXL345_U.h به نام accle نسبت میدهیم.

ما بقی کد ها  نسبتا ساه می‌باشند و نیازی به توضیح آن ها نیست.

منبع: دیجی اسپارک

مجید امانی

مجید امانی

توی زمینه رباتیک، الکترونیک، میکروکنترلر و IT فعالیت می کنم...

پاسخ دهید

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