بدون شک با ژیروسکوپ آشنایی دارید !! همان وسیلهی داخل تلفن همراهتنان که میتوانید جهت گوشی خود را تشخیص دهید.ولی این تنها کار یک ژیروسکوپ نمیباشد. به وسیلهی adxl 345 علاوه بر تشخیص شتاب استاتیک و شتاب داینامیک ، میتوانید تک ضربه ، دو ضربه و همچنین سقوط آزاد را تشخیص دهید.در ادامه این پست با مرجع تخصصی آردوینو ، دیجی اسپارک همراه باشید.
adxl345 یک ماژول ژیروسکوپ سه محوره با دقت اندازهگیری ۱۰ الی ۱۳ بیت (قابل تنظیم توسط کاربر) میباشد.امروز قصد ندارم راجب این مسائل خسته کننده صحبت کنم و میخواهم بی درنگ به سراغ ویژگیهای خاص این ماژول adxl345 یعنی تشخیص تک ضربه ، دوضربه و همچنین قابلیت تشخیص فعالیت و عدم فعالیت این مازول بروم.
یکی از ویژگیهای منحصر به فرد این ماژول ،۲ پین وقفهای است(INT1 و INT2) که با تنظیم کردن آنها میتوان هنگام یک رخداد در ماژول ، آن دو پین را به وضعیت HIGH در آورد. شما میتوانید این دو پین وقفه را به پینهای وقفهی آردوینو متصل کنید و هنگامی یک رویداد خاص در ماژول adxl رخ داد ،برنامهی آردوینو متوقف شود و به سرعت آن رویداد را بررسی کند.
سخت افزار مورد نیاز
آردوینو Uno
ماژول شتاب سنج سه محوره adxl345
اتصالات
ماژول adxl345 برای ارتباط با آردینو از دو پروتکل spi و i2c پشتیبانی میکند ولی ما قصد داریمم در این آموزش از پروتکل i2c استفاده کنیم.پس فقط کافیست دو پین SDA و SCL را به آردوینو خود متصل کنیم. همچنین برای اینکه به ماژول را متوجه کنیم که میخواهیم از پروتکل I2C استفاده کنیم ، باید پین CS ماژول را به ۳٫۳ ولت آردوینو متصل کنیم.
برنامه نویسی
ابتدا کتابخانه ماژول ژیروسکوپ سه محوره 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, 1); 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 } }
سلام ممنون از آموزش خوبتون من این دستورات رو اجرا کردم عالی بود ، سوالی برام پیش اومد آیا میشه آستانه تشخیص ضربه رو دلخواه تنظیم کرد ؟؟؟ مثلا جوری که وقتی یک نیروی ۱۵کیلوگرمی بهش اصابت میکنه
سلام و تشکر ازشما
برای این منظور موارد به صورت عملی تست نشده است. ولی میبایست خروجی ولتاژ برحسب بیت را دقیقا بررسی و تنظیم کنید.