این ماژول یک ژیرسکوپ 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;
}

 

Tags:
About Author: USER_4