Unit testing and development for 9DOF sparkfun sensor stick

Dependencies:   ADXL345 HMC5883L ITG3200 mbed

Committer:
tylerjw
Date:
Tue Nov 06 19:06:58 2012 +0000
Revision:
4:8a77e21d08f1
Parent:
3:5e21a352e236
Child:
5:63b115f85aa7
sample time test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tylerjw 0:ac2f55940442 1 /**
tylerjw 2:d7e66940541d 2 9-dof unit testing
tylerjw 0:ac2f55940442 3
tylerjw 0:ac2f55940442 4 The purpose of this program is to demonstrate and calibrate the three
tylerjw 0:ac2f55940442 5 sensors on teh 9-doft board.
tylerjw 0:ac2f55940442 6
tylerjw 0:ac2f55940442 7 The first version of this software will test the ITG3200 gyro to find
tylerjw 0:ac2f55940442 8 the temperature drift line. Data will be logged to help determine the
tylerjw 0:ac2f55940442 9 thermal drift line.
tylerjw 0:ac2f55940442 10 See: http://mbed.org/users/gltest26/code/ITG3200/wiki/Thermal-Drift
tylerjw 1:dc730a26cdc2 11
tylerjw 1:dc730a26cdc2 12 The second versoin of this will test the HMC5883L 3 axis magnometer
tylerjw 2:d7e66940541d 13
tylerjw 2:d7e66940541d 14 The thrid version tests the ADXL345 library.
tylerjw 0:ac2f55940442 15 */
tylerjw 0:ac2f55940442 16
tylerjw 0:ac2f55940442 17 #include "mbed.h"
tylerjw 4:8a77e21d08f1 18 #include "ITG3200.h"
tylerjw 4:8a77e21d08f1 19 #include "HMC5883L.h"
tylerjw 4:8a77e21d08f1 20 #include "ADXL345.h"
tylerjw 4:8a77e21d08f1 21 //#include "adxl345unit.h"
tylerjw 1:dc730a26cdc2 22
tylerjw 2:d7e66940541d 23 I2C i2c_bus(p28, p27);
tylerjw 3:5e21a352e236 24 ADXL345 accel(i2c_bus);
tylerjw 4:8a77e21d08f1 25 HMC5883L magno(i2c_bus);
tylerjw 4:8a77e21d08f1 26 ITG3200 gyro(i2c_bus);
tylerjw 3:5e21a352e236 27 Timer t;
tylerjw 3:5e21a352e236 28 Serial pc(USBTX, USBRX);
tylerjw 3:5e21a352e236 29 //ADXL345UNIT accel_test(i2c_bus, t);
tylerjw 0:ac2f55940442 30
tylerjw 4:8a77e21d08f1 31 void sample_time_test();
tylerjw 4:8a77e21d08f1 32
tylerjw 0:ac2f55940442 33 int main()
tylerjw 0:ac2f55940442 34 {
tylerjw 4:8a77e21d08f1 35 sample_time_test();
tylerjw 4:8a77e21d08f1 36 }
tylerjw 4:8a77e21d08f1 37
tylerjw 4:8a77e21d08f1 38 void sample_time_test()
tylerjw 4:8a77e21d08f1 39 {
tylerjw 4:8a77e21d08f1 40 int16_t accel_sample[3];
tylerjw 4:8a77e21d08f1 41 int16_t magno_sample[3];
tylerjw 4:8a77e21d08f1 42 int16_t gyro_sample[3];
tylerjw 4:8a77e21d08f1 43 double temperature;
tylerjw 4:8a77e21d08f1 44 double heading_rad, heading_deg;
tylerjw 4:8a77e21d08f1 45 wait(0.5); // enough time for everything to prepare a sample
tylerjw 3:5e21a352e236 46 t.start();
tylerjw 4:8a77e21d08f1 47 double accel_time, magno_time, gyro_time, temp_time, head_rad_time, head_deg_time;
tylerjw 3:5e21a352e236 48 pc.baud(9600);
tylerjw 4:8a77e21d08f1 49
tylerjw 4:8a77e21d08f1 50 pc.printf("accel,magno,gyro,temp,head_rad,head_deg\r\n");
tylerjw 4:8a77e21d08f1 51 for(int i = 0; i < 100; i++)
tylerjw 4:8a77e21d08f1 52 {
tylerjw 4:8a77e21d08f1 53 t.reset();
tylerjw 4:8a77e21d08f1 54 accel.getXYZ(accel_sample);
tylerjw 4:8a77e21d08f1 55 accel_time = t.read();
tylerjw 4:8a77e21d08f1 56 magno.getXYZ(magno_sample);
tylerjw 4:8a77e21d08f1 57 magno_time = t.read();
tylerjw 4:8a77e21d08f1 58 gyro.getXYZ(gyro_sample, ITG3200::Calibration);
tylerjw 4:8a77e21d08f1 59 gyro_time = t.read();
tylerjw 4:8a77e21d08f1 60 temperature = gyro.getTemperature();
tylerjw 4:8a77e21d08f1 61 temp_time = t.read();
tylerjw 4:8a77e21d08f1 62 heading_rad = magno.getHeadingXY();
tylerjw 4:8a77e21d08f1 63 head_rad_time = t.read();
tylerjw 4:8a77e21d08f1 64 heading_deg = magno.getHeadingXYDeg();
tylerjw 4:8a77e21d08f1 65 head_deg_time = t.read();
tylerjw 4:8a77e21d08f1 66
tylerjw 4:8a77e21d08f1 67 pc.printf("%f,%f,%f,%f,%f,%f\r\n",accel_time,magno_time,gyro_time,temp_time,head_rad_time,head_deg_time);
tylerjw 4:8a77e21d08f1 68
tylerjw 4:8a77e21d08f1 69 wait(0.2 - t.read());
tylerjw 4:8a77e21d08f1 70 }
tylerjw 4:8a77e21d08f1 71 }
tylerjw 4:8a77e21d08f1 72
tylerjw 4:8a77e21d08f1 73 void ADXL345_test()
tylerjw 4:8a77e21d08f1 74 {
tylerjw 4:8a77e21d08f1 75 int16_t sample[3];
tylerjw 3:5e21a352e236 76 float elapsed_time;
tylerjw 3:5e21a352e236 77 float time_stamp[100];
tylerjw 4:8a77e21d08f1 78 int16_t samples[100][3];
tylerjw 2:d7e66940541d 79
tylerjw 3:5e21a352e236 80 Timer t;
tylerjw 3:5e21a352e236 81 Serial pc(USBTX, USBRX);
tylerjw 3:5e21a352e236 82 pc.baud(9600);
tylerjw 3:5e21a352e236 83
tylerjw 3:5e21a352e236 84 accel.setDataRate(ADXL345_100HZ); // 100Hz data rate
tylerjw 3:5e21a352e236 85 accel.setDataFormatControl(ADXL345_16G | ADXL345_FULL_RES);
tylerjw 3:5e21a352e236 86 accel.setPowerControl(0x08); // start measurement
tylerjw 3:5e21a352e236 87
tylerjw 3:5e21a352e236 88 wait(0.001);
tylerjw 3:5e21a352e236 89
tylerjw 3:5e21a352e236 90 t.start();
tylerjw 4:8a77e21d08f1 91 accel.getXYZ(sample);
tylerjw 3:5e21a352e236 92 elapsed_time = t.read();
tylerjw 3:5e21a352e236 93
tylerjw 3:5e21a352e236 94 pc.printf("Sample took %f seconds.\r\n", elapsed_time);
tylerjw 3:5e21a352e236 95 pc.printf("x: %d, y: %d, z: %d\r\n", sample[0],sample[1],sample[2]);
tylerjw 3:5e21a352e236 96
tylerjw 3:5e21a352e236 97 for(int i = 0; i < 100; i++) {
tylerjw 3:5e21a352e236 98 t.reset();
tylerjw 4:8a77e21d08f1 99 accel.getXYZ(samples[i]);
tylerjw 3:5e21a352e236 100 time_stamp[i] = t.read();
tylerjw 3:5e21a352e236 101 }
tylerjw 3:5e21a352e236 102 for(int i = 0; i < 100; i++) {
tylerjw 3:5e21a352e236 103 pc.printf("Sample took %f seconds.\r\n", time_stamp[i]);
tylerjw 3:5e21a352e236 104 pc.printf("x: %d, y: %d, z: %d\r\n", samples[i][0],samples[i][1],samples[i][2]);
tylerjw 3:5e21a352e236 105 }
tylerjw 2:d7e66940541d 106 }
tylerjw 2:d7e66940541d 107
tylerjw 2:d7e66940541d 108 void hmc5883l_test()
tylerjw 2:d7e66940541d 109 {
tylerjw 1:dc730a26cdc2 110 Serial pc(USBTX, USBRX);
tylerjw 2:d7e66940541d 111
tylerjw 1:dc730a26cdc2 112 pc.baud(9600);
tylerjw 3:5e21a352e236 113
tylerjw 2:d7e66940541d 114 HMC5883L compass(i2c_bus);
tylerjw 2:d7e66940541d 115
tylerjw 4:8a77e21d08f1 116 int16_t data[3];
tylerjw 2:d7e66940541d 117
tylerjw 2:d7e66940541d 118 while(1) {
tylerjw 2:d7e66940541d 119 compass.getXYZ(data);
tylerjw 2:d7e66940541d 120 pc.printf("x: %4d, y: %4d, z: %4d\r\n", data[0], data[1], data[2]);
tylerjw 1:dc730a26cdc2 121 wait(0.067);
tylerjw 1:dc730a26cdc2 122 }
tylerjw 1:dc730a26cdc2 123 }
tylerjw 4:8a77e21d08f1 124
tylerjw 4:8a77e21d08f1 125 void itg3200_curve_test()
tylerjw 1:dc730a26cdc2 126 {
tylerjw 1:dc730a26cdc2 127 DigitalOut myled(LED1);
tylerjw 0:ac2f55940442 128 LocalFileSystem local("local"); // Create the local filesystem under the name "local"
tylerjw 0:ac2f55940442 129 ITG3200 gyro(p28, p27); // sda, scl - gyro
tylerjw 1:dc730a26cdc2 130 const float offset[3] = {99.5, -45.0, -29.7}; // taken from itg3200.xls curve fit test
tylerjw 1:dc730a26cdc2 131 const float slope[3] = {-1.05, 0.95, 0.47};
tylerjw 1:dc730a26cdc2 132
tylerjw 1:dc730a26cdc2 133 gyro.setCalibrationCurve(offset, slope);
tylerjw 1:dc730a26cdc2 134 gyro.setLpBandwidth(LPFBW_5HZ); // lowest rate low-pass filter
tylerjw 1:dc730a26cdc2 135
tylerjw 0:ac2f55940442 136 Serial pc(USBTX, USBRX);
tylerjw 0:ac2f55940442 137
tylerjw 0:ac2f55940442 138 pc.baud(9600);
tylerjw 0:ac2f55940442 139
tylerjw 0:ac2f55940442 140 myled = 0;
tylerjw 0:ac2f55940442 141 FILE *fp = fopen("/local/itg3200.csv", "w"); // Open "itg3200.csv" for writing
tylerjw 0:ac2f55940442 142 fputs("Temp, X, Y, Z\r\n", fp); // place the header at the top
tylerjw 0:ac2f55940442 143
tylerjw 0:ac2f55940442 144 float temperature = 0.0;
tylerjw 4:8a77e21d08f1 145 int16_t gyro_readings[3];
tylerjw 0:ac2f55940442 146
tylerjw 0:ac2f55940442 147 for(int i = 0; i < 120; i++) { // 120 seconds - 600 samples
tylerjw 0:ac2f55940442 148 myled = 1;
tylerjw 1:dc730a26cdc2 149 //gyro.calibrate(1.0);
tylerjw 1:dc730a26cdc2 150 wait(0.5);
tylerjw 0:ac2f55940442 151 myled = 0;
tylerjw 4:8a77e21d08f1 152 gyro.getXYZ(gyro_readings, ITG3200::Calibration);
tylerjw 1:dc730a26cdc2 153 //gyro.getOffset(gyro_readings);
tylerjw 0:ac2f55940442 154 temperature = gyro.getTemperature();
tylerjw 0:ac2f55940442 155 pc.printf("%3d,%f,%d,%d,%d\r\n",i,temperature,gyro_readings[0],gyro_readings[1],gyro_readings[2]);
tylerjw 0:ac2f55940442 156 fprintf(fp, "%f,%d,%d,%d\r\n",temperature,gyro_readings[0],gyro_readings[1],gyro_readings[2]);
tylerjw 0:ac2f55940442 157 }
tylerjw 0:ac2f55940442 158 fclose(fp);
tylerjw 0:ac2f55940442 159 myled = 0;
tylerjw 0:ac2f55940442 160 }