نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
آزادی حجاز از دست نااهلان
مهدی دمیرچیلو

پروژه و آموزش ماژول زاویه سنج adxl345 با arduino

به نام خدا : تو این مطلب از سری مطالب پروژه آردوینو ، میخوام پروژه و آموزش ماژول زاویه سنج adxl345 با arduino رو تو سایت قرار بدم، قسمتهایی از دیتاشیت رو هم به مطلب اضافه کردم، چند پروژه نمونه، فایل کتابخونه ماژول فوق،

پروژه و آموزش ماژول زاویه سنج adxl345 با arduino


داستان!
گفتم داستان یاد کتاب داستان راستان شهید مطهری افتادم؛ ای یادش بخیر بچه بودیم(الان مثلا بزرگ شدبم^_^) چقدر من کتاب داستان دوست داشتم، میرفتم میخریدم و میخوندم ولی الان نمیدونم کجا هستن اون کتاب داستان های من متاسفانه، البته این علاقه من با خریدن کتاب توسط خونواده ام  برا من شروع شد، اول اونا برا من کتاب داستان خریدن و من علاقه مند شدم و بعد خودم میرفتم و کتاب داستان میخریدم – خب بگذریم از این موضوع.
والا ما یه دوستی داریم که یه کار خوبی کرد، بچه مسجدی ها(افراد کوچکتر از خودش) رو جمع کرد و بهشون آموزش الکترونیک داد و اینا رو برد مسابقات الکترونیکی، خداییش کار خیلی خوبی کرد، من خودمم میخوام همین کار رو کنم، برم بچه های مسجد رو جمع کنم و بهشون آموزش بدم تا فازشون تغییر کنه laugh ، خداییش ما که بچه بودیم فازمون ماهی گرفتم از جوب سر کوچمون بود(تفریحات سالم ما pardon)، فازمون تشک بازی بود^_^، از این جور کارا، زیاد تو فاز کارای الکترونیکی نبودیم، اصلا هم نمیدونستم که همچین چیزایی هستش و میشه ساخت، فکرمم خداییش یه بار هم به این سمت نرفت، خب نمیدونستم همچین جیزایی هستش، اگه یکی بهم اینا رو یاد میداد میرفتم یاد میگرفتم والان که 22 ساله یه انیشتنگی میشدم برا خودم^_^، الان من بچه های مسجد رو میبینم بچه های کوچمون رو میبینم یا همش دارن با موبایلشون ور میرن(ما اون موقع زمان خودمون با آتاری دستی ور میرفتیم^_^) یا ول کوچه خیابون هستن، خداییش غیر اینه، حالا بهترین افرادش کسایی هستن که یه کلاس ورزش حداقل میرن، خلاف سنگینشون یه کلاس ورزش رفتن هستش، حالا به نظرم ماهایی که یه ذره الکترونیک و کار با میکروها رو بلدیم بریم به این بچه ها یاد بدیم و چند تا پروژه براشون ببنیم و یادبدیم تا خودشون ببندن مدار های مورد علاقشون رو بعد مثلا برریمشون مسابقات رباتیک، حالا برن اونجا شرکت کنن و یا برن اونجا برا بازدید، اگه برا شرکت کردن ببریمشون فوقش آخرین تیم میشم بیشتر از این؟ ولی خب با اون فضا آشنا میشن علاقه مند میشن، میبیننن آره همه چیز موبایل بازی و تشتک بازی^_^ نیست، چیزای جالبی هم هستش که میشه روش وقت گزاشت و یادشون گرفت و…، حالا در کل من یکی از برنامه هام این هستش که تابستون برم به بچه های مسجدمون آردوینو رو یاد بدم و بعد تابستون ببینم از طرف آموزش پرورش مسابقات رباتیکی چیزی برگزار میشه یا نه(که حتما برگزار میشه) اونا رو توی اون مسابقات شرکت بدم، این بچه ها رو یه تیم کنم و بهشون آموزش بدم و بفرستمشون برای مسابقات، من اگه بتونم این کار رو کنم بعد خودشون دیگه پیگر کار میشن و دنبال یادگیری و…نظرتون چیه؟ به نظرتون عملی هستش و برنامه خوبی هستش؟ خودتون جای من باشین چیکار میکنید؟ برنامه بهتری اگه دارید بگید.^_^
 
 

ویژگی های ماژول زاویه سنج adxl345

  • چریان مصرفی کم : 23uA در مد اندازه گیری دیتا و 1uA در مد standby (در ولتاژ 2.5)
  • کوچیک و نازک : 3 mm × 5 mm × 1 mm در فرمت بسته LGA
  • محدوده دمای کاری : −40°C تا  +85°C
  • پهنای باند قابل تعیین توسط دستورات سریال.
  • محدوده اندازه گیری قابل انتخاب توسط دستورات ریال
  • قابلیت کار با پروتوکل های SPI و I2C
  • محدوده ولتاژ پایه های ورودی/خروجی 7V تا Vs
  • ولتاژ تغذیه IC از 2ولت تا 3.6ولت
  • تشخیص سقوط آزاد
  • تشخیص فعالیت و عدم فعالیت IC
  • تشخیص 1ضربه و 2ضربه(در آن واحد، یه ضربه به IC وارد شده یا دو تا ضربه وارد شده)
  • دقت(resolution) قابل تعیین توسط کاربر
    1. دقت 10بیت ثابت
    2. دقت کامل، که دقت با محدوده g افزایش میابد، تا 13 بیت دقت در ±16 g

 
 

کاربردهای ماژول زاویه سنج adxl345

  • Handsets
  • تجهیزات پزشکی
  • بازی
  • تجهیزات صنعتی
  • دستگاه های ناوبری شخصی (مثلا کنترل تعادل ربات پرنده)
  • محافظت از هارد دیسک(HDD) —> مثلا شتاب(سرعت) زاویه ای هارد دیسک رو کنترل میکنیم باهاش

 
توضیحات عمومی

  • ADXL345 یه IC  کوچیک و لاغر(نازک)! و کم مصرف و شتاب(و سرعت) سنج 3 محوره با حداکثر دقت 13بیت و اندازه گیری تا ±16 g
  • خروجی دیجیتال دیتا فرمت بنده شده در 16بیت مکمل و در دسترس هستش از طریق SPI یا I2C
  • ADXL345 مناسب هستش برای برنامه های موبایل، این IC اندازه میگیره شتاب جاذبه استاتیک در برنامه tilt-sensing
  • و همچنین به خوبی محاسبه میکنه شتاب داینامیک رو از حرکت و ضربه.
  • در مد حداکثر دقت(3.9 mg/LSB، IC) زاویه رو با خطای کمتر از 1 درجه اندازه میگیره.
  • چندین تابع مخصوص سنس کردن پشتیبانی میشه.
  • تشخیص فعالیت و عدم فعالیت IC یا نبود حرکت به وسیله مقایسه شتاب در هر زاویه با thresholds (آستانه) تنظیم شده توسط کاربر.(یعنی کاربر تنظیم میکنه یه چیزی رو و بعد IC اونو میخونه و بر حسب اون پرچم فعال/غیر فعال بودن IC رو 1 میکنه.)
  • تشخیص 1ضربه و 2ضربه در هر وضعیت و زاویه ای(راستایی)
  • تشخیص سقوط آزاد IC
  • قابلیت انتساب هر یک از 8 ویژگی ماژول به هر یک از 2 وقفه خارجی موجود.
  • وجود یک بافر حافظه جامع و قانونی و معلق قابل مدیریت توسط سیستم با یه 32سطح اول ورود-اول خروج(FIFO)  که میتواند مورد استفاده قرار بگیرد برای کم کردن میزان کار و فعالیت پردازشگر(میکرو) و کاهش مصرف جریان مدار کلی.(مدار در حالت کلی)

 
 
نمودار داخلی از نحوه کار IC به صورت زیر هستش.
نمودار داخلی ماژول زاویه سنج adxl345
 
 
وقفه در ADXL345
ADXL345 دارای دو وقفه هستش به نام های INT1 و INT2، هر دو پایه وقفه  push-pull(معنیش رو نمیدونم) شدن، حالت پیشفرض پیکربندی پایه های وقفه بر روی سطح منطقی 1 هستش(یعنی وقفه با سطح منطقی 1 فعال میشه).
که میشه این مورد رو تغییر داد به سطح منطقی 0، به وسیله تنظیم بیت INT_INVERT از ریجستر DATA_FORMAT به آدرس 0x31 (که این کار رو به کمک تابع زیر میتونید انجام بدید، البته قسمت وقفه های این کتابخونه یکم مشکل داره، ما که کلی باهاش کلنجار رفتیم به این نتیجه رسیدیم که وقفه این کتابخونه به درستی کار نمیکنه، حالا شاید اشتباه از من بوده باشه)

وقفه های فعال میشن به وسیله تنظیم بیت اختصاص داده شده در ریجستر INT_ENABLE به آدرس  0x2Eو قابل تنظیم هستن که بر روی کدام پایه رخ بدهند به کمک ریجستر INT_MAP با آدرس 0x2F (این دو کار به کمک دو تابع زیر انجام میشه)

وقتی در ابتدا پیکربندی میکنید پایه های وقفه رو، این مورد پیشنهاد میشه که ابتدا وقفه ها و توابع رو کاراش رو انجام و سپس وقفه رو فعال کنید.
توجه : اینایی که الان دارم میگم یه توضیحات همینجوری هستش، در قسمت مربوطه تمام توابع کتابخونه(موارد مورد نیاز) رو توضیح میدم.
 

مدهای کاهش مصرف جریان ماژول ADXL345

ADXL345 به صورت خودکار متعادل میکنه جریان مصرفیش رو نسبت به نرخ انتقال داده خروجی(جداول زیر رو ببینید.)
در جدول زیر رابطه بین جریان مصرفی adxl345 و نرخ انتقال داده رو میبینید(در مد normal)
مدهای کاهش مصرف جریان ماژول ADXL345
 
در جدول زیر هم رابطه بین جریان مصرفی ماژول و نرخ انتقال داده رو در مد “Low Power” میبینید
مدهای کاهش مصرف جریان ماژول ADXL345
 
در هر دو جدول بالا همون طور که دیدید هر چی نرخ انتقال داده کمتر میشد جریان مصرفی هم کاهش پیدا میکرد!!!
این ماژول یه مد دیگه با نام Standby داره که میتونه انتخاب بشه برا ماژول که در این مد جریان مصرفی به0.1µA  کاهش پیدا میکنه، در این مد اندازه گیری وجود نداره.
 
 

مدهای حافظه FIFO

ADXL345 شامل تکنولوژی patent pending هستش برای یه حافظه embedded مدیریت شده با 32 سطح FIFO که میتوان مورد استفاده قرار بگیرد برای کاهش وظایف پروسسور(میکرو کنترلر).
این بافر 4 مد دارد :  bypass و FIFO و stream و trigger
هر کدوم از مد های فوق میتونن انتخاب بشن به وسیله تنظیم بیت FIFO_MODE (بیت های 6-7) از ریجستر FIFO_CTL (به آدرس0x38) (در این کتابخونه این امکان وجود نداره.)
FIFO تعداد 32 دیتا در خودش ذخیره میکنه در این مد و بعد دیگه این کار رو متوقف میکنه.
بعد از این که FIFO متوقف کرد جمع آوری دیتا رو، و دستگاه ادامه میده به فراهم کردن!، بنابراین، ویژگی هایی همچون تشخیص TAB میتواند مورد استفاده قرار بگیرد بعد از این که FIFO پر شده است.
 
مد Stream
در این مد، دیتا که شامل اندازه گیری محور های X-Y-Z میشه ذخیره میشن در حافظه FIFO.
وقتی تعداد نمونه ها در FIFO برابر تعداد نمونه های مشخص شده در بیت های samples (ریجستر FIFO_CTL به آدرس 0x38) میشه، وقفه watermark فعال میشه.
FIFO به ذخیره کردن نمونه ها ادامه میده و نگه میداره 32 نمونه از اندازه گیری هر 3 محور در خودش، وقتی دیتای جدیدی میاد با قدیمی ترین دیتا جایگزین میشه.
وقفه watermark رخ میده تا زمانی که تعداد نمونه ها در FIFO کمتر بشه از مقدار ذخیره شده در بیت های samples از ریجستر FIFO_CTL
 
مد Trigger
در این مد، FIFO ذخیره میکنه نمونه ها رو، حداقل 32 نمونه نگه میداره از اندازه گیره هر 3 محور.
بعد رخداد  trigger رخ میده و یه وقفه به سمت پایه INT1 یا INT2 ارسال میشه(که این امر تعیین میشه به وسیله بیت trigger از ریجستر FIFO_CTL)
FIFO نگه میداره N نمونه آخر رو(که N نمونه ای هستش که مشخص میشه به وسیله بیت های samples از ریجستر FIFO_CTL) و سپس operates در مد FIFO، جمع آوری نمونه جدید تنها زمانی انجام میشود که FIFO پر نباشد.
یه تاخیر زمانی با حداقل 5us باید باشه بین رخ دادن رخداد trigger و شروع خوندن دیتا از FIFO برای اجازه دادن به FIFO که حذف کنه دیتای قبلی رو و جایگزین کنه اون مکان رو با نمونه های ظرروری.
 

خوندن اطلاعات از FIFO

اطلاعات داخل FIFO خونده میشه از طریق ریجستر های DATAX,DATAY,DATAZ (به آدرس 0x32 تا 0x37)
وقتی که FIFO در هر کدوم از 3 مود فوق هستش( FIFO، stream یا  trigger)خوندن هر کدوم از 3 ریجستر فوق باعث خوندن اطلاعات ذخیره شده از FIFO میشه.
هر زمان که دیتا از FIFO خونده میشه، قدیمی ترین دیتا مربوط به هر کدوم از 3 محور در سه ریجستر فوق قرار میگیرن.
 
 

توضیح توابع کتابخانه ماژول ADXL345

به کمک تابع getInterruptSource میتونیم بفهمیم که کدوم یک از وقفه ها فعال هستن، که باید یکی از 8 ثابت زیر رو به عنوان پارامتر به این تابع بدیم؛ که اگه اون وقفه فعال باشه تابع مقدار 1 رو بر میگردونه و در غیر این صورت مقدار 0 رو برمیگردونه.

ADXL345_DATA_READY

ADXL345_SINGLE_TAP

ADXL345_DOUBLE_TAP

ADXL345_ACTIVITY

ADXL345_INACTIVITY

ADXL345_FREE_FALL

ADXL345_WATERMARK

ADXL345_OVERRUNY

در زیر هر کدوم از 8 وضعیت بالا رو به ترتیب توضیح میدم :
 
ADXL345_DATA_READY
وقتی دیتای جدیدی برای دریافت موجود باشه بیت DATA_READY  یک میشه و وقتی دیتای جدیدی وجود نداره این بیت پاک میشه، لذا تا زمانی که شما دیتا رو نخونید این بیت 1 میمونه.
 
ADXL345_SINGLE_TAP
بیت SINGLE_TAP یک میشه برای زمان کوتاهی  وقتی شتاب ضربه ای! رخ بده که مقدارش از مقدار ذخیره شده در ریجستر ) THRESH_TAPبه آدرس (0x1D بزرگتر بشه، که این زمانش رو هم میشه تعیین کرد به کمک ریجستر DUR (به آدرس(0x21 >>>> لذا وقتی ضربه ای به adxl345 وارد بشه این بیت 1 میشه، منظور از ضربه اینه که مثلا این ic روی دست شما قرار داره و شما یه لحظه(خدایی نکرده) با دست میوفتید روی زمین و یه ضربه ای به دست شما قطعا وارد میشه و ic این ضربه رو متوجه میشه که حالا تو جای خودش میتونه مفید باشه، برای این ویژگی میتونید فیلم زیر رو ببینید که تو کانال آپاراتم براتون آپلود کردم.

برای تعیین میزان حساسیت ضربه میتونید از تابع setTapThreshold استفاده کنید و برای تنظیم زمان این ضربه میتونید از تابع setTapDuration استفاده کنید.
 
ADXL345_DOUBLE_TAP
بیت DOUBLE_TAP یک میشه وقتی دو تا شتاب ضربه ای! رخ بده که مقدارش از مقدار تعیین شده در ریجستر THRESH_TAP (به آدرس (0x1D بزرگتر باشه که رخ میده برای مدت زمان کوتاهی که مشخص میشه به کمک ریجستر DUR (به آدرس (0x21، …
این ویژگی هم مثل ویژگی SINGLE_TAP هستش فقط تو SINGLE_TAP یه تک ضربه رو تشخیص میده ولی DOUBLE_TAP یه ضربه دوتایی پشت سر هم وسریع رو تشخیص میده.
برای تعیین میزان حساسیت ضربه میتونید از تابع setTapThreshold استفاده کنید و برای تنظیم زمان این ضربه میتونید از تابع setTapDuration استفاده کنید.
برای اینکه چه محورهایی فعال باشن در TAP یه ضرب و دوضرب! میتونیم از توابع زیر استفاده کنیم :
setTapDetectionOnX – setTapDetectionOnY – setTapDetectionOnZ
 
ADXL345_ACTIVITY
بیت Activity یک میشه وقتی شتاب بزرگتر میشه از مقدار تعیین شده در ریجستر THRESH_ACT (به آدرس (0x24، که قابل رخ دادن و تنظیم کردن هستش در هر محوری با تنظیم ریجستر ACT_INACT_CTL (به آدرس (0x27
وقتی فعالیتی رخ بده در ADXL345 (با توجه به تنظیمات بالا) این بیت 1 میشه، و میزان حساسیت روکه در بالا به کمک ریجستر THRESH_ACT تنظیم میکردیم الان میتونیم  به کمک تابع setActivityThreshold این کار رو انجام بدیم و برای تعیین محورهای فعال(که کار ریجستر ACT_INACT_CTL بود) میتونیم از سه تابع زیر استفاده کنیم :
setActivityX –  setActivityZ   –  setActivityY
 
ADXL345_INACTIVITY
بیت Inactivity یک میشه وقتی شتاب کوچکتر باشه از مقدار تعیین شده در ریجستر THRESH_INACT (به آدرس (0x25 و در زمان تعیین شده به کمک ریجستر TIME_INACT (به آدرس (0x26 در تمام محورهای تعیین شده که این مورد تعیین میشه به وسیله ریجستر ACT_INACT_CTL  (به آدرس (0x27، حداکثر زمان برای TIME_INACT برابر 255 ثانیه هستش.
برای تعین حد آستانه(که کار ریجستر THRESH_INACT هستش) میتونیم از تابع setInactivityThreshold استفاده کنیم و برای تعیین فاصله  زمان اعلام هشدار (که کار ریجستر TIME_INACT هستش) میتونیم از تابع setTimeInactivity استفاده کنیم.
 
ADXL345_FREE_FALL
بیت FREE_FALL یک میشه وقتی شتاب کوچکتر بشه از مقدار تعیین شده در ریجستر THRESH_FF (به آدرس (0x28 در مدت زمانی که به وسیله ریجستر TIME_FF (به آدرس (0x29  قابل تنظیم هستش در تمام محورها.
وقفه FREE_FALL تفاوت داره با وقفه inactivity به شرح زیر :
all axes always participate and are logically AND’ed, the timer period is much smaller (1.28 sec maximum), and the mode of operation is always dc-coupled.
برای تنظیم حد آستانه در سقوط آزاد(که در بالا به کمک ریجستر THRESH_FF این کار رو انجام میدادم) میتونیم از تابع setFreeFallThreshold استفاده کنیم؛ و برای تعیین مدت زمان بین هر اعلام هشدار(که کار ریجستر FREE_FALL هستش) از تابع setFreeFallDuration استفاده میکنیم.
 
ADXL345_WATERMARK
بیت Watermark یک میشه وقتی تعداد نمونه برداری ها در FIFO برابر مقدار تعیین شده در ریجستر FIFO_CTL (به آدرس  (0x38 بشه، این بیت پاک میشه به صورت خودکار وقتی که FIFO خوانده میشه و
and the content returns to a value below the value stored in the samples bits
 
ADXL345_OVERRUNY
بیت overrun یک میشه وقتی دیتای جدیدی جایگزین دیتای خونده نشده ای میشه.
این عملیات جایگزینی دیجتای جدید با دیتای قدیمی بستگی به مد FIFO داره.
در مد bypass بیت overrun یک میشه وقتی دیتای جدیدی جایگزین دیتای خونده نشده ای میشه در ریجسترهای DATAX DATAY,  و  DATAZ(به آدرس 0x32 تا 0x37).
در تمام مدهای دیگر، بیت overrun وقتی 1 میشه که FIFO پرشده باشه.
بیت overrun به صورت خودکار پاک میشه وقتی محتوای FIFO خونده میشه.
 
 
 

هر دو تابع شتاب رو به ما میدن فقط فرقشون اینه که تابع اولی یه آرایه با حداقل اندازه 3 بهش میدید  و مقادیر شتاب x,y,z رو درون اون آرایه ذخیره میکنه، اما تابع دومی باید 3 تا متغییر int بهش بدی تا مقدار شتاب در هر محو رو درون اون متغییر مربوطه ذخیره کنه.
 

این تابع زاویه با هر کدوم از محورها رو به ما میده، یه آرایه از نوع double با حداقل 3 خونه باید به این تابع بدید تا زوایا رو تو آرایه ذخیره کنه.
در زیر فیلمی میبینید از تست این تابع، برا بحث ساخت نرم افزار تحت کامپیوترش به زودی توضیحات لازمه رو به مطلب پیوست میکنم.

به کمک تابع setInterruptLevelBit میشه تعیین کرد که تو وقفه ها سطح فعال وقفه 0 باشه یا 1(وقفه با 0 فعال بشه یا 1)
که اگه 0 به تابع بدید سطح high و اگه 1 بدید سطح low رو برا وقفه ها انتخاب کردید.
و به کمک تابع getInterruptLevelBit هم میشه سطح فعال ساز وقفه رو فهمید.
 

به کمک تابع setInterruptMapping میشه تعیین کرد که هر رخداد(8تا رخدادی که در بالا معرفی کردم) در کدوم یک از دو پایه وقفه موجود رخ بده، که برا تعیین پایه وقفه مد نظرتون باس از ثوابت زیر استفاده کنید که از اسمشون معلومه کدوم یک برا وقفه 1 و کدوم یک برا وقفه 2 هستش و یکی از این دو مورد رو باید به عنوان پارامتر دوم به تابع بدید.
ADXL345_INT1_PIN
ADXL345_INT2_PIN
و برا پارامتر اول هم یکی از اون 8 ثابتی که در بالا قرار دادم و توضیح دادم رو قرار بدید که در واقع با این کارتون میگید که این ثابت روی این پایه، وقفه هاش رخ بده.
 

به کمک تابع setInterrupt میتونم وقفه هر کدوم از 8ویژگی بالا رو فعال/غیرفعال کنیم، که باید نام ویژگی که به صورت ثاب تعریف شده و در بالا گزاشتم براتون(و این جمله رو صد بار تا حالا تکرار کردم^_^) باس به عنوان پارامتر اول به تابع بدید و در پارامتر دوم تابع تعیین میکنید که این ویژگی وقفش فعال باشه یا غیر فعال که اگه 0 بدید یعنی غیر فعال و اگه 1 بدید یعنی فعال.
به کمک تابع isInterruptEnabled هم یمتونیم بفهمیم وقفه فلان ویژگی(اون اون 8 تا ویژگی^_^) فعال هستش یا نه.
 
 

توابع مربوط به Tap(ضربه)

برای تعیین میزان حساسیت ضربه میتونید از تابع setTapThreshold استفاده کنید(که اگه عددی کوچیکی ورد کنید با کوچکترین ضربه ای وقفه مربوطه فعال میشه و اگه اعداد بزرگتری وارد کنید با ضربه های محکم فقط وقفه فعال میشه که برا رسیدن به مقدار شدت ضربه مد نظرتون باید این قدر تست کنید تا به مقدار مد نر برسید – مقدار بین 0 تا 255 هستش.) و برای تنظیم زمان این ضربه میتونید از تابع setTapDuration استفاده کنید(گه اینم مقدارش بین 0 تا 255 هستش.).
و برای خوندن مقدار TapThreshold میتونید از تابع getTapThreshold و برا خوندن مقدار TapDuration از تابع getTapDuration استفاده کنید.
اگه به تابع setTapDuration یا TapThreshold مقدار 0 بدید ویژگی TAP و DOUBLE_TAP غیر فعال میشه.
توجه : توابع بالا هم برای TAP و هم برا DOUBLE_TAP هستن.
 
این 3 جفت تابع برا این هستن که تشخیص تب در کدام محور ها صورت بگیره و در کدام محور ها صورت نگیره.
setTapDetectionOnX: فعال/غیر فعال کردن فهمیدن رخ دادن tap در محور x
isTapDetectionOnX : برا خوندن مقدار تابع setTapDetectionOnX به کار میره.
 
setTapDetectionOnY : فعال/غیر فعال کردن  اطلاع از رخ دادن tap در محور y
isTapDetectionOnY : خوندن مقدار تابع setTapDetectionOnY
 
setTapDetectionOnZ : : فعال/غیر فعال کردن  اطلاع از رخ دادن tap در محور z
isTapDetectionOnZ : خوندن مقدار تابع setTapDetectionOnZ
 
بعد از این که وقفه TAP رخ داد، برای این که بفهمیم TAP در کدام محور رخ داده، میتونیم از این 3 تابع استفاده کنیم، که اگه TAP در هر کدوم از محور های فوق رخ داده باشه تابع مربوطه مقدار 1 رو برمیگردونه و در غیر این صورت مقدار 0 رو بر میگردونه و در ضمن الزامی نیست که ضربه(TAP) حتما در 1 محور رخ بده، ممکنه در 2 و یا هر 3 محور رخ بده.
 

توابع مربوط به DoubleTap(دو ضربه)

 
 

توابع مربوط به Activity

این 3 تابع برا فعال/غیر فعال کردن ویژگی Activity در هر یک از 3 محور موجود کاربرد دارن، که اگه به هر کدوم از توابع 1 بدید این ویژگی در اون محور فعال میشه و اگه 0 بدید غیر فعال میشه، حالا Activity چیه؟ در بالا گفتم ولی بازم میگم، اگه شتاب از مقدار تعیین شده(توسط تابع setActivityThreshold) بیشتر بشه وقفه Activity رخ میده.
 
این 3تابع هم برا این هستن که بینم کدوم محورها برا بحث ویژگی Activity فعال هستن و کدوم یک غیر فعال، تو 3 تابع بالایی فعال/غیر فعال بودن هر محور رو تعیین میکردیم و تو این 3تابع بررسی میکنیم که کدوم محور فعال هستش و کدوم غیر فعال.
 
این تابع رو هم صحبتش رو در بالا کردم، ویژگی Activity در صورتی رخ میده که شتاب adxl345 از مقدار تعیین شده توسط تابع setActivityThreshold بیشتر بشه(لذا به کمک تابع setActivityThreshold مقدار آستانه شتاب یا همون Threshold رو تعیین میکنیم.)، به کمک تابع getActivityThreshold هم میتونید مقدار آستانه رو بخونید.
 
خب حالا فرض کنید وقفه Activity فعال شده، حالا میخوایم ببینیم که این Activity مربوط به کدوم محور بوده، برا این کار از 3 تابع بالا استفاده میکنیم، که اگه Activity در هر کدوم از محورها رخ داده باشه تابعش مقدار 1 رو برمیگردونه و در غیر این صورت مقدار 0 رو برمیگردونه.
 
 
 

توابع مربوط به Inactivity

توابع Inactivity همانند توابع Activity هستش لذا دیگه توضیح نمیدم(غیر از دو تابع آخر) و فقط بسنده میکنم به بیان! O_o یه سری نکات.
توجه 1 : تو توابع بالا اگه دقت کنید دیگه 3جفت تابع Source وجود نداره، در حالا که در ویژگی Activity ما سه تابع داشتیم که برا تعیین منبع وقفه بود، ولی تو ویژگی Inactivity دیگه از این 3جفت تابع خبری نیست، چرا؟ بله! چون تو ویژگی Activity وقفه مربوطه فعال میشد ولی ما نمیدونستیم که منبعش چی هستش >>> به همین خاطر از 3 تابع Source استفاده میکردیم تا منبع رو پیدا کنیم، اما تو بحث Inactivity، وقفش تنها زمانی فعال میشه که تمام محور هایی که Inactivity شون فعال شده(به کمک توابع setInactivity) باید در حالت بدون فعالیت باشن تا وقفه Inactivity رخ بده، لذا تو این حالت دیگه منبع معنی نداره، چون تمام محور ها باید بدون فعالیت باشن تا وقفه Inactivity رخ بده، لذا میشه گفت که تمام محور هایی که Inactivity شون رو فعال کردیم منبع ما حساب میشن……اووووووفففففف چقدر قضیه رو پیچوندم ^_^
توجه 2 : خب حالا وقتی وقفه Inactivity رخ میده که شتاب adxl345 از مقدار آستانه تعیین شده کمتر بشه، که این مقدار آستانه توسط تابع setInactivityThreshold تعیین میشه.
توجه 3 : خب حالا فک کنید ماژول زاویه سنج و شتاب سنج adxl345 رو تو مدارتون استفاده کردید ازش و این ماژول در حالت بدون فعالیت هستش و حالا هی زرت و زرت وقفه Inactivity فعال میشه، که میتونه کل مدار رو با مشکل رو به رو کنه، برا حل این مشکل که هی وقفه اش فعال نشه میتونیم از تابع setTimeInactivity استفاده کنیم(مقدار این تابع از 0 تا 255 باید باشه، که بر حسب ثانیه هستش، یعنی عدد 5 بهش بدید یعنی 5 ثانیه بهش دادید.) و مثلا بگیم که هر 5 ثانیه وقفه Inactivity رو فعال کن در حالت بدون فعالیت، تابع getTimeInactivity هم برا این هستش که ببینیم که توسط تابع setTimeInactivity چه زمانی رو تعیین کردیم!
 
 

توابع مربوط به FreeFal(سقوط آزاد)

 
setFreeFallThreshold : تعیین حد آستانه شتاب که اگه شتاب ماژول از این مقدار تعیین شده بزرگتر بشه وقفه سقوط آزاد فعال میشه(البته تو دیتاشیت گفته اگه شتاب ماژول از شتاب تعیین شده کمتر بشه!)
getFreeFallThreshold : خوندن مقدار شتاب تنظیم شده توسط تابع setFreeFallThreshold
setFreeFallDuration : اینم شبیه همون تابع setTimeInactivity هستش که یه زمانی تعیین میکنیم تا تو اون محدوده  وقفه رو فعال کنه و زرت وزرت وقفه رو فعال نکنه.
getFreeFallDuration : برا خوندن زمان تنظیم شده توسط تابع setFreeFallDuration
 

توابع دیگه

 

تابع setRangeSetting برای تعیین رنچ مقدار شتاب و زاویه هستش و تابع getRangeSetting  برا خوندن این محدوده مقدار هستش.تابع setRangeSetting برای تعیین رنچ مقدار شتاب و زاویه هستش و تابع getRangeSetting  برا خوندن این محدوده مقدار هستش.حالا این داستان رنج چیه دقیقا من خودم نفهمیدم، تو دیتاشیت هم چیز خاصی من در این باره ندیدم ولی در تستی که در عمل کردم مثل این که کاربردش اینه که مثلا اگه 16 بزاری اطلاعات(شتاب) مثلا بین -12 تا +12 تغییر میکنن ولی اگه عدد 2 به تابع بدی اطلاعات مثلا بین 250- تا 250+ تغییر میکنن.
 
 
 

شماتیک پروژه ماژول ADXL345 با آردوینو

ماژول ADXL345 به صورت مجزا تو بازار هستش که عکسش رو در زیر میبینید :
پروژه و آموزش ماژول زاویه سنج adxl345 با arduino
و ماژول هایی هم هستن تو بازار که سنسورهایی رو در خودشون جای دادن، چندین سنسور در یک ماژول، یه یه چیز جمع و جور هستش، برای مثال در زیر عکسی از gy801 میبینید که اگه اشتبان نکنم زاویه سنج داره، فشار سنج داره، قطب نما داره که همه اینا تو یه ماژول به صورت جمع جور قرار داده شده، من خودم هم به صورت تکیش رو دارم و هم به صورت زیر، راه اندازی هر دو هم مثل هم هستش، gnd و vcc ماژول رو وصل میکنید و پایه های sda و scl رو هم همینطور، حالا تو ماژول های مختلف ممکنه جای این پایه ها با هم فرق داشته باشه که زیاد چیز مهمی نیست چیزی که مهمه اینه که هر ماژولی که سنسور زاویه سنج توش باشه حداقل این 4 تا پایه رو باس داشته باشه وگرنه اون سنسور، سنسور زاویه سنج نیست( به اسم سنسور زاویه سنج یه چیز دیگه بهتون  انداختن laugh )
سنسور زاویه سنج
شماتیک پروژه به صورت زیر هستش.
پروژه آردوینو
 
 
پروژه 1 زاویه سنج با آردوینو
این پروژه مربوطه به بحث tap هستش بدون استفاده از وقفه

 
پروژه 2 زاویه سنج با آردوینو
اینم همون پروژه بالا هستش ولی با استفاده از وقفه – البته یه مشکلاتی داره که خودتون یکم ور برید متوجه میشید.

 
پروژه 3 زاویه سنج با آردوینو
تو این پروژه زاویه ماژول در هر 3 محور رو اندازه نمایش میدیم تو پنجره سریال.

 
خب فک کنم همین 3 تا پروژه کافی باشه diablo، فیلم پروژه رو هم نمیتونم قرار بدم چون موبایل ندارم، یه پروژه هم با نمایشگر T6963C و این سنسور هم احتمالا قرار میدم تو سایت
 

 
توجه : اون نرم افزار تحت ویندوز هم بمونه برا بعد – فعلا وقت کار کردن روی opengl رو ندارم.
هزینه این مطلب : لعنت فرستادن بر کسایی که چیزی بلدن ولی به اشتراک نمیزارن تو نت.
فعلا یا علی.

گروه پرسش و پاسخ الکترونیکی در سروش
مهدی دمیرچیلو گوگل میفرماید : إِنَّ اللّه مَعَ الساچِرین ( خداوند با سرچ کنندگان است )
ارسال دیدگاه
46

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید ( طبیعتا لینک کدتون رو باید برای من بفرستید! ) : debian

4) پسورد فایل های سایت : www.dmf313.ir

  1. Avatar

    مهمان

    سجاد

    سلام.من میخوام با استفاده از دستگاه پیرانومتر تشعشع خورشید بوسیله اردینو به صورت ولتاژ دریافت کنم چطوری میتونم این کارو انجام بدم؟

    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام – اطلاعاتی در این زمینه ندارم ولی خب باید دید انواع تشعشع که از خورشید صادر میشه چیا هستش و این که سنسور برا هر یک از تشعشع ها پیدا کنی ( یا یه سنسور برا همشون ) بعد ببینی پروتکولش چیه و بری دیتاشیتش رو بخونی و یه کتابخونه بنوسی و مدار مورد نیازشو که خب معمولا خود دیتاشیت مداراتی رو پیشنهاد میده طراحی کنی.

      یا این که از دستگاه های آماده پیرانومتر استفاده کنی که باید ببینی قابلیت ارتباط دارند که مثلا دیتاشون رو در خروجی ارائه بدن.

  2. Avatar

    مهمان

    REZA

    سلام بنده این مدار رو بستم و جواب هم گرفتم ولی زاویه هایی که نشون میده نوسان داره به طور دائم برای پروژه ای که من دارم روش کار میکنم باید اعداد ثابت باشه ایا راهی هست که جلویه این نوسانات رو بگیریم

  3. Avatar

    مهمان

    فاطمه

    ببخشین با این شتاب سنج میشه جابه جایی رو هم اندازه بگیریم؟ اگه میشه لطفا برنامه شو بذارین اگه هم نمیشه ماژولی هست که جابه جایی رو اندازه بگیره؟

  4. Avatar

    مهمان

    علی

    سلام
    خواهشا خواهشا آموزش ماژول HMC5883L با کامپایلر کئویژن در سایت بگذارید
    کارم گیر
    لطفا بزارید

  5. Avatar

    مهمان

    حسین ایرانپور

    سلام ممنون از آموزش مفیدتون . بی زحمت اگه آموزش استفاده از توابع Inactivity رو با یک پروژه که وقتی شتاب از آستانه کمتر شه یک led رو روشن کنه قرار بدید . با تشکر

  6. Avatar

    مهمان

    علی

    با سلام -من پروژه را کپی کردم با همین کتابخانه ولی موقع کامپایل ارور میده .متن ارور
    No Matching Function For Call To ADXL345
    ممنون میشم راهنمایی نمایید
    آیا احتمال داره کتابخانه کلا تغییر کرده باشه

  7. Avatar

    مهمان

    علیرضا

    سلام
    کتاب خونه ماژول adxl345 در پروتعوس رو میتونین برام بفرستین

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      پروتئوس نداره کتابخونه این قطعه رو

  8. Avatar

    مهمان

    mohammad

    باسلام
    مهندس میشه این پروژه رو باAVRانجام بدین.
    من میخوام یه پروژه انجام بدم که وقتی سنسور ضربه رو تشخیص داد،یکی از پایه های میکرو یک بشه.باسپاس

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

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

  9. Avatar

    مهمان

    سهراب

    بله،اد کردم

  10. Avatar

    مهمان

    سهراب

    با سلام -من پروژه را کپی کردم با همین کتابختنه تو سایت ولی موقع کامپایل ارور میده .متن ارور
    no matching function for call to ADXL345
    ممنون میشم راهنمایی نمایید

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام-کتابخونه رو اد کردی؟

      • Avatar

        مهمان

        سهراب

        بله،تو لیست کتابخونه ها هم هست

  11. Avatar

    مهمان

    علیرضا

    سلام
    بازم مزاحم همیشگی give_rose
    اگه بخوام از دو تا سنسور اطلاعات بخونم چیکار کنم ؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام – خو ببین با چه پروتکولی این سنسور راه اندازی شده – بعد برو نحوه شبکه کردن اون پروتکولو یاد بگیر ( نحوه اتصال چند قطعه به پروتکول فوق ) – مثلا i2c و spi مطالباش تو نت هستش

  12. Avatar

    مهمان

    علیرضا

    اقا سلام مجدد …..خط سوم اررور میده همش

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام-کتابخونه رو اضافه کردی به پروژه؟

      • Avatar

        مهمان

        علیرضا

        آقای نمیدونی چقد دعات کردم این چند وقته heart heart heart

  13. Avatar

    مهمان

    مبینا

    سلام اقای مهندس
    من این برنامه رو تویه نرم افزار عینا کپی کردم ولی ارور داد.نمیدونم مشکلش چیه؟
    و وقتی برد اردوینو رو به لب تاب وصل میکنم پورت شو نمیخونه.یعنی اصلا گزینه پورت تویه نرم افزار اردوینو فعال نیست!!
    اصلا نمیدونم چیکار کنم. ممنون میشم کمکم کنید
    متشکرم

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      آردوینو رو یه چند باری قطع و صل کن ببین شناخته میشه یا نه – اگه نشد که یعنی برد مشکل پیدا کرده یا بردت از مدل ch340 هستش و مشکل درایور داری!
      متن خطا چیه؟ خود پروژه رو از ته مطلب دانلود کن و همونو تست کن – کتابخونه هاشو هم اضافه کن ( البته اگه داره )

  14. Avatar

    مهمان

    Hadis

    سلام آقای مهندس
    ممنون از مطالب بسیارمفیدتون
    میشه لطف کنید درباره ی راه اندازی ماژول CMPS11 یه راهنمایی به بنده بکنید؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      ماژولش رو ندارم حقیقتا – و باید برام یکی بخری و با تجه به قیمت این سنسور که بعید میدونم این کارو بکنی laugh

      • Avatar

        مهمان

        Hadis

        برای پروژه ام باید بخرم و کار کنم آقای مهندس

        • مهدی دمرچیلو

          نویسنده این مطلب

          مهدی دمرچیلو

          میدونم برای خودتون باید بخرید – منظورم این بود که با توجه به قیمتش بعید میدونم یه مدل از این سنسور برای من بخرید – منظورم این بود laugh

  15. Avatar

    مهمان

    محمد

    با سلام و خسته نباشید
    من درستش کردم ولی نمی دونم چرا z رو همیشه یک عدد ثابت نشون میده؟
    اگه ممکنه راهنمایی کنید

  16. Avatar

    مهمان

    محمد

    سلام خسته نباشید
    شاید اینجا جاش نباشد
    ولی میخواستم بدونم به پایهAREFمیشه ولتاژ بیشتر از پنج ولت داد
    میخوام ولتاژ 11ولت اندازه بگیرم و به درصد تبدیلش کنم
    چجوری ولتاژ خونده شده توسط مبدل انالوگ به دیجیتال به درصد تبدیل کنم بازه عدیدم بین دو ولت تا یازده ولته
    خیلی ممنون

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      تا جاییی که من میدونم “نه”

      • Avatar

        مهمان

        محمد

        چی کنم استاد با چه تابعی به درصد تبدیل کنم

  17. Avatar

    مهمان

    کشاورزی

    سلام خسته نباشید
    لطفا ماژول mma7455 رو هم بررسی کنید ماژول خوب و پر کاربرد و مجهزیه.

  18. Avatar

    مهمان

    محمد

    سلام میخواستم بدنم تو قسمت شبیه سازی پروتئوس چطور من برنامه نوشته اردوینو روتو اردوینو
    اپلود کنم واجراش کنم تازه کار هستم مطالب سایت هم بسیار مفیدهستش

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      مطلب جلسه 1 آردوینو رو بخون
      اول کتابخونه آردوینو در پروتئوس رو دانلود میکنی و بعد به پروتئوس اضافه میکنی و بعد میری تو آردوینو تنظیمات رو تغییر میدی تا فایل hEX بهت بده و بعد آدرس اون فایل هگز رو تو پروتئوس وارد میکنی.

  19. Avatar

    مهمان

    Rahman

    خوب بود به وبسایت ما هم سر بزنید
    http://electrical-engineering.ir/

  20. Avatar

    مهمان

    biner

    ممنون از مطالب خوبی که میتونید براش هزینه دریافت کنید ولی جوانمردانه این کار را نمی کنید

  21. Avatar

    مهمان

    ارمان

    لطفا کمک کن
    چجوری میشه z قطب نما را خنثی کرد؟تا وقتی برد صافه زاویه درسته اما وقتی برد کج میشه وzمقدار میگیره زاویه بهم میریزه.
    مدلhmc5883

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      خب باید به کتابخونه ای که ازش استفاده میکنید مراجعه کنید و ببینید تابعی برای این امر داره یا نه و اگه پیدا نکردید به دیتاشیت اون سنسور برید و ببینید همچین امکانی رو اصلا داره یا نه

  22. Avatar

    مهمان

    masoud

    سلام بازم مثل همیشه کامل و مفید واقعا خدا خیرتون بده
    فقط اون فایلای پیوست رو بی زحمت کی میزارین؟
    یه چیزم دیگه هم این که اگه بخوایم توی سایتتون فعالیت کنیم و پست بزاریم آیا امکانش هست؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      اگه زنده بودیم فردا
      ایمیل – نام کاربری – پسورد – اسم فامیل! رو برام میل کن تا اکناتت رو بسازم.

  23. Avatar

    مهمان

    دانه داران

    با عرض سلام
    خسته نباشید…
    من دنبال یه ایده واسه پروژه ی پایانی کارشناسی می گردم…می تونید کمکم کنید…؟
    (مهندسی سخت افزار کامپیوتر می خونم…)
    مطالبتون مثل همیشه عالین…فقط خیلی باید فسفر بسوزونم تا منظورتون بیاد دستم…
    خدا قوت

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      در چه زمینه ای؟ در چه سطحی؟ دانش خودت چقدره؟ چقدر وقت داری؟

      • Avatar

        مهمان

        دانه داران

        فرصت دارم…تا مرداد سال آینده…
        من فقط با AVR آشنایی دارم! اما میخام پروژه رو با ARM انجام بدم…البته اگه بشه…میخام یه چیز اجرایی باشه…یه چیزی بسازم…میخام پیشنهاد بدید تا تابستون برم دنبالش و حسابی چیز یاد بگیرم…میخام یه جهت فکری بهم بدید.لطفا

        • مهدی دمرچیلو

          نویسنده این مطلب

          مهدی دمرچیلو

          خب میخوای پروژه معرفی کنم یا میکرو/؟

          • Avatar

            مهمان

            دانه داران

            لطفا پروژه…

          • مهدی دمرچیلو

            نویسنده این مطلب

            مهدی دمرچیلو

            سلام – الان شروع میکنم به تکمیل مطلب.

          • Avatar

            مهمان

            masoud

            اون نرم‌افزار 3بعدیه هم میزاشتین دیگه عالی می شد