Cu$� �$����!�&ߏJ�u�Raw Se ��VVIn%�@ߏ ca"
. My code runs fine when the SD stuff isn't in it but once it is it doesn't work. I'm having trouble figuring out what I did wrong.
Here's the code I'm running. I'm using an Uno with the BNO055 and the the Data Logger Shield.
Code: Select all
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <utility/imumaths.h>
#include <EEPROM.h>
#include <SPI.h>
#include <SD.h>
#define SAMPLE_RATE_DELAY_MS (1000) // how often data is collected
Adafruit_BNO055 bno = Adafruit_BNO055(55);
/*******************************************************/
const int chipSelect = 4;
File dataFile;
/******************************************************/
void displayCalStatus(void)
{
uint8_t system, gyro, accel, mag;
system = gyro = accel = mag = 0;
bno.getCalibration(&system, &gyro, &accel, &mag);
Serial.print("\t");
if (!system)
{
Serial.print("! ");
}
Serial.print("Sys:");
Serial.print(system, DEC);
Serial.print(" G:");
Serial.print(gyro, DEC);
Serial.print(" A:");
Serial.print(accel, DEC);
Serial.print(" M:");
Serial.print(mag, DEC);
}
void displaySensorOffsets(const adafruit_bno055_offsets_t &calibData)
{
Serial.print("Accelerometer: ");
Serial.print(calibData.accel_offset_x); Serial.print(" ");
Serial.print(calibData.accel_offset_y); Serial.print(" ");
Serial.print(calibData.accel_offset_z); Serial.print(" ");
Serial.print("\nGyro: ");
Serial.print(calibData.gyro_offset_x); Serial.print(" ");
Serial.print(calibData.gyro_offset_y); Serial.print(" ");
Serial.print(calibData.gyro_offset_z); Serial.print(" ");
Serial.print("\nMag: ");
Serial.print(calibData.mag_offset_x); Serial.print(" ");
Serial.print(calibData.mag_offset_y); Serial.print(" ");
Serial.print(calibData.mag_offset_z); Serial.print(" ");
Serial.print("\nAccel Radius: ");
Serial.print(calibData.accel_radius);
Serial.print("\nMag Radius: ");
Serial.print(calibData.mag_radius);
}
void setup(void)
{
Serial.begin(9600);
Serial.println("Raw Sensor Data");
Serial.print("");
bno.begin(); //start sensor
/**************************************************************/
Serial.print("Initializing SD card...");
pinMode(SS, OUTPUT);
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
while (1) ;
}
Serial.println("card initialized.");
dataFile = SD.open("datafile.txt", FILE_WRITE);
if (! dataFile) {
Serial.println("error opening datafile.txt");
// Wait forever since we cant write data
while (1) ;
}
/***************************************************************/
int eeAddress = 0;
long bnoID;
bool foundCalib = false;
EEPROM.get(eeAddress, bnoID);
adafruit_bno055_offsets_t calibrationData;
sensor_t sensor;
bno.getSensor(&sensor);
if (bnoID != sensor.sensor_id)
{
Serial.println("\nNo Calibration Data for this sensor exists in EEPROM");
delay(500);
}
else
{
Serial.println("\nFound Calibration for this sensor in EEPROM.");
eeAddress += sizeof(long);
EEPROM.get(eeAddress, calibrationData);
displaySensorOffsets(calibrationData);
Serial.println("\n\nRestoring Calibration data to the BNO055...");
bno.setSensorOffsets(calibrationData);
Serial.println("\n\nCalibration data loaded into BNO055");
foundCalib = true;
}
sensors_event_t event;
bno.getEvent(&event);
if (foundCalib){
Serial.println("Move sensor slightly to calibrate magnetometers");
while (!bno.isFullyCalibrated())
{
bno.getEvent(&event);
delay(SAMPLE_RATE_DELAY_MS);
}
}
else
{
Serial.println("Please Calibrate Sensor: ");
while (!bno.isFullyCalibrated())
{
bno.getEvent(&event);
Serial.print("X: ");
Serial.print(event.orientation.x, 4);
Serial.print("\tY: ");
Serial.print(event.orientation.y, 4);
Serial.print("\tZ: ");
Serial.print(event.orientation.z, 4);
/* Optional: Display calibration status */
displayCalStatus();
/* New line for the next sample */
Serial.println("");
}
}
Serial.println("\nFully Calibrated");
Serial.println("Calibration Results: ");
adafruit_bno055_offsets_t newCalib;
bno.getSensorOffsets(newCalib);
displaySensorOffsets(newCalib);
Serial.println("\n\nStoring calibration data to EEPROM...");
eeAddress = 0;
bno.getSensor(&sensor);
bnoID = sensor.sensor_id;
EEPROM.put(eeAddress, bnoID);
eeAddress += sizeof(long);
EEPROM.put(eeAddress, newCalib);
Serial.println("Data stored to EEPROM.");
delay(500);
int8_t temp=bno.getTemp(); //get current temp
Serial.print("Current Temperature: ");
Serial.print(temp);
Serial.println(" C");
Serial.println("");
bno.setExtCrystalUse(true);
Serial.println("Calibration Status Values: 0 = uncalibrated, 3 = fully calibrated");
Serial.println("Accel X \t Accel Y \t Accel Z \t Vel X \t Vel Y \t Vel Z \t Gyro X \t Gyro Y \t Gyro Z \t Time");
}
float velx_i = 0; //initial velocity values
float vely_i = 0;
float velz_i = 0;
float Time=0;
void loop()
{
while ((Time <= 30.0)) // run code for 30 seconds
{
imu::Vector<3> acceleration = bno.getVector(Adafruit_BNO055::VECTOR_ACCELEROMETER);
Serial.println(""); //print accelerometer data to serial (m/s^2)
Serial.print(acceleration.x(), DEC);
Serial.print("\t");
Serial.print(acceleration.y(), DEC);
Serial.print("\t");
Serial.print(acceleration.z(), DEC);
/************************************************************/
dataFile.println("");
dataFile.print(acceleration.x(), DEC);
dataFile.print("\t");
dataFile.print(acceleration.y(),DEC);
dataFile.print("\t");
dataFile.print(acceleration.z(), DEC);
/**********************************************************/
velx_i = acceleration.x()*Time; //get velocity from acceleration (m/s^2)*s
vely_i = acceleration.y()*Time;
velz_i = acceleration.z()*Time;
Serial.print("\t"); // print velocity data to serial
Serial.print(velx_i, DEC);
Serial.print("\t");
Serial.print(vely_i, DEC);
Serial.print("\t");
Serial.print(velz_i, DEC);
/******************************************************/
dataFile.print("\t");
dataFile.print(velx_i, DEC);
dataFile.print("\t");
dataFile.print(vely_i, DEC);
dataFile.print("\t");
dataFile.print(velz_i, DEC);
/****************************************************/
imu::Vector<3> gyroscope = bno.getVector(Adafruit_BNO055::VECTOR_GYROSCOPE);
Serial.print("\t"); // print gyro data to serial (rad/s)
Serial.print(gyroscope.x(), DEC);
Serial.print("\t");
Serial.print(gyroscope.y(), DEC);
Serial.print("\t");
Serial.print(gyroscope.z(), DEC);
Serial.print("\t");
Serial.print(Time);
Serial.print("\t");
/*************************************************************/
dataFile.print("\t");
dataFile.print(gyroscope.x(), DEC);
dataFile.print("\t");
dataFile.print(gyroscope.y(), DEC);
dataFile.print("\t");
dataFile.print(gyroscope.z(), DEC);
dataFile.print("\t");
dataFile.print(Time);
dataFile.print("\t");
/************************************************************/
/* Display calibration status for each sensor. */
uint8_t system, gyro, accel, mag = 0;
bno.getCalibration(&system, &gyro, &accel, &mag);
Serial.print("CALIBRATION: Sys=");
Serial.print(system, DEC);
Serial.print(" Gyro=");
Serial.print(gyro, DEC);
Serial.print(" Accel=");
Serial.print(accel, DEC);
Serial.print(" Mag=");
Serial.println(mag, DEC);
/******************************************************/
dataFile.print("CALIBRATION: Sys=");
dataFile.print(system, DEC);
dataFile.print(" Gyro=");
dataFile.print(gyro, DEC);
dataFile.print(" Accel=");
dataFile.print(accel, DEC);
dataFile.print(" Mag=");
dataFile.print(mag, DEC);
dataFile.flush();
/***********************************************/
delay(SAMPLE_RATE_DELAY_MS);
Time = Time + 1; // add 1 second to time
}
}