Contents

Interfacing 9-Axis GY-801 IMU Module with Arduino

GY-801 IMU Module Features

The GY-801 sensor module is a precise 9-axis sensor which includes L3G4200D (Gyroscope), ADXL345 (Accelerometer), MMC5883MC (Magnetometer) and BMP180 (Barometric Pressure/Temperature) ICs.

All these ICs use I2C protocol for communication. This module is also used in the development of ground and flying robots.

To download the datasheet of GY-801 module, click here.

Icon

GY-801 Module Datasheet 18.92 MB 879 downloads

…

To download the datasheet of L3G4200D sensor, click here.

Icon

L3G4200D Sensor Datasheet 1.25 MB 324 downloads

…

To download the datasheet of ADXL345 sensor, click here.

Icon

ADXL345 Sensor Datasheet 481.83 KB 261 downloads

…

To download the datasheet of MMC5883MC sensor, click here.

Icon

MMC5883MC Sensor Datasheet 428.87 KB 335 downloads

…

To download the datasheet of BMP180 sensor, click here.

Icon

BMP180 Sensor Datasheet 656.44 KB 252 downloads

…

GY-801 IMU Module Pinout

The GY-801 IMU Module has 10 pins:

  • VIN: Module power supply – 5V
  • 3.3V: Module power supply – 3.3V
  • GND: Ground
  • SCL: I2C Serial Clock
  • SDA: I2C Serial Data
  • M_DRDY: Data Ready Pin for the MMC5883L IC
  • A_INT1: Data Ready Pin for the ADXL345 IC
  • A_INT2: Data Ready Pin for the ADXL345 IC
  • G_INT1: Data Ready Pin for the L3G4200D IC
  • G_INT2: Data Ready Pin for the L3G4200D IC

You can see the pinout of this module in the image below.

Required Materials

Hardware Components

Arduino UNO R3 × 1
GY-801 Module × 1
Male to Female jumper wire × 1

Software Apps

Arduino IDE

Interfacing GY-801 IMU Module with Arduino

Step 1: Circuit

The following circuit shows how you should connect Arduino to this module. Connect wires accordingly.

Step 2: Code

Download all files needed from this link and put them in one folder. Then, upload the following code to your Arduino.

/*
  Create on May 19, 2021
  Create by MohammedDamirchi base of https://github.com/DMohammed/GY-801
  
Home
*/ #include <Arduino.h> #include "Wire.h" #include "MMC5883.h" #include <I2Cdev.h> #include "L3G4200D.h" #include "ADXL345.h" #include <Adafruit_Sensor.h> #include "Adafruit_BMP085_U.h" L3G4200D gyro; ADXL345 accel; MMC5883MA MMC5883(Wire); Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); int16_t ax, ay, az; int16_t avx, avy, avz; double baseline; // baseline pressure void setup() { Serial.begin(9600); Wire.begin(); Serial.println("Initializing I2C devices..."); gyro.initialize(); accel.initialize(); // verify connection Serial.println("Testing device connections..."); Serial.println(gyro.testConnection() ? "L3G4200D connection successful" : "L3G4200D connection failed"); Serial.println("Testing device connections..."); Serial.println(accel.testConnection() ? "ADXL345 connection successful" : "ADXL345 connection failed"); // data seems to be best when full scale is 2000 gyro.setFullScale(2000); if (!bmp.begin()) Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!"); Serial.print("MMC5883MA "); MMC5883.begin(); MMC5883.calibrate(); } void loop() { Serial.print(MMC5883.readData()); Serial.print(" "); gyro.getAngularVelocity(&avx, &avy, &avz); Serial.print("gyro X:"); Serial.print(avx); Serial.print("\tY:"); Serial.print(avy); Serial.print("\tZ:"); Serial.print(avz); // read raw accel measurements from device accel.getAcceleration(&ax, &ay, &az); // display tab-separated accel x/y/z values Serial.print("\taccel X:"); Serial.print(ax); Serial.print("\tY:"); Serial.print(ay); Serial.print("\tZ:"); Serial.print(az); /* Get a new sensor event */ sensors_event_t event; bmp.getEvent(&event); /* Display the results (barometric pressure is measure in hPa) */ if (event.pressure) { /* Display atmospheric pressue in hPa */ Serial.print("\tPressure:"); Serial.print(event.pressure); Serial.print(" hPa"); /* First we get the current temperature from the BMP085 */ float temperature; bmp.getTemperature(&temperature); Serial.print("\tTemp:"); Serial.print(temperature); Serial.print(" C"); /* Then convert the atmospheric pressure, and SLP to altitude */ /* Update this next line with the current SLP for better results */ float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA; Serial.print("\tAltitude:"); Serial.println(bmp.pressureToAltitude(seaLevelPressure, event.pressure)); } else { Serial.println("BME Sensor error"); } delay(1000); }

You can see the results in the Serial Monitor.

Liked What You See?​
Get Updates And Learn From The Best​

Leave a Reply

Your email address will not be published. Required fields are marked *