Item code: 27911
What It Can Do
- Modular angular rate sensor tracks motion in three axes
- Three selectable measurement scales, with rates up to 2000° per second
- Built-in temperature sensor; can be used separately, or for temperature drift compensation
The 3-Axis Gyroscope module provides separate data values for yaw, pitch, and roll. Motion is indicated as a positive or negative value, depending on the direction of rotation. The sensor is useful in 3D simulation, virtual gaming input devices, robotics, and for remotely controlled or unpiloted aircraft and submersibles.
Gyroscopes are commonly used with multi-axis accelerometers, where the data from both sensors can provide useful information detailing speed and direction of travel. The Memsic 2125 Dual-axis Accelerometer and MMA7455 3-Axis Accelerometer Module are good companion accelerometers for the 3-Axis Gyroscope module
It may also be used with an accelerometer and 3-axis compass to construct a 9-axis IMU (intertial measurement unit), common in unmanned aerial vehicles, such as drones and quadcopters.
Parts List
- 3-Axis Gyroscope module
- BASIC Stamp HomeWork Board, Propeller BOE, Propeller QuickStart, or Arduino Uno microcontroller (with breadboard, as needed)
- 22 gauge solid conductor hookup wire
Basic Wiring
- Power Requirements: 2.7 to 6.5 VDC
- Communication Interface: I2C (up to 400 kHz) or SPI (10 MHz; 4 & 3 wire)
- Dimensions: 0.85 X 0.80 in (2.16 X 2.03 cm)
Program KickStarts
The KickStart examples display raw data output for each of the three axes. Values are retrieved from the module using the I2C interface.
BASIC Stamp HomeWork Board
Download BASIC Stamp 2 code for the 3-Axis Gyroscope Module
’ {$STAMP BS2} ’ {$PBASIC 2.5} SDA PIN 0 ’ SDA of gyro connected to P0 SCL PIN 1 ’ SCL of gyro connected to P1 WRITE_Data CON $D2 ’ Request Write operation READ_Data CON $D3 ’ Request Read operation ’ Control registers CTRL_REG1 CON $20 CTRL_REG2 CON $21 CTRL_REG3 CON $22 CTRL_REG4 CON $23 STATUS_REG CON $27 OUT_X_INC CON $A8 X VAR Word Y VAR Word Z VAR Word rawl VAR Word rawh VAR Word ’ Variables for I2C communications I2C_DATA VAR Byte I2C_LSB VAR Bit I2C_REG VAR Byte I2C_VAL VAR Byte PAUSE 100 ’ Power up delay ’ Set up data ready signal I2C_REG = CTRL_REG3 I2C_VAL = $08 GOSUB I2C_Write_Reg ’ Set up "block data update" mode I2C_REG = CTRL_REG4 I2C_VAL = $80 GOSUB I2C_Write_Reg ’ Send the get continuous output command I2C_REG = CTRL_REG1 I2C_VAL = $1F GOSUB I2C_Write_Reg DO GOSUB Gyro_Get_Raw ’ Get XYZ data ’ Divide X Y Z, by 114 to reduce noise IF (X.BIT15) THEN X = (ABS X) / 114 X = -X ELSE X = X / 114 ENDIF IF (Y.BIT15) THEN Y = (ABS Y) / 114 Y = -Y ELSE Y = Y / 114 ENDIF IF (Z.BIT15) THEN Z = (ABS Z) / 114 Z = -Z ELSE Z = Z / 114 ENDIF DEBUG HOME, "RAW X = ",11, SDEC X, CR ’ Display data DEBUG "RAW Y = ",11, SDEC Y, CR DEBUG "RAW Z = ",11, SDEC Z, CR PAUSE 250 LOOP Gyro_Get_Raw: GOSUB Wait_For_Data_Ready GOSUB I2C_Start I2C_DATA = WRITE_DATA GOSUB I2C_Write ’ Read the data starting I2C_DATA = OUT_X_INC ’ at pointer register GOSUB I2C_Write GOSUB I2C_Stop GOSUB I2C_Start I2C_DATA = READ_DATA GOSUB I2C_Write GOSUB I2C_Read rawL = I2C_DATA ’ Read high byte GOSUB I2C_ACK GOSUB I2C_Read rawH = I2C_DATA ’ Read low byte GOSUB I2C_ACK X = (rawH << 8) | rawL ’ OR high and low into X ’ Do the same for Y and Z: GOSUB I2C_Read rawL = I2C_DATA GOSUB I2C_ACK GOSUB I2C_Read rawH = I2C_DATA GOSUB I2C_ACK Y = (rawH << 8) | rawL GOSUB I2C_Read rawL = I2C_DATA GOSUB I2C_ACK GOSUB I2C_Read rawH = I2C_DATA GOSUB I2C_NACK Z = (rawH << 8) | rawL GOSUB I2C_Stop RETURN ’---------I2C functions------------ ’ Read the status register until the ZYXDA bit is high Wait_For_Data_Ready: DO I2C_REG = STATUS_REG GOSUB I2C_Read_Reg LOOP UNTIL ((I2C_DATA & $08) <> 0) RETURN ’ Set I2C_REG & I2C_VAL before calling this I2C_Write_Reg: GOSUB I2C_Start I2C_DATA = WRITE_DATA GOSUB I2C_Write I2C_DATA = I2C_REG GOSUB I2C_Write I2C_DATA = I2C_VAL GOSUB I2C_Write GOSUB I2C_Stop RETURN ’ Set I2C_REG before calling this, I2C_DATA will have result I2C_Read_Reg: GOSUB I2C_Start I2C_DATA = WRITE_DATA GOSUB I2C_Write I2C_DATA = I2C_REG GOSUB I2C_Write GOSUB I2C_Stop GOSUB I2C_Start I2C_DATA = READ_DATA GOSUB I2C_Write GOSUB I2C_Read GOSUB I2C_NACK GOSUB I2C_Stop RETURN I2C_Start: LOW SDA LOW SCL RETURN I2C_Stop: LOW SDA INPUT SCL INPUT SDA RETURN I2C_ACK: LOW SDA INPUT SCL LOW SCL INPUT SDA RETURN I2C_NACK: INPUT SDA INPUT SCL LOW SCL RETURN I2C_Read: SHIFTIN SDA, SCL, MSBPRE, [I2C_DATA] RETURN I2C_Write: I2C_LSB = I2C_DATA.BIT0 I2C_DATA = I2C_DATA / 2 SHIFTOUT SDA, SCL, MSBFIRST, [I2C_DATA7] IF I2C_LSB THEN INPUT SDA ELSE LOW SDA INPUT SCL LOW SCL INPUT SDA INPUT SCL LOW SCL RETURN
When this program is run the BASIC Stamp Debug Terminal will automatically open.
Propeller BOE and Propeller QuickStart
Propeller BOE Wiring Diagram
Propeller QuickStart Wiring Diagram
Download Propeller Spin code for the 3-Axis Gyroscope Module
OBJ pst : "FullDuplexSerial" CON _clkmode = xtal1 + pll16x _clkfreq = 80_000_000 SDApin = 0 ’ SDA of gyro connected to P0 SCLpin = 1 ’ SCL of gyro connected to P1 WRITE = $D2 ’ Request Write operation READ = $D3 ’ Request Read operation ’ Control registers CTRL_REG1 = $20 CTRL_REG2 = $21 CTRL_REG3 = $22 CTRL_REG4 = $23 STATUS_REG = $27 OUT_X_INC = $A8 x_idx = 0 y_idx = 1 z_idx = 2 VAR long x long y long z long cx long cy long cz long ff_x long ff_y long ff_z long multiBYTE[3] PUB Go | last_ticks pst.start(31, 30, 0, 115200) ’ Set modes Wrt_1B(CTRL_REG3, $08) ’ Data ready signal Wrt_1B(CTRL_REG4, $80) ’ Block data update Wrt_1B(CTRL_REG1, $1F) ’ Enable all axes last_ticks := cnt repeat pst.tx(1) ’ Set Terminal data WaitForDataReady ’ at top of screen Read_MultiB(OUT_X_INC) ’ Read XYZ bytes ’ Divide by 114 to reduce noise x := (x - cx) / 114 y := (y - cy) / 114 z := (z - cz) / 114 RawXYZ WaitCnt(ClkFreq / 4 + Cnt) ’ Delay before next loop PUB RawXYZ ’Display Raw X,Y,Z data pst.str(string("RAW X ",11)) pst.dec(x) pst.str(string(13, "RAW Y ",11)) pst.dec(y) pst.str(string(13, "RAW Z ",11)) pst.dec(z) ’’ Below here routines to support I2C interfacing PUB WaitForDataReady | status repeat status := Read_1B(STATUS_REG) if (status & $08) == $08 quit PUB Wrt_1B(SUB1, data) ’’Write single byte to Gyroscope. start send(WRITE) send(SUB1) send(data) stop PUB Read_1B(SUB3) | rxd ’’Read single byte from Gyroscope start send(WRITE) send(SUB3) stop start send(READ) rxd := receive(false) stop result := rxd PUB Read_MultiB(SUB3) ’’Read multiple bytes from Gyroscope start send(WRITE) send(SUB3) stop start send(READ) multiBYTE[x_idx] := (receive(true)) | (receive(true)) << 8 multiBYTE[y_idx] := (receive(true)) | (receive(true)) << 8 multiBYTE[z_idx] := (receive(true)) | (receive(false)) << 8 stop x := ~~multiBYTE[x_idx] y := ~~multiBYTE[y_idx] z := ~~multiBYTE[z_idx] PRI send(value) value := ((!value) >< 8) repeat 8 dira[SDApin] := value dira[SCLpin] := false dira[SCLpin] := true value >>= 1 dira[SDApin] := false dira[SCLpin] := false result := not(ina[SDApin]) dira[SCLpin] := true dira[SDApin] := true PRI receive(aknowledge) dira[SDApin] := false repeat 8 result <<= 1 dira[SCLpin] := false result |= ina[SDApin] dira[SCLpin] := true dira[SDApin] := (aknowledge) dira[SCLpin] := false dira[SCLpin] := true dira[SDApin] := true PRI start outa[SDApin] := false outa[SCLpin] := false dira[SDApin] := true dira[SCLpin] := true PRI stop dira[SCLpin] := false dira[SDApin] := false
To view the results of the demonstration, after uploading is complete run the Parallax Serial Terminal from the Run menu, or press F12. Click the Enable button in the Terminal window, then momentarily depress the Reset button on the Propeller QuickStart board to restart the program.
Arduino Uno
Download Arduino Code for the 3-Axis Gyroscope Module
#include <Wire.h> #define CTRL_REG1 0x20 #define CTRL_REG2 0x21 #define CTRL_REG3 0x22 #define CTRL_REG4 0x23 int Addr = 105; // I2C address of gyro int x, y, z; void setup(){ Wire.begin(); Serial.begin(9600); writeI2C(CTRL_REG1, 0x1F); // Turn on all axes, disable power down writeI2C(CTRL_REG3, 0x08); // Enable control ready signal writeI2C(CTRL_REG4, 0x80); // Set scale (500 deg/sec) delay(100); // Wait to synchronize } void loop(){ getGyroValues(); // Get new values // In following Dividing by 114 reduces noise Serial.print("Raw X:"); Serial.print(x / 114); Serial.print(" Raw Y:"); Serial.print(y / 114); Serial.print(" Raw Z:"); Serial.println(z / 114); delay(500); // Short delay between reads } void getGyroValues () { byte MSB, LSB; MSB = readI2C(0x29); LSB = readI2C(0x28); x = ((MSB << 8) | LSB); MSB = readI2C(0x2B); LSB = readI2C(0x2A); y = ((MSB << 8) | LSB); MSB = readI2C(0x2D); LSB = readI2C(0x2C); z = ((MSB << 8) | LSB); } int readI2C (byte regAddr) { Wire.beginTransmission(Addr); Wire.write(regAddr); // Register address to read Wire.endTransmission(); // Terminate request Wire.requestFrom(Addr, 1); // Read a byte while(!Wire.available()) { }; // Wait for receipt return(Wire.read()); // Get result } void writeI2C (byte regAddr, byte val) { Wire.beginTransmission(Addr); Wire.write(regAddr); Wire.write(val); Wire.endTransmission(); }
To view the results of the demonstration, after uploading is complete click the Serial Monitor icon in the Arduino IDE. This displays the Serial Monitor window. Momentarily depress the Reset button on the Arduino board to restart the sketch.
For More Information
- See the 3-Axis Gyroscope (#27911) data sheet.
- More information on gyroscopes and inertial navigation may be found on Wikipedia: Gyroscope
- Combine the 3-axis gyroscope with the Parallax MMA7455 3-Axis Accelerometer Module and Compass Module 3-Axis HMC5883L to create a 9-axis inertial momentum unit (IMU)