آموزش راه اندازی ماژول شتاب سنج ADXL335 با آردوینو

آموزش راه‌اندازی ماژول شتاب سنج ADXL335 با آردوینو

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

شتاب سنج­‌ها به‌طور کلی، در موارد حساس به هزینه، توان کم و سنجش شیب و حرکت مانند دستگاه‌­های تلفن همراه­، دستگاه‌­های بازی، حفاظت از دیسک درایو، تثبیت کننده‌­ی تصویر و دستگاه‌­های ورزشی مورد استفاده قرار می‌گیرند.

در ادامه نگاه دقیق‌تری به شتاب سنج و نحوه عمکلرد آن خواهیم انداخت و پس از آن هم راه اندازی سنسور ADXL335، را شروع می‌کنیم.

شتاب سنج چیست؟

نیوتون در قانون دوم حرکت خود، شتاب را با مرتبط ساختن آن به جرم و نیرو تعریف می­‌کند. اگر نیروی مشخصی را به یک جرم اعمال کنید، می­‌توانید شتاب را به‌صورت زیر به دست آورید:

نیرو = جرم x شتاب

شتاب = نیرو / جرم

به عبارت دیگر، شتاب مقدار نیرویی است که برای جابه­‌جایی یک واحد جرم نیاز است.

شتاب سنج­‌ها چگونه کار می­‌کنند؟

برای اینکه نحوه عملکرد شتاب سنج‌­ها را یاد بگیرید، مانند تصویر زیر، یک توپ را درون یک مکعب سه بعدی تصور کنید.

یک توپ در مرکز یک مکعب در حالت بی‌وزنی

فرض کنید این مکعب، خارج از جو زمین که همه چیز در حالت بی‌­وزنی است، قرار دارد. در این حالت، توپ به‌راحتی در مرکز مکعب معلق می‌­ماند. اکنون تصور کنید هر یک از دیواره­‌های مکعب، یکی از محورهای مختصات هستند.

حال اگر ناگهان با شتاب 1g (1g=9.8 m/s ) مکعب را به سمت چپ حرکت دهید، بدون شک توپ، مانند تصویر زیر، با دیواره­‌ی X برخورد خواهد کرد. اگر نیرویی را که توسط توپ به دیواره ­X وارد شده است، اندازه‌گیری کنید، می­‌توانید مقدار شتاب 1g را بر محور X به دست آورید.

برخورد توپ به دیواره‌ی x مکعب و وارد کردن نیروی 1g به این دیواره

اکنون بیایید ببینیم که با قرار دادن مکعب بر روی زمین چه اتفاقی رخ خواهد داد. همان‌طور که در تصویر زیر می‌بینید، با این کار، توپ به‌سادگی بر روی دیواره­‌ی Z خواهد افتاد و نیروی 1g را به دیواره اعمال خواهد کرد.

برخورد توپ به دیواره‌ی Z مکعب و وارد کردن 1g به این دیواره

در این حالت، مکعب در حال حرکت نیست، اما شتاب 1g بر محور Z همچنان حس می‌­شود. زیرا نیروی گرانش زمین، توپ را با نیروی 1g به سمت پایین می­‌کشد.

نکته:

شتاب سنج می‌­تواند شتاب ایستا ناشی از گرانش زمین را در کاربردهای سنجش شیب و نیز شتاب متغیر ناشی از حرکت، شوک و ارتعاش را اندازه گیری کند.

شتاب سنج MEMS چیست و چگونه کار می­‌کند؟

شتاب سنج MEMS  (Micro Electro Mechanical Systems) متشکل از یک ساختار micro-machined است که بر روی یک ویفر سیلیکونی (Silicon wafer) ساخته شده است. این شتاب سنج در ماژول شتاب سنج ADXL335 قرار دارد.

ساختار داخلی شتاب سنج MEMS

ساختار شتاب سنج MEMS توسط فنرهای پلی سیلیکون (Polysilicon springs) معلق شده است. این امر باعث می­‌شود تا هنگام اعمال شتاب به محور مشخصی، ساختار منحرف شود. به دلیل انحراف، ظرفیت بین صفحات ثابت (Fixed Plates) و صفحات متصل به ساختار معلق (Suspended Mass) تغییر می‌کند. این تغییر ظرفیت (Change in capacitance)، متناسب با شتاب در آن محور است. سنسور، این تغییر ظرفیت را پردازش می‌کند و آن را به ولتاژ خروجی آنالوگ تبدیل می­‌کند.

مروری بر سخت افزار ماژول شتاب سنج ADXL335

همان‌طور که در قسمت بالا متوجه شدید، در قلب ماژول شتاب سنج ADXL335 ، یک شتاب سنج کوچک و سه محوره­‌ی MEMS با توان کم از دستگاه‌های آنالوگ با نویز بسیار کم قرار دارد. سنسور شتاب سنج ADXL335، قادر به تشخیص شتاب در بازه­‌ی  3g± می‌باشد و می‌­تواند شتاب ایستا ناشی از گرانش زمین را در کاربردهای سنجش شیب و نیز شتاب متغیر ناشی از حرکت، شوک و ارتعاش اندازه‌گیری کند.

محل اجزای ماژول شتاب سنج ADXL335 که شامل رگولاتور 3.3 ولت، پایه تست عملکرد وضعیت، 3 پایه‌ی خروجی آنالوگ و آی سی ADXL335 می‌شود.

ولتاژ تغذیه­‌ی این شتاب سنج بین 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 با آردوینو را آغاز کنیم و به کد نمونه‌ای که در ادامه خواهید دید، بپردازیم، در اینجا شما را با پایه‌های این ماژول آشنا خواهیم کرد.

پایه‌های ماژول شتاب سنج 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 به آردوینو متصل شده و زمان کدنویسی و تست فرا رسیده است.

کد آردوینو – خواندن سنسور شتاب سنج 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
خروجی شتاب سنج در محور -X
خروجی شتاب سنج در محور +Y
خروجی شتاب سنج در محور -Z
خروجی شتاب سنج در محور +Z

توضیح کد:

برنامه بالا، با تعریف پایه­‌های ورودی آنالوگ آردوینو که پایه‌­های خروجی 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 روی ماژول این مشخصه را کنترل می‌­کند.

محل پایه تست وضعیت بر روی سنسور شتاب سنج ADXL335

زمانی‌که پایه‌­ی 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، ۳.۳ ولت هست. پس برای اینکه مبدل آنالوگ به دیجیتال آردوینو، به جای بازه ۰ تا ۵ ولت پیشفرض خودش، بازه ۰ تا ۳.۳ ولت رو بخونه نیازه که ولتاژ رفرنس آردوینو رو ۳.۳ ولت بدیم. اگر شماتیک داخل مقاله رو ببینید از ۳.۳ ولت خود آردوینو استفاده شده و نیازی به منبع خارجی نیست. بنابراین تفاوتی نداره که سنسور رو با چه ولتاژی روشن میکنید.
      حالا اگر ولتاژ رفرنس رو تغییری ندیم و با ۵ ولت پیشفرض پیش بریم چه اتفاقی میوفته؟ در اینصورت هم آردوینو خروجی ۰ تا ۳.۳ ولت ماژول رو میخونه اما دقت کمتری خواهیم داشت…

      پاسخ

دیدگاهتان را بنویسید

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

Fill out this field
Fill out this field
لطفاً یک نشانی ایمیل معتبر بنویسید.
You need to agree with the terms to proceed

پر بازدید ترین مقالات