داغ ترین ها

ورود / عضویت

Arduino Tech

عضویت در سایت

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

بدون شک با ژيروسکوپ آشنایی دارید !! همان وسیله‌ی داخل تلفن همراهتنان که می‌توانید جهت گوشی خود را تشخیص دهید.ولی این تنها کار یک ژیروسکوپ نمی‌باشد. به وسیله‌ی adxl 345 علاوه بر تشخیص شتاب استاتیک و شتاب داینامیک ، می‌توانید تک ضربه ، دو ضربه و همچنین سقوط آزاد را تشخیص دهید.

adxl345 یک ماژول ژیروسکوپ سه محوره با دقت اندازه‌گیری ۱۰ الی ۱۳ بیت (قابل تنظیم توسط کاربر) می‌باشد.امروز قصد ندارم راجب این مسائل خسته کننده صحبت کنم و می‌خواهم بی درنگ به سراغ  ویژگی‌های خاص این ماژول adxl345 یعنی تشخیص تک ضربه ، دوضربه و همچنین قابلیت تشخیص فعالیت و عدم فعالیت این مازول بروم.

یکی از ویژگی‌های منحصر‌ به فرد این ماژول ،۲ پین وقفه‌ای است(INT1 و INT2)  که با تنظیم کردن آن‌ها می‌توان هنگام یک رخداد در ماژول ، آن دو پین را به وضعیت HIGH در آورد. شما می‌توانید این دو  پین وقفه را به پین‌های وقفه‌ی آردوینو متصل کنید و هنگامی یک رویداد خاص در ماژول adxl رخ داد ،برنامه‌ی آردوینو متوقف شود و به سرعت آن رویداد را بررسی کند.

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

آردوینو Uno
ماژول شتاب سنج سه محوره adxl345

اتصالات

ماژول adxl345 برای ارتباط با آردینو از دو پروتکل spi و i2c  پشتیبانی می‌کند ولی ما قصد داریمم در این آموزش از پروتکل i2c استفاده کنیم. پس فقط کافیست دو پین SDA و SCL را به آردوینو خود متصل کنیم. همچنین برای اینکه به ماژول را متوجه کنیم که می‌خواهیم از پروتکل I2C استفاده کنیم، باید پین CS ماژول را به ۳٫۳ ولت آردوینو متصل کنیم.

adxl345

برنامه نویسی

ابتدا کتابخانه ماژول ژیروسکوپ سه محوره adxl345 را دانلود کنید و سپس طبق آموزش زیر آن  را به نرم‌افزار آردوبنو اضافه کنید.

دانلود کتابخانه ماژول adxl345

آموزش نصب کتابخانه در آردوینو

کد‌های زیر را بر روی آردوینو آپلود کنید. و نتیجه را مشاهده کنید. در صورت تحریک ماژول عبارت actibity بر روی سریال مانیتور نمایش داده می‌شود، همچنین در صورت تک ضربه عبارت single tap و برای دو ضربه عبارت double tap  برو روی سریال مانیتور نرم‌افزار نمایش داده می‌شود.

//Arduino 1.0+ Only!
//Arduino 1.0+ Only!
#include <Wire.h>
#include <ADXL345.h>
ADXL345 adxl; //می سازیمADXL345آبجکتی از کلاس
void setup()
{
Serial.begin(9600);
adxl.powerOn();
//تنظیم آستانه حالت فعالیت و عدم فعالیت ماژول (۰-۲۵۵)
adxl.setActivityThreshold(75); //62.5mg per increment
adxl.setInactivityThreshold(75); //62.5mg per increment
adxl.setTimeInactivity(10); // مقدار زمان بین حالت فعال و غیر فعال
//فعال کردن تشخیص ماژول در راستای محور های مختصات - ۱ == on; 0 == off
adxl.setActivityX(1);
adxl.setActivityY(1);
adxl.setActivityZ(1);
//look of inactivity movement on this axes - 1 == on; 0 == off
adxl.setInactivityX(1);
adxl.setInactivityY(1);
adxl.setInactivityZ(1);
//look of tap movement on this axes - 1 == on; 0 == off
adxl.setTapDetectionOnX(0);
adxl.setTapDetectionOnY(0);
adxl.setTapDetectionOnZ(1);
//تنظیم آستانه تشخیص تک ضربه و دو ضربه (۰-۲۵۵)
adxl.setTapThreshold(50); //62.5mg per increment
adxl.setTapDuration(15); //625μs per increment
adxl.setDoubleTapLatency(80); //1.25ms per increment
adxl.setDoubleTapWindow(200); //1.25ms per increment
//تنظیم مقدار آستانه سقوط آزادb(0-255)
adxl.setFreeFallThreshold(7); //(5 - 9) recommended - 62.5mg per increment
adxl.setFreeFallDuration(45); //(20 - 70) recommended - 5ms per increment
//تنظیم تمام وقفه ها برای پین شماره ۱
//I had issues with int pin 2, was unable to reset it
adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT,  ADXL345_INT1_PIN );
adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT,  ADXL345_INT1_PIN );
adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT,  ADXL345_INT1_PIN );
adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT,   ADXL345_INT1_PIN );
adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT,  ADXL345_INT1_PIN );
//فعال و غیر فعال کردن وقفه برای هر یک از حالت های تک ضربه ، دو ضربه ، سقوط آزاد و همچنین حالت فعال و غیر فعال - ۱ == on; 0 == off
adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT, 1);
adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT,  ۱);
adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
}
void loop(){
//خواندن مقدار ماژول در راستای محور های مختصات
int x,y,z;
adxl.readAccel(&x, &y, &z); //read the accelerometer values and store them in variables x,y,z
// Output x,y,z values - Commented out
//Serial.print(x);
//Serial.print(y);
//Serial.println(z);
//حالت سقوط آزاد
if(adxl.triggered(interrupts, ADXL345_FREE_FALL)){
Serial.println("freefall");
//add code here to do when freefall is sensed
}
//حالت غیرفعال
if(adxl.triggered(interrupts, ADXL345_INACTIVITY)){
Serial.println("inactivity");
//add code here to do when inactivity is sensed
}
//حالت فعال
if(adxl.triggered(interrupts, ADXL345_ACTIVITY)){
Serial.println("activity");
//add code here to do when activity is sensed
}
//حالت دو ضربه
if(adxl.triggered(interrupts, ADXL345_DOUBLE_TAP)){
Serial.println("double tap");
//add code here to do when a 2X tap is sensed
}
//حالت تک ضربه
if(adxl.triggered(interrupts, ADXL345_SINGLE_TAP)){
Serial.println("tap");
//add code here to do when a tap is sensed
}
}
مجید امانی

مجید امانی

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

پاسخ دهید

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