تعریف شتاب سنج
شتاب سنج دستگاهی است که مقدار شتاب صحیح (Proper Acceleration) را اندازه گیری می کند. شتاب صحیح شتاب نسبت به جسم در حال سقوط آزاد است.
شتاب سنج دارای مدلهای یک محوری و چند محوری است که می توانند اندازه و جهت شتاب را به عنوان یک کمیت برداری اندازه گیری کنند؛ می توان از حسگرهای شتاب سنج برای تعیین موقعیت و آشکار سازی لرزش و ضربه استفاده کرد. شتاب سنجهای ریزماشین کاری شده با روند رو به افزایشی در لوازم الکترونیکی قابل حمل و کنترلرهای بازیهای کامپیوتری برای تعیین موقعیت و به عنوان ورودی بازیهای کامپیوتری به کار می روند.
کاربرد شتاب سنج
شتاب سنجها برای مانیتور کردن سلامت دستگاههای چرخشی مانند پمپ ها، پنکه ها، غلتک ها، کمپرسورها و برجهای خنک کننده می توان استفاده کرد. اثبات شده است که برنامههای مانیتور لرزش هزینهها را کاهش می دهند، زمان از کارافتادگی دستگاهها را کاهش می دهد و ایمنی کارخانه را افزایش می دهد. این امر به وسیله تشخیص موقعیت هایی مانند غیر هم محوری شافتها (محورها)، عدم تعادل موتورها و خرابی چرخ دنده ها یا خطا در نیرو که منجر به تعمیرات پرهزینه می شود، صورت می گیرد. اطلاعات لرزشی شتاب سنجها به کاربر اجازه مانیتور کردن ماشینها و پیدا کردن این خطاها را پیش از اینکه دستگاه چرخنده از کار بیفتد می دهد برنامههای مانیتور کردن لرزش در صنعت هایی مانند تولید خودرو، استفادههای ابزار کار، تولیدات دارویی، تولید انرژی و نیروگاه ها، خمیر کاغذ و کاغذ، تولید آشامیدنی و غذا، آب و فاضلاب و پتروشیمی و تولید فولاد به کار می روند.
معرفی ماژول شتاب سنج ADXL335
یک سنسور شتاب سنج ۳ محور کوچک، با توان مصرفی پایین و دارای خروجی ولتاژ با حالت دهی سیگنال است. این سنسور میتواند شتابهای استاتیک گرانش مانند کاربردهای زاویه سنجی را اندازه گیری کند. همچنین شتابهای دینامیک مانند شتابهای حرکتی، شوکهای مکانیکی و لرزش در این سنسور قابل اندازه گیری است. کاربر با استفاده از خازنهای CX، CY و CZ میتواند پهنای باند شتاب سنج را متناسب با نیاز در هر سه محور تنظیم نماید. پایه های XOUT، YOUT و ZOUT خروجیهای ولتاژ برای سه محور x و y و z هستند.
مشخصات ماژول شتاب سنج ADXL335 :
- خروجی آنالوگ
- اندازه گیری در بازه +-۳٫۶g
- ولتاژ تغذیه ۱٫۸ ولت تا ۳٫۶ ولت
- تولید شده در قالب LFCSP-LQ
- حساسیت ۳۰۰ میلی ولت به ازای هر g
- کاملا حفاظت شده در مقابل حرارت و رطوبت
- پهنای باند ۰٫۵ هرتز تا ۵۵۰ هرتز برای محور z
- پهنای باند ۰٫۵ هرتز تا ۱۶۰۰ هرتز برای محورهای x و y
- شتاب سنج سه محور با سه خروجی مجزا برای سه محور x و y و z
نمودار داخلی از نحوه کار IC
در این پست این ماژول را به سه صورت با AVR و ARDUINO و Raspberry PI راه اندازی میکنیم
1- راه اندازی با AVR
ابتدا اتصالات و مدار پروژه را ببینیم :
کد های کدویژن پروژه
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include <mega16.h> #include <delay.h> #include <stdlib.h> #asm .equ __lcd_port=0x1B ;PORTA #endasm #include <lcd.h> #asm .equ __i2c_port=0x18 ;PORTB .equ __sda_bit=1 .equ __scl_bit=0 #endasm #include <i2c.h> #define EEPROM_BUS_ADDRESS_W 160 #define EEPROM_BUS_ADDRESS_R 161 #include "ADXL345.h" void main(void) { char str[10]; lcd_init(16); lcd_gotoxy(0,0);lcd_putsf(" DMF313.ir");delay_ms(2000);lcd_clear(); ftoa(GetDeviceID(),0,str);lcd_puts(str);delay_ms(2000);lcd_clear(); ADXL345_Init(); while(1) { Get_Accel_Angles(); delay_ms(200);lcd_clear(); ftoa(Accel_XAngle,0,str);lcd_gotoxy(0,0);lcd_puts("X=");lcd_puts(str); ftoa(Accel_YAngle,0,str);lcd_gotoxy(8,0);lcd_puts("Y=");lcd_puts(str); ftoa(Accel_ZAngle,0,str);lcd_gotoxy(0,1);lcd_puts("Z=");lcd_puts(str); } } |
توضیح کد های پروژه :
برای نوشتن برنامه نیاز به کتابخانه این ماژول در کدویژن دارید که در انتهای پست قرار داده شده است
1 |
ADXL345_Init(); |
کد بالا ، ماژول رو فعال و آماده کار میکنه….
1 |
GetDeviceID() |
کد بالا آی دی ماژول رو دریافت میکنه (که هر ماژول آی دی مختص به خودش رو داره)>>>اگه این کد به درستی عمل کنه یعنی ماژول سالم هستش.
1 2 3 |
Accel_XAngle Accel_YAngle Accel_ZAngle |

برنامه ی لازم برای راه اندازی ماژول شتاب سنج ADXL335
با توجه به مشخصات ماژول که در بالا ارئه شد خروجی این ماژول به صورت ولتاژ هست یعنی ما نیاز داریم ولتاژ سه پایه ی X , Y و Z رو برای فهمیدن تغییرات اندازه بگیریم. این کار به وسیله ی ADC میکروکنترلر انجام می شود. در ادامه ما نیاز داریم تا اعداد اندازه گیری شده را در جایی نمایش دهیم من از ارتباط سریال برای این موضوع استفاده کردم تا اعداد نمایش داده شده در مانیتور PC به نمایش در بیاد (به خاطر شلوغ نشدن مدار از ارتابط سریال به جای lcd کاراکتری استفاده کردم) برای نمایش اعداد اندازه گیری شده در کامپیوتر از قسمت ترمینال سریال نرم افزار آردوینو استفاده کردم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include <mega32a.h> #include <delay.h> #include <stdio.h> #define ADC_VREF_TYPE 0x40 unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); delay_us(10); ADCSRA|=0x40; while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } int x,y,z; void main(void) { // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x18; UCSRC=0x06; UBRRH=0x00; UBRRL=0x47; // ADC initialization // ADC Clock frequency: 86.400 kHz // ADC Voltage Reference: AVCC pin ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x87; while (1) { x=read_adc(0); y=read_adc(1); z=read_adc(2); printf("x=%d y=%d z=%d \n",x,y,z); delay_ms(333); } } |
- در سطر 7 تابع read_adc مقدار تبدیل شده ولتاژ رو به ما برمیگردونه
- در سطر 17 متغییر های X , Y , Z برای ذخیره شدن مقادیر اندازه گیری شده توسط ADC استفاده میشه
- در سطر 41 تا43 ولتاژ پایه های 0 و 1 و 2 پورت A اندازه گیری میشه و در متغییر های مربوطه قرار داده میشه
- در سطر44 مقادیر اندازه گیری شده توط دستور printf به صورت سریال به PC فرستاده میشه

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include <Wire.h> #include <ADXL345.h> ADXL345 ADXL; void setup(){ Serial.begin(9600); ADXL.powerOn(); ////////////////////////////////////////////////////////////////////Tap // فعال/غیر فعال کردن ضربه در سه محور موجود - 1=فعال - 0=غیر فعال ADXL.setTapDetectionOnX(1); ADXL.setTapDetectionOnY(1); ADXL.setTapDetectionOnZ(1); // تعیین حد آستانه و زمان ضربه ADXL.setTapThreshold(240); //62.5mg per increment ADXL.setTapDuration(15); //625μs per increment ////////////////////////////////////////////////////////////////////Tap // وقفه هر ویژگی ماژول در کدام پایه وقفه رخ بده 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 ); // وفعال/غیر فعال کردن وقفه ی هر ویژگی - 0=غیر فعال - 1=فعال 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(){ if(ADXL.getInterruptSource(ADXL345_SINGLE_TAP)) { // SINGLE TAP Serial.print("SINGLE TAP"); if( ADXL.isTapSourceOnX() ) Serial.print("-X"); if( ADXL.isTapSourceOnY() ) Serial.print("-Y"); if( ADXL.isTapSourceOnZ() ) Serial.print("-Z"); Serial.println(); } } |
نمایش زوایای ماژول در پنجره سریال
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include<ADXL345.h> #include<Wire.h> ADXL345 ADXL; int x, y, z; //int RAxyz[3]; void setup() { Serial.begin(9600); ADXL.powerOn(); int OffsetX, OffsetY, OffsetZ; ADXL.setAxisOffset(0, 0, 0); ADXL.getAxisOffset(&OffsetX, &OffsetY, &OffsetZ); } void loop() { ADXL.readAccel(&x, &y, &z); //ADXL.readAccel(RAxyz); // RAxyzz = &RAxyz[0] Serial.print("x = "); Serial.print(x); Serial.print("\ty = "); Serial.print(y); Serial.print("\tz = "); Serial.println(z); } |
نحوه اتصال به رزبری پای
ADXL345 Module Raspberry Pi
GND ————————– GND
۳٫۳V ————————– 3.3V
SCL0 ————————— SCL
SDA0 ————————– SDA
CS —————————- 3.3V
SDO ————————– GND
برنامه C راه اندازی ماژول شتاب سنج ADXL345 با رزبری پای
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
#include <wiringPiI2C.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #define DevAddr 0x53 //device address struct acc_dat{ int x; int y; int z; }; void adxl345_init(int fd) { wiringPiI2CWriteReg8(fd, 0x31, 0x0b); wiringPiI2CWriteReg8(fd, 0x2d, 0x08); // wiringPiI2CWriteReg8(fd, 0x2e, 0x00); wiringPiI2CWriteReg8(fd, 0x1e, 0x00); wiringPiI2CWriteReg8(fd, 0x1f, 0x00); wiringPiI2CWriteReg8(fd, 0x20, 0x00); wiringPiI2CWriteReg8(fd, 0x21, 0x00); wiringPiI2CWriteReg8(fd, 0x22, 0x00); wiringPiI2CWriteReg8(fd, 0x23, 0x00); wiringPiI2CWriteReg8(fd, 0x24, 0x01); wiringPiI2CWriteReg8(fd, 0x25, 0x0f); wiringPiI2CWriteReg8(fd, 0x26, 0x2b); wiringPiI2CWriteReg8(fd, 0x27, 0x00); wiringPiI2CWriteReg8(fd, 0x28, 0x09); wiringPiI2CWriteReg8(fd, 0x29, 0xff); wiringPiI2CWriteReg8(fd, 0x2a, 0x80); wiringPiI2CWriteReg8(fd, 0x2c, 0x0a); wiringPiI2CWriteReg8(fd, 0x2f, 0x00); wiringPiI2CWriteReg8(fd, 0x38, 0x9f); } struct acc_dat adxl345_read_xyz(int fd) { char x0, y0, z0, x1, y1, z1; struct acc_dat acc_xyz; x0 = 0xff - wiringPiI2CReadReg8(fd, 0x32); x1 = 0xff - wiringPiI2CReadReg8(fd, 0x33); y0 = 0xff - wiringPiI2CReadReg8(fd, 0x34); y1 = 0xff - wiringPiI2CReadReg8(fd, 0x35); z0 = 0xff - wiringPiI2CReadReg8(fd, 0x36); z1 = 0xff - wiringPiI2CReadReg8(fd, 0x37); acc_xyz.x = (int)(x1 << 8) + (int)x0; acc_xyz.y = (int)(y1 << 8) + (int)y0; acc_xyz.z = (int)(z1 << 8) + (int)z0; return acc_xyz; } int main(void) { int fd; struct acc_dat acc_xyz; fd = wiringPiI2CSetup(DevAddr); if(-1 == fd){ perror("I2C device setup error"); } adxl345_init(fd); while(1){ acc_xyz = adxl345_read_xyz(fd); printf("x: %05d y: %05d z: %05d\n", acc_xyz.x, acc_xyz.y, acc_xyz.z); delay(1000); } return 0; } |
اجرای برنامه C
برنامه را در فایلی با نام adxl345.c ذخیره کنید به محل ذخیره شدن فایل بروید و دستور زیر را برای کامپایل شدن اجرا کنید.
1 |
gcc adxl345.c -o adxl345 -lwiringPi |
برای اجرای برنامه دستور زیر را وارد کنید.
1 |
sudo ./adxl345 |
برنامه پایتون راه اندازی ماژول شتاب سنج ADXL345 با رزبری پای
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
#!/usr/bin/env python # Python library for ADXL345 accelerometer. # Copyright 2013 Adafruit Industries # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. from Adafruit_I2C import Adafruit_I2C class Adafruit_ADXL345(Adafruit_I2C): # Minimal constants carried over from Arduino library ADXL345_ADDRESS = 0x53 ADXL345_REG_DEVID = 0x00 # Device ID ADXL345_REG_DATAX0 = 0x32 # X-axis data 0 (6 bytes for X/Y/Z) ADXL345_REG_POWER_CTL = 0x2D # Power-saving features control ADXL345_DATARATE_0_10_HZ = 0x00 ADXL345_DATARATE_0_20_HZ = 0x01 ADXL345_DATARATE_0_39_HZ = 0x02 ADXL345_DATARATE_0_78_HZ = 0x03 ADXL345_DATARATE_1_56_HZ = 0x04 ADXL345_DATARATE_3_13_HZ = 0x05 ADXL345_DATARATE_6_25HZ = 0x06 ADXL345_DATARATE_12_5_HZ = 0x07 ADXL345_DATARATE_25_HZ = 0x08 ADXL345_DATARATE_50_HZ = 0x09 ADXL345_DATARATE_100_HZ = 0x0A # (default) ADXL345_DATARATE_200_HZ = 0x0B ADXL345_DATARATE_400_HZ = 0x0C ADXL345_DATARATE_800_HZ = 0x0D ADXL345_DATARATE_1600_HZ = 0x0E ADXL345_DATARATE_3200_HZ = 0x0F ADXL345_RANGE_2_G = 0x00 # +/- 2g (default) ADXL345_RANGE_4_G = 0x01 # +/- 4g ADXL345_RANGE_8_G = 0x02 # +/- 8g ADXL345_RANGE_16_G = 0x03 # +/- 16g def __init__(self, busnum=-1, debug=False): self.accel = Adafruit_I2C(self.ADXL345_ADDRESS, busnum, debug) if self.accel.readU8(self.ADXL345_REG_DEVID) == 0xE5: # Enable the accelerometer self.accel.write8(self.ADXL345_REG_POWER_CTL, 0x08) def setRange(self, range): # Read the data format register to preserve bits. Update the data # rate, make sure that the FULL-RES bit is enabled for range scaling format = ((self.accel.readU8(self.ADXL345_REG_DATA_FORMAT) & ~0x0F) | range | 0x08) # Write the register back to the IC seld.accel.write8(self.ADXL345_REG_DATA_FORMAT, format) def getRange(self): return self.accel.readU8(self.ADXL345_REG_DATA_FORMAT) & 0x03 def setDataRate(self, dataRate): # Note: The LOW_POWER bits are currently ignored, # we always keep the device in 'normal' mode self.accel.write8(self.ADXL345_REG_BW_RATE, dataRate & 0x0F) def getDataRate(self): return self.accel.readU8(self.ADXL345_REG_BW_RATE) & 0x0F # Read the accelerometer def read(self): raw = self.accel.readList(self.ADXL345_REG_DATAX0, 6) res = [] for i in range(0, 6, 2): g = raw[i] | (raw[i+1] << 8) if g > 32767: g -= 65536 res.append(g) return res # Simple example prints accelerometer data once per second: if __name__ == '__main__': from time import sleep accel = Adafruit_ADXL345() print '[Accelerometer X, Y, Z]' while True: print accel.read() sleep(1) # Output is fun to watch if this is commented out |
اجرای برنامه پایتون
برای اجرای پایتون کافی است برنامه را در فایلی به نام Adafruit_ADXL345.py ذخیره کنید برای اجرا به محل ذخیره سازی فایل بروید و دستور زیر را اجرا کنید.
1 |
sudo python Adafruit_ADXL345.py |
در زیر میتوانید فایل های مورد نیاز را دانلود کنید :
دانلود برنامه و فایل های مورد نیاز راه اندازی با ای وی آر : ADXL345-avr
دانلود کتابخانه این ماژول برای آردوینو : Adxl345
دانلود دیتا شیت این ماژول : ADXL345 datasheet
دانلود فایل توضیحات کامل نحوه کار این ماژول و توابع کتابخانه آردوینو آن : شتاب سنج ADXL345