این ماژول ارزان قیمت مجهز به یک سنسور ژیروسکوپ 13 بیتی بوده و با کمک آن می توانید شتاب حرکت رباط خود را محاسبه کنید.
از مزایای این ماژول قابلیت اتصال با رابط I2C و SPI می باشد که منجر به صرفه جویی در مصرف پینهای میکرو کنترولر می شود.
ولتاژ کاری آن بین 3 تا 5 ولت است که با هر میکرو کنترولری سازگار می باشد.
از تراشه این ماژول در موبایلها و فلایت کنترولرها و بسیاری از ماشینهای پروازی استفاده شده است.
این ماژول مجهز به دو اینتراپت و برنامه های تشخیص فعالیت و ضربه و سقوط آزاد و محدودیت شتاب می باشد.
این سنسور شتاب از سه محور اصلی پشتیبانی می کند.
ماژول دارای 8 پین مفید و کاربردی به شرح زیر می باشد.
پین GND به زمین و منفیی تغذیه متصل می شود
پین VCC به مثبت تغذیه وصل می شود
پین CS و SDO مربوط به خروجی سریال می باشند.
پین INT1 و INT2 اینتراپتهای خروجی هستند. این ماژول دارای برنامه های تشخیص وضعیت حرکتی می باشد که اطلاعات آنها از طریق اینتراپت ها ارسال می شوند.
پین SDA و SCL مربوط به خروجی I2C می باشد.
برنامه های تشخیص وضعیت شامل موارد زیر می باشند.
برنامه تشخیص تک ضربه
برنامه تشخیص دو ضربه
برنامه تشخیص حالت سکون
برنامه تشخیص حالت حرکت
برنامه تشخیص حالت سقوط آزاد
برنامه تشخیص شتاب بیش از حد تعریف شده برای ماژول در هر یک از سه محور. این مقدار شتاب را می توانید از دخل برنامه مشخص کنید
همچنین می توانید مشخص کنید که هر یک از این برنامه ها به کدام اینتراپت ارسال شود
این تراشه دارای یک برنامه هوشمند مصرف انرژی نیز می باشد که در هنگام بی حرکت شدن ماژول به حالت کم مصرف می رود و با تشخیص فعالیت دوباره فعال می شود.
در این مثال با کمک کتابخانه Wire به ماژول متصل می شویم و اطلاعات شتاب را از ماژول استخراج می کنیم و بعد از تبدیل آنها به اعداد معنی دار آنها را روی پنجره سریال نمایش می دهیم.
خط اول #include
سپس برای راحتی کار آدرسهای ذخیره سازی اطلاعات شتاب در حافظه ماژول را مشخص می کنیم
کد Wire.begin در setup الزامیست
کد Wire.beginTransmission(ADXAddress) برای اتصال به ماژئل با آدرس ADXAddress که آدرس ماژول می باشد
در سه خط زیر ماژول را در حالت روشن قرار می دهیم
Wire.write(Register_2D);
Wire.write(8);
Wire.endTransmission();
در loop ابتدا از آدرسهای x. , x1 دو مقدار شتاب اولیه و ثانویه محور x را خوانده و x1 را در 2 به توان 8 ضرب کرده و با x0 جمع می کنیم.
این کار را با دو محور دیگر نیز انجام می دهیم و در انتها آنها را بر 256 تقسیم می کنیم و اعداد را روی پنجره سریال نشان می دهیم.
#include
#define Register_ID 0
#define Register_2D 0x2D
#define Register_X0 0x32
#define Register_X1 0x33
#define Register_Y0 0x34
#define Register_Y1 0x35
#define Register_Z0 0x36
#define Register_Z1 0x37
int ADXAddress = 0x53; //I2C - adress
int reading = 0;
int val = 0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
double Xg,Yg,Zg;
void setup(){
Serial.begin(9600);
delay(100);
Wire.begin();
delay(100);
Wire.beginTransmission(ADXAddress);
Wire.write(Register_2D);
Wire.write(8);
Wire.endTransmission();
Serial.println("Accelerometer Test ");
}
void loop(){
Wire.beginTransmission(ADXAddress);
Wire.write(Register_X0);
Wire.write(Register_X1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2); {
X0 = Wire.read();
X1 = Wire.read();
X1 = X1<<8;
X_out = X0+X1;
}
Wire.beginTransmission(ADXAddress);
Wire.write(Register_Y0);
Wire.write(Register_Y1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2); {
Y0 = Wire.read();
Y1 = Wire.read();
Y1 = Y1<<8;
Y_out = Y0+Y1;
}
Wire.beginTransmission(ADXAddress);
Wire.write(Register_Z0);
Wire.write(Register_Z1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2); {
Z0 = Wire.read();
Z1 = Wire.read();
Z1 = Z1<<8;
Z_out = Z0+Z1;
}
Xg = X_out/256.00;
Yg = Y_out/256.00;
Zg = Z_out/256.00;
Serial.print("X=");
Serial.print(Xg);
Serial.print("\tY=");
Serial.print(Yg);
Serial.print("\tZ=");
Serial.println(Zg);
delay(300);
}