#define _GNU_SOURCE #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include "mpu6050.h" #include "registers.h" #include "i2c.h" int main() { mpu6050_t mpu6050; mpu6050.dev.init = i2c_init; mpu6050.dev.deinit = i2c_deinit; mpu6050.dev.read = i2c_read; mpu6050.dev.write = i2c_write; mpu6050.dev.sleep = usleep; if (mpu6050_init(&mpu6050)) { exit(1); } mpu6050.cfg.gyro = MPU6050_GYRO_FS_250; mpu6050.cfg.acc = MPU6050_ACC_FS_2G; /* reset all signal paths */ /* enable gyro, acc and temp */ if (i2c_write(REG_SIGNAL_PATH_RESET, 0x07)) { exit(1); } /* set sample rate divisor to 150 */ /* if LP-filter = 0 or 7 => sample rate = 8 Khz, otherwise 1 Khz */ if (i2c_write(REG_SMPLRT_DIV, 150)) { exit(1); } /* set up digital LP-filter */ if (i2c_write(REG_CONFIG, 0x05)) { exit(1); } /* set sleep to 0 */ if (i2c_write(REG_PWR_MGMT1, 0x00)) { exit(1); } /* enable DATA_RDY interrupt (polling for now) */ /* active when internal writes to all out data regs are done */ if (i2c_write(REG_INT_ENABLE, 0x01)) { exit(1); } if (i2c_write(REG_GYRO_CONFIG, mpu6050.cfg.gyro << 3)) { exit(1); } if (i2c_write(REG_ACCEL_CONFIG, mpu6050.cfg.acc << 3)) { exit(1); } usleep(200 * 1000); LOOP: if (mpu6050_read_gyro(&mpu6050)) { exit(1); } if (mpu6050_read_acc(&mpu6050)) { exit(1); } if (mpu6050_read_temp(&mpu6050)) { exit(1); } printf("[GYRO °/s] x:%4.1f y:%4.1f z:%4.1f ", (float)mpu6050.data.gyro.x / 10.f, (float)mpu6050.data.gyro.y / 10.f, (float)mpu6050.data.gyro.z / 10.f); printf("[ACC g] x:%4.3f y:%4.3f z:%4.3f ", (float)mpu6050.data.acc.x / 1000.f, (float)mpu6050.data.acc.y / 1000.f, (float)mpu6050.data.acc.z / 1000.f); printf("t:%4.1f°C\n", (float)mpu6050.data.temp / 10.f); usleep(100 * 1000); goto LOOP; i2c_deinit(); return 0; }