Skip to content

Latest commit

 

History

History
182 lines (151 loc) · 5.21 KB

File metadata and controls

182 lines (151 loc) · 5.21 KB

#Fio SD Logger application

Example data:

I haven't got the FIFO / interrupt working yet. At its fastest sampling rate, the MPU6050 collects faster than the Fio can get the data I think

Includes and constants:

#include <Wire.h>
#include <SD.h>

#define PACKET_SIZE     (5)
#define CMD_ID_WRITE    (0x01)
#define CMD_ID_READ     (0x02)

#define MPU6050_ADDR    (0x68)

#define INTERRUPT_PIN_D2    (0) // for whatever reason, D2 maps to int 0

Some of the register addresses:

// register addr
#define MPU6050_REG_USER_CTRL       (0x6A)
#define MPU6050_REG_WHOAMI          (0x75)
#define MPU6050_REG_FIFO_EN         (0x23)
#define MPU6050_REG_INT_ENABLE      (0x38)
#define MPU6050_REG_GYRO_XOUT_H     (0x43)
#define MPU6050_REG_GYRO_XOUT_L     (0x44)
#define MPU6050_REG_GYRO_YOUT_H     (0x45)
#define MPU6050_REG_GYRO_YOUT_L     (0x46)
#define MPU6050_REG_GYRO_ZOUT_H     (0x47)
#define MPU6050_REG_GYRO_ZOUT_L     (0x48)
#define MPU6050_REG_ACCEL_XOUT_H    (0x3B)
#define MPU6050_REG_ACCEL_XOUT_L    (0x3C)
#define MPU6050_REG_ACCEL_YOUT_H    (0x3D)
#define MPU6050_REG_ACCEL_YOUT_L    (0x3E)
#define MPU6050_REG_ACCEL_ZOUT_H    (0x3F)
#define MPU6050_REG_ACCEL_ZOUT_L    (0x40)
#define MPU6050_REG_SMPLRT_DIV      (0x19)
#define MPU6050_REG_CONFIG          (0x1A)
#define MPU6050_REG_GYRO_CONFIG     (0x1B)
#define MPU6050_REG_ACCEL_CONFIG    (0x1C)
#define MPU6050_REG_PWR_MGMT_1      (0x6B)
#define MPU6050_REG_PWR_MGMT_2      (0x6C)
#define MPU6050_REG_FIFO_COUNT_H    (0x72)
#define MPU6050_REG_FIFO_COUNT_L    (0x73)
#define MPU6050_REG_FIFO_R_W        (0x74)

Values to put in the registers. Not currently used.

// register values
#define MPU6050_INT_ENABLE_FIFO_OFLOW   (0x10)
#define MPU6050_INT_DATA_RDY            (0x01)
#define MPU6050_FIFO_ENABLE_ACCEL_GYRO   (0x78) 
#define MPU6050_FIFO_EN                 (0x40)


#define N_SAMPLES (1000)

unsigned char hi,lo;
int samples = 0;
File data;

I2C functions:

void writeToI2C(char chip_addr, char reg_addr, unsigned char value)
{
    Wire.beginTransmission(chip_addr);
    Wire.write(reg_addr);
    Wire.write(value);
    Wire.endTransmission();
}

void readFromI2C(char chip_addr, char reg_addr, unsigned int num, unsigned char* buff) 
{
    Wire.beginTransmission(chip_addr);
    Wire.write(reg_addr);
    Wire.endTransmission();
    Wire.beginTransmission(chip_addr);
    Wire.requestFrom(chip_addr, num); 
    int i;
    for (i = 0; i < num; i++) {
        while(!Wire.available()); // wait for recv
        buff[i++] = Wire.read();
    }
    Wire.endTransmission();
}

The MPU6050 is asleep by default

void wake_up()
{
    writeToI2C(MPU6050_ADDR, MPU6050_REG_PWR_MGMT_1, 0);
}

Initialization:

void setup()
{
    Serial.begin(57600);
    Wire.begin();
    wake_up();
    int chipSelect = 10;
    pinMode(chipSelect, OUTPUT);
    if(!SD.begin(chipSelect)) {
        while (1) {
            Serial.println("SD card failed.");
        }
    } else {
        Serial.println("SD card initialized.");
    }
    if (SD.exists("data.csv")) {
        SD.remove("data.csv");
    }
    data = SD.open("data.csv", FILE_WRITE);

}

This is called as fast as possible:

void collect_sample()
{
    readFromI2C(MPU6050_ADDR, MPU6050_REG_ACCEL_XOUT_H, 1, &hi);
    readFromI2C(MPU6050_ADDR, MPU6050_REG_ACCEL_XOUT_L, 1, &lo);
    data.print(hi, HEX);
    data.print(' ');
    data.print(lo, HEX);
    data.print(',');

    readFromI2C(MPU6050_ADDR, MPU6050_REG_ACCEL_YOUT_H, 1, &hi);
    readFromI2C(MPU6050_ADDR, MPU6050_REG_ACCEL_YOUT_L, 1, &lo);
    data.print(hi, HEX);
    data.print(' ');
    data.print(lo, HEX);
    data.print(',');

    readFromI2C(MPU6050_ADDR, MPU6050_REG_ACCEL_ZOUT_H, 1, &hi);
    readFromI2C(MPU6050_ADDR, MPU6050_REG_ACCEL_ZOUT_L, 1, &lo);
    data.print(hi, HEX);
    data.print(' ');
    data.print(lo, HEX);
    data.print(',');

    readFromI2C(MPU6050_ADDR, MPU6050_REG_GYRO_XOUT_H, 1, &hi);
    readFromI2C(MPU6050_ADDR, MPU6050_REG_GYRO_XOUT_L, 1, &lo);
    data.print(hi, HEX);
    data.print(' ');
    data.print(lo, HEX);
    data.print(',');

    readFromI2C(MPU6050_ADDR, MPU6050_REG_GYRO_YOUT_H, 1, &hi);
    readFromI2C(MPU6050_ADDR, MPU6050_REG_GYRO_YOUT_L, 1, &lo);
    data.print(hi, HEX);
    data.print(' ');
    data.print(lo, HEX);
    data.print(',');

    readFromI2C(MPU6050_ADDR, MPU6050_REG_GYRO_ZOUT_H, 1, &hi);
    readFromI2C(MPU6050_ADDR, MPU6050_REG_GYRO_ZOUT_L, 1, &lo);
    data.print(hi, HEX);
    data.print(' ');
    data.print(lo, HEX);
    data.print('\n');
}

void loop()
{
    if (samples < N_SAMPLES) {
        collect_sample();
        samples++;
    } else if (samples == N_SAMPLES) {
        data.close();
        samples++;
        Serial.println("done.");
    } else {
        // do nothing
    }
}