Created
November 8, 2015 08:25
-
-
Save 3DKIDS/16418cad30e11483ba26 to your computer and use it in GitHub Desktop.
Arduino Study
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Wire.h> | |
#define CTRL_REG1 0x20 | |
#define CTRL_REG2 0x21 | |
#define CTRL_REG3 0x22 | |
#define CTRL_REG4 0x23 | |
#define CTRL_REG5 0x24 | |
// I2C address of the L3G4200D. | |
// Use I2C scanner to find this value! | |
int L3G4200D_Address = 105; | |
// Delta angles (raw input from gyro) | |
int x = 0; | |
int y = 0; | |
int z = 0; | |
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(); | |
Serial.print("X="); | |
Serial.print(x,DEC); | |
Serial.print("\t"); | |
Serial.print("y="); | |
Serial.print(y,DEC); | |
Serial.print("\t"); | |
Serial.print("z="); | |
Serial.print(z,DEC); | |
Serial.print("\t"); | |
Serial.println(); | |
delay(100); | |
} | |
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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment