In this example we connect a L3G4200D three-axis gyroscope module to an Arduino Uno
First lets look at some information about the sensor from the manufacturer
The L3G4200D is a low-power three-axis gyroscope providing three different user selectable full scales (±250/±500/±2000 dps).It includes a sensing element and an IC interface able to provide the detected angular rate to the external world through a digital interface (I2C/SPI).
The sensing element is manufactured using specialized micromachining processes, while the IC interface is realized using a CMOS technology that allows designing a dedicated circuit which is trimmed to better match the sensing element characteristics.
Features
- Three selectable full scales (±250/500/2000 dps)
- I2C/SPI digital output interface
- 16 bit rate value data output
- Two digital output lines (interrupt and dataready)
- Integrated low and high pass filters with user selectable bandwidth
- Embedded self-test
- Wide supply voltage, 2.4 V to 3.6 V
- Low voltage compatible IOs, 1.8 V
- Embedded power-down and sleep mode
- High shock survivability
- Extended operating temperature range (-40 °C to +85 °C)
This was my sensor of choice that I used
Parts Required
Here are the parts I used
The sensor you can pick up in the $2 to $3 range
Name | Link |
Arduino Uno | UNO R3 CH340G/ATmega328P, compatible for Arduino UNO |
L3G4200D | GY-50 L3G4200D Triple Axis Gyro Angular Velocity Sensor Module |
Connecting wire | Free shipping Dupont line 120pcs 20cm male to male + male to female and female to female jumper wire |
sensor shield | Expansion IO Board Sensor Shield |
Schematic/Connection
My module had a built in 3.3v ldo voltage regulator which means you can connect 5v, make sure your module has this as well because the L3G4200D is only rated at 2.4 V to 3.6 V – exceeding that could damage the chip. You can of course use the 3.3v from the Arduino as well
Code Example
This example uses the library – https://github.com/jarzebski/Arduino-L3G4200D
This is one of the default examples when you install the library above, there are quite a few to browse
/*
L3G4200D Triple Axis Gyroscope. Simple Example.
Read more: http://www.jarzebski.pl/arduino/czujniki-i-sensory/3-osiowy-zyroskop-l3g4200d.html
GIT: https://github.com/jarzebski/Arduino-L3G4200D
Web: http://www.jarzebski.pl
(c) 2014 by Korneliusz Jarzebski
*/
#include <Wire.h>
#include <L3G4200D.h>
L3G4200D gyroscope;
void setup()
{
Serial.begin(9600);
Serial.println("Initialize L3G4200D");
while(!gyroscope.begin(L3G4200D_SCALE_2000DPS, L3G4200D_DATARATE_400HZ_50))
{
Serial.println("Could not find a valid L3G4200D sensor, check wiring!");
delay(500);
}
// Check selected scale
Serial.print("Selected scale: ");
switch(gyroscope.getScale())
{
case L3G4200D_SCALE_250DPS:
Serial.println("250 dps");
break;
case L3G4200D_SCALE_500DPS:
Serial.println("500 dps");
break;
case L3G4200D_SCALE_2000DPS:
Serial.println("2000 dps");
break;
default:
Serial.println("unknown");
break;
}
// Check Output Data Rate and Bandwidth
Serial.print("Output Data Rate: ");
switch(gyroscope.getOdrBw())
{
case L3G4200D_DATARATE_800HZ_110:
Serial.println("800HZ, Cut-off 110");
break;
case L3G4200D_DATARATE_800HZ_50:
Serial.println("800HZ, Cut-off 50");
break;
case L3G4200D_DATARATE_800HZ_35:
Serial.println("800HZ, Cut-off 35");
break;
case L3G4200D_DATARATE_800HZ_30:
Serial.println("800HZ, Cut-off 30");
break;
case L3G4200D_DATARATE_400HZ_110:
Serial.println("400HZ, Cut-off 110");
break;
case L3G4200D_DATARATE_400HZ_50:
Serial.println("400HZ, Cut-off 50");
break;
case L3G4200D_DATARATE_400HZ_25:
Serial.println("400HZ, Cut-off 25");
break;
case L3G4200D_DATARATE_400HZ_20:
Serial.println("400HZ, Cut-off 20");
break;
case L3G4200D_DATARATE_200HZ_70:
Serial.println("200HZ, Cut-off 70");
break;
case L3G4200D_DATARATE_200HZ_50:
Serial.println("200HZ, Cut-off 50");
break;
case L3G4200D_DATARATE_200HZ_25:
Serial.println("200HZ, Cut-off 25");
break;
case L3G4200D_DATARATE_200HZ_12_5:
Serial.println("200HZ, Cut-off 12.5");
break;
case L3G4200D_DATARATE_100HZ_25:
Serial.println("100HZ, Cut-off 25");
break;
case L3G4200D_DATARATE_100HZ_12_5:
Serial.println("100HZ, Cut-off 12.5");
break;
default:
Serial.println("unknown");
break;
}
// Calibrate gyroscope. The calibration must be at rest.
// If you don't want calibrate, comment this line.
gyroscope.calibrate();
// Set threshold sensivty. Default 3.
// If you don't want use threshold, comment this line or set 0.
gyroscope.setThreshold(3);
}
void loop()
{
// Read normalized values
Vector raw = gyroscope.readRaw();
// Read normalized values in deg/sec
Vector norm = gyroscope.readNormalize();
// Output raw
Serial.print(" Xraw = ");
Serial.print(raw.XAxis);
Serial.print(" Yraw = ");
Serial.print(raw.XAxis);
Serial.print(" Zraw = ");
Serial.print(raw.YAxis);
// Output normalized
Serial.print(" Xnorm = ");
Serial.print(norm.XAxis);
Serial.print(" Ynorm = ");
Serial.print(norm.YAxis);
Serial.print(" ZNorm = ");
Serial.print(norm.ZAxis);
Serial.println();
}
Output
Here is what I saw in Serial monitor,l move the module around to see different values
Initialize L3G4200D
Selected scale: 2000 dps
Output Data Rate: 400HZ, Cut-off 50
Xraw = -632.00 Yraw = -632.00 Zraw = -379.00 Xnorm = 0.00 Ynorm = 0.00 ZNorm = 0.00
Xraw = -384.00 Yraw = -384.00 Zraw = -9.00 Xnorm = 0.00 Ynorm = 0.00 ZNorm = 0.00
Xraw = -1971.00 Yraw = -1971.00 Zraw = 4270.00 Xnorm = 0.00 Ynorm = 0.00 ZNorm = 0.00
Xraw = -41.00 Yraw = -41.00 Zraw = 6569.00 Xnorm = 0.00 Ynorm = 0.00 ZNorm = 0.00
Xraw = 825.00 Yraw = 825.00 Zraw = -5843.00 Xnorm = 0.00 Ynorm = 0.00 ZNorm = 0.00
Links