تا به حال این موضوع فکر کردهاید که چگونه گوشی هوشمند شما، چرخش صفحه نمایش از حالت عمودی به افقی را تشخیص میدهد؟! اگر میخواهید راه اندازی ماژول شتاب سنج ADXL335 با آردوینو را در این مقاله یاد بگیرید، پس حتما باید بدانید که علت تشخیص این موضوع توسط گوشیهای هوشمندی که در دستمان داریم، سنسور شتاب سنج است که میتواند حرکت از یک طرف به طرف دیگر را حس کند.
شتاب سنجها بهطور کلی، در موارد حساس به هزینه، توان کم و سنجش شیب و حرکت مانند دستگاههای تلفن همراه، دستگاههای بازی، حفاظت از دیسک درایو، تثبیت کنندهی تصویر و دستگاههای ورزشی مورد استفاده قرار میگیرند.
در ادامه نگاه دقیقتری به شتاب سنج و نحوه عمکلرد آن خواهیم انداخت و پس از آن هم راه اندازی سنسور ADXL335، را شروع میکنیم.
شتاب سنج چیست؟
نیوتون در قانون دوم حرکت خود، شتاب را با مرتبط ساختن آن به جرم و نیرو تعریف میکند. اگر نیروی مشخصی را به یک جرم اعمال کنید، میتوانید شتاب را بهصورت زیر به دست آورید:
نیرو = جرم x شتاب
شتاب = نیرو / جرم
به عبارت دیگر، شتاب مقدار نیرویی است که برای جابهجایی یک واحد جرم نیاز است.
شتاب سنجها چگونه کار میکنند؟
برای اینکه نحوه عملکرد شتاب سنجها را یاد بگیرید، مانند تصویر زیر، یک توپ را درون یک مکعب سه بعدی تصور کنید.
فرض کنید این مکعب، خارج از جو زمین که همه چیز در حالت بیوزنی است، قرار دارد. در این حالت، توپ بهراحتی در مرکز مکعب معلق میماند. اکنون تصور کنید هر یک از دیوارههای مکعب، یکی از محورهای مختصات هستند.
حال اگر ناگهان با شتاب 1g (1g=9.8 m/s ) مکعب را به سمت چپ حرکت دهید، بدون شک توپ، مانند تصویر زیر، با دیوارهی X برخورد خواهد کرد. اگر نیرویی را که توسط توپ به دیواره X وارد شده است، اندازهگیری کنید، میتوانید مقدار شتاب 1g را بر محور X به دست آورید.
اکنون بیایید ببینیم که با قرار دادن مکعب بر روی زمین چه اتفاقی رخ خواهد داد. همانطور که در تصویر زیر میبینید، با این کار، توپ بهسادگی بر روی دیوارهی Z خواهد افتاد و نیروی 1g را به دیواره اعمال خواهد کرد.
در این حالت، مکعب در حال حرکت نیست، اما شتاب 1g بر محور Z همچنان حس میشود. زیرا نیروی گرانش زمین، توپ را با نیروی 1g به سمت پایین میکشد.
نکته:
شتاب سنج میتواند شتاب ایستا ناشی از گرانش زمین را در کاربردهای سنجش شیب و نیز شتاب متغیر ناشی از حرکت، شوک و ارتعاش را اندازه گیری کند.
شتاب سنج MEMS چیست و چگونه کار میکند؟
شتاب سنج MEMS (Micro Electro Mechanical Systems) متشکل از یک ساختار micro-machined است که بر روی یک ویفر سیلیکونی (Silicon wafer) ساخته شده است. این شتاب سنج در ماژول شتاب سنج ADXL335 قرار دارد.
ساختار شتاب سنج MEMS توسط فنرهای پلی سیلیکون (Polysilicon springs) معلق شده است. این امر باعث میشود تا هنگام اعمال شتاب به محور مشخصی، ساختار منحرف شود. به دلیل انحراف، ظرفیت بین صفحات ثابت (Fixed Plates) و صفحات متصل به ساختار معلق (Suspended Mass) تغییر میکند. این تغییر ظرفیت (Change in capacitance)، متناسب با شتاب در آن محور است. سنسور، این تغییر ظرفیت را پردازش میکند و آن را به ولتاژ خروجی آنالوگ تبدیل میکند.
مروری بر سخت افزار ماژول شتاب سنج ADXL335
همانطور که در قسمت بالا متوجه شدید، در قلب ماژول شتاب سنج ADXL335 ، یک شتاب سنج کوچک و سه محورهی MEMS با توان کم از دستگاههای آنالوگ با نویز بسیار کم قرار دارد. سنسور شتاب سنج ADXL335، قادر به تشخیص شتاب در بازهی 3g± میباشد و میتواند شتاب ایستا ناشی از گرانش زمین را در کاربردهای سنجش شیب و نیز شتاب متغیر ناشی از حرکت، شوک و ارتعاش اندازهگیری کند.
ولتاژ تغذیهی این شتاب سنج بین 1.8 ولت تا 3.3 ولتا است (ولتاژ بهینه 3.3 ولت) و معمولاً 350 میکروآمپر جریان مصرف میکند. با این حال، وجود یک رگولاتور 3.3 ولت بر روی ماژول، آن را به گزینه مناسبی برای ارتباط با میکروکنترلرهای 5 ولت مانند آردوینو میسازد.
این برد با کاربری ساده و آسان، هر پایه ماژول ADXL335 را در یک پین هدر 6 تایی با فاصلهی 0.1 اینچ قرار میدهد که شامل 3 پایهی خروجی آنالوگ برای اندازهگیری محورهای مختصات X و Y و Z ، دو پایه برای تغذیه و یک پایه برای تست وضعیت است که به شما این امکان را میدهد تا عملکرد سنسور را در کاربرد نهایی بررسی کنید.
خروجیهای آنالوگ بهصورت نسبت سنجی عمل میکنند. به این معنا که شتاب 0g بهطور نامی معادل نیمی از ولتاژ تغذیه یعنی 3.3/2v = 1.65v میباشد. شتاب 3g- در 0 ولت و شتاب 3g+ در3.3 ولت تعریف میشود. شتابهای مابین نقاط تعریف شده نیز متناسباً به دست میآیند.
در جدول زیر میتوانید مشخصات کامل آی سی شتاب سنج ADXL335 را مشاهده کنید:
ولتاژ تغذیه | 1.8v – 3.6v |
جریان مصرفی | 350μA |
محدوده حسگر شتاب | ±3g |
محدوده دما | 40°C to +85°C- |
محورهای حسگر | 3 محور |
حساسیت | 270mV/g to 330mV/g |
مقاومت در برابر شوک | بیش از 10,000g |
ابعاد | 4mm x 4mm x 1.45mm |
معرفی پایههای شتاب سنج ADXL335
قبل از اینکه راه اندازی ماژول شتاب سنج ADXL335 با آردوینو را آغاز کنیم و به کد نمونهای که در ادامه خواهید دید، بپردازیم، در اینجا شما را با پایههای این ماژول آشنا خواهیم کرد.
VCC: پایهی تغذیهی شتاب سنج است که میتواند به 5 ولت در آردوینو متصل گردد.
X-OUT: پایهی خروجی ولتاژ آنالوگ متناسب با شتاب اعمال شده به محور X
Y-OUT: پایهی خروجی ولتاژ آنالوگ متناسب با شتاب اعمال شده به محور Y
Z-OUT: پایهی خروجی ولتاژ آنالوگ متناسب با شتاب اعمال شده به محور Z
GND: پایهی زمین
ST(SELF-TEST): پایهای که مشخصهی خودآزمایی را کنترل میکند. این مشخصه را در انتهای مقاله توضیح خواهیم داد.
سیمکشی – راه اندازی ماژول شتاب سنج ADXL335 با آردوینو
اکنون که بهطور کامل با نحوه عملکرد سنسور شتاب سنج ADXL335 آشنا شدید، میتوانید آن را به آردوینو متصل کنید و راه اندازی آن را آغاز نمایید. اما پیش از آن به قطعات زیر نیاز دارید:
انجام این اتصالات بسیار ساده است. با قرار دادن شتاب سنج روی برد بورد شروع کنید. پایهی VCC را به پایهی 5 ولت آردوینو و پایهی GND را به پایهی زمین آردوینو متصل کنید.
سپس، خروجی X ، Y و Z را به پایههای آنالوگ A0 ، A1 و A2 آردوینو متصل نمایید.
برای بهدست آوردن نتایج دقیق، لازم است ولتاژ مرجع آنالوگ (AREF) آردوینو را تغییر دهید. این کار را میتوانید با اتصال پایهی 3.3 ولت آردوینو به پایهی AREF انجام دهید.
پس از اتمام کار ، باید اتصالات شما مشابه تصویر زیر باشد:
اکنون سنسور ADXL335 به آردوینو متصل شده و زمان کدنویسی و تست فرا رسیده است.
کد آردوینو – خواندن سنسور شتاب سنج ADXL335
برنامه زیر بسیار ساده است. تنها خروجی سنسور کالیبره شده را در هر محور از طریق ارتباط سریال نمایش میدهد. پیش از اینکه تجزیه و تحلیل دقیق برنامه را در بخش بعدی آغاز کنیم، این نمونه کد را امتحان کنید.
const int xInput = A0;
const int yInput = A1;
const int zInput = A2;
// initialize minimum and maximum Raw Ranges for each axis
int RawMin = 0;
int RawMax = 1023;
// Take multiple samples to reduce noise
const int sampleSize = 10;
void setup()
{
analogReference(EXTERNAL);
Serial.begin(9600);
}
void loop()
{
//Read raw values
int xRaw = ReadAxis(xInput);
int yRaw = ReadAxis(yInput);
int zRaw = ReadAxis(zInput);
// Convert raw values to 'milli-Gs"
long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);
long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);
long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);
// re-scale to fractional Gs
float xAccel = xScaled / 1000.0;
float yAccel = yScaled / 1000.0;
float zAccel = zScaled / 1000.0;
Serial.print("X, Y, Z :: ");
Serial.print(xRaw);
Serial.print(", ");
Serial.print(yRaw);
Serial.print(", ");
Serial.print(zRaw);
Serial.print(" :: ");
Serial.print(xAccel,0);
Serial.print("G, ");
Serial.print(yAccel,0);
Serial.print("G, ");
Serial.print(zAccel,0);
Serial.println("G");
delay(200);
}
// Take samples and return the average
int ReadAxis(int axisPin)
{
long reading = 0;
analogRead(axisPin);
delay(1);
for (int i = 0; i < sampleSize; i++)
{
reading += analogRead(axisPin);
}
return reading/sampleSize;
}
تصاویر زیر خروجی شتاب سنج را در موقعیتهای مختلف، بر روی سریال مانیتور نشان میدهد.
توضیح کد:
برنامه بالا، با تعریف پایههای ورودی آنالوگ آردوینو که پایههای خروجی X ، Y و Z سنسور متصل شده، آغاز میشود.
در مرحله بعد، ما باید مقادیر حداقل و حداکثری را که آردوینو ارائه میدهد، تعریف کنیم.
از آنجا که برد آردوینو دارای مبدل 10 بیتی آنالوگ به دیجیتال است، ولتاژهای خروجی سنسور بین 0 تا 3.3 ولت را به مقادیر صحیح بین 0 تا 1023، نگاشت خواهد کرد. به همین علت، RawMin = 0 و RawMax = 1023 تنظیم شده است.
متغیر sampleSize، به آردوینو میگوید که برای بهدست آوردن نتایج دقیقتر، 10 نمونه از هر تبدیل را بگیرد.
const int xInput = A0;
const int yInput = A1;
const int zInput = A2;
// initialize minimum and maximum Raw Ranges for each axis
int RawMin = 0;
int RawMax = 1023;
// Take multiple samples to reduce noise
const int sampleSize = 10;
در تابع setup، ما باید مرجع آنالوگ را روی EXTERNAL تنظیم کنیم ، زیرا 3.3 ولت را به پایهی AREF آردوینو متصل کردهایم. این امر با فراخوانی analogReference (EXTERNAL) انجام میشود. علاوه براین، ما ارتباطات سریال با رایانه را مقداردهی میکنیم.
هشدار!
چنانچه تابع analogReference (EXTERNAL) را فراخوانی نکنید، ولتاژ مرجع (که بهصورت داخلی تولید شده) و پایهی AREF را به هم متصل خواهید کرد که احتمالاً به آردوینو شما آسیب میرساند.
analogReference(EXTERNAL);
Serial.begin(9600);
در تابع setup، خروجیهای آنالوگ را هر 200 میلیثانیه از سنسور میخوانیم. به جای فراخوانی تابع ()analogRead ، تابع ()ReadAxis را فراخوانی میکنیم. این تابع، تنها 10 نمونه از تبدیل ADC را دریافت و میانگین آنها را برمیگرداند.
//Read raw values
int xRaw = ReadAxis(xInput);
int yRaw = ReadAxis(yInput);
int zRaw = ReadAxis(zInput);
تبدیل خروجی سنسور ADXL335 به شتاب (g)
بخش زیر از مهمترین بخش برنامه است. این بخش، ولتاژهای خروجی آنالوگ سنسور را نگاشته و به شتاب گرانشی (g) تبدیل میکند. تابع ()map، نگاشت واقعی را انجام میدهد. بنابراین، زمانیکه ما تابع map
(xRaw, RawMin, RawMax, -3000, 3000) را فراخوانی میکنیم ، مقدار RawMin به 3000- ، مقدار RawMax به 3000+ و مقادیر بین آنها به مقادیر بین 3000- و 3000+ تبدیل میشود.
مقادیر 3000- و 3000+ دلخواه نیستند. در واقع آنها شتاب گرانش اندازهگیری شده توسط سنسور یعنی 3g± را ارائه میکنند.
برای مثال:
هنگامیکه سنسور در محور x، صفر ولت را به عنوان خروجی برمیگرداند، یعنی xRaw = 0 است و تابع ()map ، مقدار 3000- را برمیگرداند که نشان دهنده شتاب 3g- میباشد.
هنگامیکه سنسور درمحور x ، سه و سه دهم ولت را به عنوان خروجی برمیگرداند، یعنی xRaw = 1023 است و تابع ()map ، مقدار 3000+ را برمیگرداند که نشان دهنده شتاب 3g+ است.
وقتی سنسور در محور x ، یک و شصت و پنج صدم ولت را به عنوان خروجی برمیگرداند، یعنی xRaw = 511 است و تابع ()map مقدار 0 را برمیگرداند که نشان دهنده شتاب 0g است.
اکنون واژهی نسبت سنجی (Ratiometric) قابل درکتر است، زیرا ولتاژ خروجی بهصورت خطی با شتاب افزایش مییابد.
// Convert raw values to 'milli-Gs"
long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);
long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);
long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);
در نهایت، خروجی سنسور با تقسیم بر 1000 به G کوچکتر کاهش مییابد و روی سریال مانیتور نمایش داده میشود.
// re-scale to fractional Gs
float xAccel = xScaled / 1000.0;
float yAccel = yScaled / 1000.0;
float zAccel = zScaled / 1000.0;
Serial.print("X, Y, Z :: ");
Serial.print(xRaw);
Serial.print(", ");
Serial.print(yRaw);
Serial.print(", ");
Serial.print(zRaw);
Serial.print(" :: ");
Serial.print(xAccel,0);
Serial.print("G, ");
Serial.print(yAccel,0);
Serial.print("G, ");
Serial.print(zAccel,0);
Serial.println("G");
مشخصهی خودآزمایی ماژول ADXL335
ماژول شتاب سنج ADXL335 دارای یک مشخصهی خودآزمایی است که به شما این امکان را میدهد تا عملکرد آن را بررسی کنید. پایهی ST روی ماژول این مشخصه را کنترل میکند.
زمانیکه پایهی ST به 3.3 ولت متصل میشود، یک نیروی الکترواستاتیک به مولفهی حسگر مکانیکی سنسور اعمال میشود و موقعیت را طوری شبیهسازی میکند که انگار یک حرکت یا چرخش خارجی به دستگاه اعمال شده است. خروجی در مد خودآزمایی با خروجی دستگاه در مد نرمال مقایسه میشود. منظور از مد نرمال زمانی است که مشخصهی خودآزمایی غیرفعال میباشد. چنانچه قدرمطلق تفاضل خروجیها در محدودهی تعیین شده باشد، شتاب سنج بهدرستی کار میکند.
تغییر معمول در خروجی عبارت است از:
1.08g (-325 mv)- روی محور x
1.08g (+325 mv)+ روی محور y
1.83g (+550 mv)+ روی محور z
پایهی ST را میتوان در حالت عادی بدون اتصال باقی گذاشت یا این که به GND متصل کرد.
هشدار!
اعمال ولتاژ بیش از 3.6 ولت به این پایه، منجر به آسیب دایمی سنسور میشود.
خلاصه
همانطور که تا الان فهمیدهاید، شتاب سنج وسیلهای برای تبدیل حرکت مکانیکی به سیگنال الکتریکی است. این ابزار، میزان شتاب را چه با حرکت و چه به دلیل جاذبه زمین به وجود آمده باشد، اندازه میگیرد. سنسور ADXL335 نیز نوعی شتاب سنج است که در این مقاله به آن پرداختیم. هدف ما این بود که شما با نحوهی راه اندازی ماژول شتاب سنج ADXL335 با آردوینو را یاد بگیرید و بتوانید با آن کار کنید.
اگر در مورد این پروژه سوالی داشتید، حتما با ما مطرح کنید تا در اولین فرصت، همکاران متخصص ما پاسخ شما را بدهند.
۴ دیدگاه. Leave new
سلام،
تشکر واسه مقالات مفیدتون،
خدا قوت
سلام محمد عزیز،
خواهش میکنم، لطف داری.
سلام اگر سنسور را با پین ۳.۳ اردینو روشن کنیم ایا باز نیاز به ولتاب رفرنس اکسترنال داریم؟
سلام درود فراوان برشما دوست عزیز
ولتاژ کاری آی سی ADXL335 3.3 ولت هست بنابراین حداکثر ولتاژ خروجی روی پایههای X و Y و Z، ۳.۳ ولت هست. پس برای اینکه مبدل آنالوگ به دیجیتال آردوینو، به جای بازه ۰ تا ۵ ولت پیشفرض خودش، بازه ۰ تا ۳.۳ ولت رو بخونه نیازه که ولتاژ رفرنس آردوینو رو ۳.۳ ولت بدیم. اگر شماتیک داخل مقاله رو ببینید از ۳.۳ ولت خود آردوینو استفاده شده و نیازی به منبع خارجی نیست. بنابراین تفاوتی نداره که سنسور رو با چه ولتاژی روشن میکنید.
حالا اگر ولتاژ رفرنس رو تغییری ندیم و با ۵ ولت پیشفرض پیش بریم چه اتفاقی میوفته؟ در اینصورت هم آردوینو خروجی ۰ تا ۳.۳ ولت ماژول رو میخونه اما دقت کمتری خواهیم داشت…