معرفی شتاب سنج ADXL335 و اتصال به آردوینو

محتویات
آیا تا به حال فکر کردهاید که گوشی هوشمند شما چگونه تشخیص میدهد که جهت بالا کدام سمت است؟ این یکی از نوآورانهترین ویژگیهای گوشیهای هوشمند امروزی است. همه آنها یک دستگاه کوچک به نام شتاب سنج (Accelerometer) در مدار خود دارند که تشخیص میدهد وقتی دستگاه را به چپ و راست کج میکنید، چه اتفاقی میافتد. اینطور است که گوشی شما میفهمد چه زمانی باید از حالت عمودی (Portrait) به حالت افقی (Landscape) تغییر وضعیت دهد.
شتابسنجها به طور گسترده در کاربردهای کممصرف و کمهزینهای مانند دستگاههای موبایل، سیستمهای بازی، حفاظت از هارد دیسک، تثبیت تصویر و دستگاههای ورزشی و سلامتی استفاده میشوند.
بیایید بررسی کنیم که شتابسنجها چیستند، چه کاری انجام میدهند و چگونه کار میکنند.
شتابسنج چگونه کار میکند؟
برای درک نحوه عملکرد شتابسنجها، یک توپ را در داخل یک مکعب سهبعدی تصور کنید.
حالت بیوزنی
فرض کنید این مکعب در فضای بیرونی قرار دارد، جایی که همه چیز بیوزن است. در این حالت، توپ به سادگی در مرکز مکعب شناور میماند.
حرکت ناگهانی
حال فرض کنید هر دیواره نشاندهنده یک محور خاص است. اگر مکعب را ناگهان با شتاب 1g به چپ حرکت دهیم (یک نیروی جی 1g معادل شتاب گرانشی 9.8 متر بر ثانیهمربع است)، توپ بدون شک به دیواره X برخورد میکند. اگر نیروی وارد شده توسط توپ به دیواره X را اندازهگیری کنیم، میتوانیم یک مقدار خروجی 1g در امتداد محور X به دست آوریم.
نیروی گرانش
حالا ببینیم اگر این مکعب را روی زمین قرار دهیم چه اتفاقی میافتد. توپ به سادگی روی دیواره Z میافتد و نیرویی معادل 1g وارد میکند، همانطور که در نمودار زیر نشان داده شده است:
در این حالت، مکعب حرکت نمیکند، اما همچنان مقدار 1g در محور Z خوانده میشود. این به این دلیل است که گرانش (که در واقع نوعی شتاب است) توپ را با نیروی 1g به سمت پایین میکشد.
اگرچه این مدل دقیقاً نشاندهنده نحوه ساخت یک شتابسنج واقعی نیست، اما اغلب برای درک این موضوع مفید است که چرا سیگنال خروجی شتابسنج معمولاً به صورت ±g مشخص میشود، یا چرا شتابسنج در حالت سکون مقدار 1g در محور Z نشان میدهد، یا چه مقادیری از شتابسنج در جهتهای مختلف انتظار میرود.
شتابسنج MEMS چگونه کار میکند؟
شتابسنج MEMS (سیستم میکروالکترومکانیکی) یک ساختار میکروماشینشده است که روی یک ویفر سیلیکونی ساخته شده است. این ساختار توسط فنرهای پلیسیلیکونی معلق شده است و به آن اجازه میدهد هنگام شتابگیری در امتداد محورهای X، Y و/یا Z انحراف پیدا کند.
در نتیجه این انحراف، ظرفیت خازنی بین صفحات ثابت و صفحات متصل به ساختار معلق تغییر میکند. این تغییر در ظرفیت خازنی متناسب با شتاب در آن محور است. سنسور این تغییر در ظرفیت خازنی را پردازش کرده و آن را به یک ولتاژ خروجی آنالوگ تبدیل میکند.
بررسی ماژول ADXL335
در هسته این ماژول، یک شتابسنج MEMS سهمحوره کوچک، کممصرف و کمنویز از شرکت Analog Devices به نام ADXL335 قرار دارد. این سنسور نه تنها میتواند شتاب استاتیک ناشی از گرانش را اندازهگیری کند، بلکه شتاب دینامیک ناشی از حرکت، ضربه یا لرزش را نیز اندازهگیری میکند.
این ماژول سازگار با برد بورد، تمام پینهای ADXL335 را به یک هدر 6 پین با فاصله 0.1 اینچ منتقل میکند، از جمله 3 خروجی آنالوگ برای اندازهگیری محورهای X، Y و Z، 2 پین تغذیه و یک پین تست خودکار (Self-Test).
تغذیه
ADXL335 با ولتاژ 1.8 تا 3.6 ولت DC کار میکند (معمولاً 3.3 ولت). با این حال، رگولاتور 3.3 ولت روی برد، آن را برای اتصال به میکروکنترلرهای 5 ولتی مانند آردوینو ایدهآل میکند. این سنسور در حین کار عادی تنها 350 میکروآمپر جریان مصرف میکند.
محدوده اندازهگیری
ADXL335 دارای محدوده اندازهگیری کامل ±3g است. این بدان معناست که حداکثر مقدار شتابی که ADXL335 میتواند به دقت اندازهگیری و به عنوان خروجی نشان دهد، ±3g است. اگر به عنوان مثال با شتاب 4g حرکت کند، شتابسنج خراب نمیشود، اما خروجی ممکن است به حد اشباع برسد.
حداکثر شتاب مطلق ADXL335 برابر با 10,000g است. در صورت قرار گرفتن در معرض شتابهای بیشتر از 10,000g، ممکن است ADXL335 خراب شود.
خروجی نسبتسنج (Ratiometric)
خروجی ADXL335 نسبتسنج است، بنابراین ولتاژ خروجی به طور خطی با شتاب در محدوده افزایش مییابد. این بدان معناست که خروجی اندازهگیری 0g همیشه در نصف ولتاژ تغذیه 3.3 ولت (1.65 ولت) قرار دارد، -3g در 0 ولت و +3g در 3.3 ولت است، با مقیاسبندی کامل در بین این مقادیر.
مشخصات فنی
در اینجا مشخصات فنی ADXL335 آورده شده است:
- ولتاژ کاری: 1.8 تا 3.6 ولت
- جریان کاری: 350 میکروآمپر (معمولی)
- محدوده اندازهگیری: ±3g (محدوده کامل)
- محدوده دمایی: -40 تا +85 درجه سانتیگراد
- محورهای اندازهگیری: 3 محوره
- حساسیت: 270 تا 330 میلیولت بر g (نسبتسنج)
- مقاومت در برابر ضربه: تا 10,000g
- ابعاد: 4mm x 4mm x 1.45mm
پینهای ماژول 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
کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است، در اینجا قسمت های مختلف کد را بررسی میکنیم. این کد به سادگی خروجی کالیبره شده سنسور را در هر محور روی رابط سریال نمایش میدهد.
کد با تعریف پینهای ورودی آنالوگ آردوینو شروع میشود که پینهای خروجی X، Y و Z سنسور به آنها متصل شدهاند.
const int xInput = A0; const int yInput = A1; const int zInput = A2;
در ادامه، دو متغیر RawMin
و RawMax
تعریف میشوند. از آنجا که آردوینو دارای یک ADC 10 بیتی است (2^10 = 1024)، ولتاژهای خروجی ADXL335 که بین 0 تا 3.3 ولت هستند، به مقادیر عددی بین 0 تا 1023 تبدیل میشوند. به همین دلیل RawMin
روی 0 و RawMax
روی 1023 تنظیم شده است.
// تعیین محدوده کمینه و بیشینه برای هر محور int RawMin = 0; int RawMax = 1023;
متغیر sampleSize
تعداد نمونههایی را مشخص میکند که آردوینو باید در هر تبدیل ADC بگیرد. در اینجا sampleSize
روی 10 تنظیم شده است تا نتایج دقیقتری به دست آید.
// گرفتن چندین نمونه برای کاهش نویز const int sampleSize = 10;
در بخش setup()
، ابتدا مرجع آنالوگ را با استفاده از تابع analogReference(EXTERNAL)
روی حالت EXTERNAL تنظیم میکنیم. سپس ارتباط سریال با کامپیوتر را راهاندازی میکنیم.
هشدار: این کار ضروری است زیرا ما پین AREF آردوینو را به 3.3 ولت متصل کردهایم. اگر analogReference(EXTERNAL)
را فراخوانی نکنید، ولتاژ مرجع داخلی آردوینو و پین AREF به هم اتصال کوتاه میشوند و ممکن است به آردوینو آسیب برسد.
analogReference(EXTERNAL); Serial.begin(9600);
در بخش loop()
، هر 200 میلیثانیه خروجیهای آنالوگ سنسور را میخوانیم. توجه داشته باشید که به جای استفاده مستقیم از تابع analogRead()
، از تابع سفارشی ReadAxis()
استفاده میکنیم. این تابع به سادگی ده نمونه از تبدیل ADC میگیرد و میانگین آنها را بازمیگرداند.
// خواندن مقادیر خام int xRaw = ReadAxis(xInput); int yRaw = ReadAxis(yInput); int zRaw = ReadAxis(zInput);
خروجی کد در حالت های مختلف به شکل زیر خواهد بود:
تبدیل خروجی ADXL335 به شتاب (g)
قطعه کد زیر مهمترین بخش برنامه است. این کد ولتاژهای خروجی آنالوگ سنسور را به شتاب گرانشی (g) تبدیل میکند.
این تبدیل با استفاده از تابع map()
داخلی IDE انجام میشود. وقتی map(xRaw, RawMin, RawMax, -3000, 3000)
فراخوانی میشود، مقدار RawMin
به -3000، مقدار RawMax
به 3000 و مقادیر بین آنها به مقادیر متناظر تبدیل میشوند.
اعداد -3000 و 3000 تصادفی نیستند. این اعداد در واقع نشاندهنده شتاب گرانشی اندازهگیری شده توسط سنسور بر حسب میلیجی (milli-g) هستند، یعنی ±3g (-3000 میلیجی تا 3000 میلیجی).
به عنوان مثال:
- اگر سنسور روی محور X ولتاژ 0 ولت خروجی دهد (یعنی
xRaw = 0
)، تابعmap()
مقدار -3000 را بازمیگرداند که معادل -3g است. - اگر سنسور روی محور X ولتاژ 1.65 ولت خروجی دهد (یعنی
xRaw = 511
)، تابعmap()
مقدار 0 را بازمیگرداند که معادل 0g است. - اگر سنسور روی محور X ولتاژ 3.3 ولت خروجی دهد (یعنی
xRaw = 1023
)، تابعmap()
مقدار 3000 را بازمیگرداند که معادل +3g است.
اصطلاح نسبتسنج (Ratiometric) اکنون معنی بیشتری پیدا میکند، زیرا ولتاژ خروجی به طور خطی با شتاب در محدوده افزایش مییابد.
// تبدیل مقادیر خام به 'میلیجی' 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) کسری تبدیل میشود و روی مانیتور سریال نمایش داده میشود.
// تبدیل به جی (G) کسری 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 (Self-Test) روی ماژول این ویژگی را کنترل میکند.
هنگامی که پین ST به 3.3 ولت متصل میشود، یک نیروی الکترواستاتیک به طور داخلی بر روی تیرک شتابسنج اعمال میشود. حرکت حاصل از تیرک به کاربر امکان میدهد تشخیص دهد که آیا شتابسنج عملکردی دارد یا خیر.
تغییرات مورد انتظار در خروجی به شرح زیر است:
- محور X: -1.08g (-325 میلیولت)
- محور Y: +1.08g (+325 میلیولت)
- محور Z: +1.83g (+550 میلیولت)
پین ST ممکن است در حین کار عادی باز باشد یا به زمین متصل شود.
هشدار: قرار دادن پین ST در معرض ولتاژهای بالاتر از 3.6 ولت ممکن است به طور دائمی به شتابسنج آسیب برساند.
موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود