این ماژول یک ژیرسکوپ 3 محوره می باشد که بر پایه چیپ L3G4200D است .L3G4200D قابلیت اندازه گیری زاویه با دقت قابل تنظیم را دارد . یکی از مهمترین مزیت های این ماژول وجود FIFO است به طوریکه می توان با سرعت های پایین تر از سرعت ماژول ، داده ها را خواند . رابط ارتباطی این ماژول به دو صورت SPI و I2C است که به راحتی می توان ماژول را توسط آردوینو و یا هر MCU دیگری خواند. L3G4200D دارای دماسنج داخلی است و همچنین هماهنگ با سیستم های Low Power طراحی گشته .
مشخصات :
- ولتاژ تغذیه 2.4 تا 3.6 ولت
- دارای رزلوشن های 250dps ، 500dps و 2000dps
- دارای دماسنج خارجی
- عملکرد به صورت سه محوره
- رابط ارتباطی I2C و SPI
- دمای کاری -40 تا +85 درجه سانتی گراد
- دارای FIFO
پین های ماژول GY-50 L3G4200D :
پین های VCC و GND به ترتیب تغذیه و زمین ماژول می باشند .
SCL و SDA پین های ارتباط I2C می باشند .
پین های SDO و CS به ترتیب خروجی دیتا و پین انتخاب در ارتباط SPI می باشند .
INT1 و INT2 نیز وقفه های خارجی ماژول می باشند .
در برخی از ماژول ها پین ها به صورت دو ردیف پین هدر می باشند .
راه اندازی GY-50 با آردوینو :
#include <Wire.h> #define CTRL_REG1 0x20 #define CTRL_REG2 0x21 #define CTRL_REG3 0x22 #define CTRL_REG4 0x23 #define CTRL_REG5 0x24 int L3G4200D_Address = 105; //I2C address of the L3G4200D int x; int y; int z; void setup(){ Wire.begin(); Serial.begin(9600); Serial.println("starting up L3G4200D"); setupL3G4200D(2000); // Configure L3G4200 - 250, 500 or 2000 deg/sec delay(1500); //wait for the sensor to be ready } void loop(){ getGyroValues(); // This will update x, y, and z with new values Serial.print("X:"); Serial.print(x); Serial.print(" Y:"); Serial.print(y); Serial.print(" Z:"); Serial.println(z); delay(100); //Just here to slow down the serial to make it more readable } void getGyroValues(){ byte xMSB = readRegister(L3G4200D_Address, 0x29); byte xLSB = readRegister(L3G4200D_Address, 0x28); x = ((xMSB << 8) | xLSB); byte yMSB = readRegister(L3G4200D_Address, 0x2B); byte yLSB = readRegister(L3G4200D_Address, 0x2A); y = ((yMSB << 8) | yLSB); byte zMSB = readRegister(L3G4200D_Address, 0x2D); byte zLSB = readRegister(L3G4200D_Address, 0x2C); z = ((zMSB << 8) | zLSB); } int setupL3G4200D(int scale){ //From Jim Lindblom of Sparkfun's code // Enable x, y, z and turn off power down: writeRegister(L3G4200D_Address, CTRL_REG1, 0b00001111); // If you'd like to adjust/use the HPF, you can edit the line below to configure CTRL_REG2: writeRegister(L3G4200D_Address, CTRL_REG2, 0b00000000); // Configure CTRL_REG3 to generate data ready interrupt on INT2 // No interrupts used on INT1, if you'd like to configure INT1 // or INT2 otherwise, consult the datasheet: writeRegister(L3G4200D_Address, CTRL_REG3, 0b00001000); // CTRL_REG4 controls the full-scale range, among other things: if(scale == 250){ writeRegister(L3G4200D_Address, CTRL_REG4, 0b00000000); }else if(scale == 500){ writeRegister(L3G4200D_Address, CTRL_REG4, 0b00010000); }else{ writeRegister(L3G4200D_Address, CTRL_REG4, 0b00110000); } // CTRL_REG5 controls high-pass filtering of outputs, use it // if you'd like: writeRegister(L3G4200D_Address, CTRL_REG5, 0b00000000); } void writeRegister(int deviceAddress, byte address, byte val) { Wire.beginTransmission(deviceAddress); // start transmission to device Wire.write(address); // send register address Wire.write(val); // send value to write Wire.endTransmission(); // end transmission } int readRegister(int deviceAddress, byte address){ int v; Wire.beginTransmission(deviceAddress); Wire.write(address); // register to read Wire.endTransmission(); Wire.requestFrom(deviceAddress, 1); // read a byte while(!Wire.available()) { // waiting } v = Wire.read(); return v; }