algoritmo logica difusa sensores navegacion

Dependencies:   GPS MODI2C SRF05 mbed HMC5883

Committer:
arturocontreras
Date:
Sat Jul 19 05:35:58 2014 +0000
Revision:
0:1c15748ff0e1
logica difusa

Who changed what in which revision?

UserRevisionLine numberNew contents of line
arturocontreras 0:1c15748ff0e1 1 #include "ADXL345.h"
arturocontreras 0:1c15748ff0e1 2
arturocontreras 0:1c15748ff0e1 3 ADXL345::ADXL345(PinName sda, PinName scl) : I2C_Sensor(sda, scl, ADXL345_I2C_ADDRESS)
arturocontreras 0:1c15748ff0e1 4 {
arturocontreras 0:1c15748ff0e1 5 // Set Offset - programmed into the OFSX, OFSY, and OFXZ registers, respectively, as 0xFD, 0x03 and 0xFE.
arturocontreras 0:1c15748ff0e1 6 writeRegister(ADXL345_OFSX_REG, 0xFA); // to get these offsets just lie your sensor down on the table always the axis pointing down to earth has 200+ and the others should have more or less 0
arturocontreras 0:1c15748ff0e1 7 writeRegister(ADXL345_OFSY_REG, 0xFE);
arturocontreras 0:1c15748ff0e1 8 writeRegister(ADXL345_OFSZ_REG, 0x0A);
arturocontreras 0:1c15748ff0e1 9
arturocontreras 0:1c15748ff0e1 10 writeRegister(ADXL345_BW_RATE_REG, 0x0F); // 3200Hz BW-Rate
arturocontreras 0:1c15748ff0e1 11 writeRegister(ADXL345_DATA_FORMAT_REG, 0x0B); // set data format to full resolution and +-16g
arturocontreras 0:1c15748ff0e1 12 writeRegister(ADXL345_POWER_CTL_REG, 0x08); // set mode
arturocontreras 0:1c15748ff0e1 13 }
arturocontreras 0:1c15748ff0e1 14
arturocontreras 0:1c15748ff0e1 15 void ADXL345::read(){
arturocontreras 0:1c15748ff0e1 16 readraw();
arturocontreras 0:1c15748ff0e1 17 for (int i = 0; i < 3; i++)
arturocontreras 0:1c15748ff0e1 18 data[i] = raw[i] - offset[i]; // TODO: didnt care about units
arturocontreras 0:1c15748ff0e1 19 }
arturocontreras 0:1c15748ff0e1 20
arturocontreras 0:1c15748ff0e1 21 void ADXL345::readraw(){
arturocontreras 0:1c15748ff0e1 22 char buffer[6];
arturocontreras 0:1c15748ff0e1 23 readMultiRegister(ADXL345_DATAX0_REG, buffer, 6);
arturocontreras 0:1c15748ff0e1 24
arturocontreras 0:1c15748ff0e1 25 raw[0] = (short) ((int)buffer[1] << 8 | (int)buffer[0]);
arturocontreras 0:1c15748ff0e1 26 raw[1] = (short) ((int)buffer[3] << 8 | (int)buffer[2]);
arturocontreras 0:1c15748ff0e1 27 raw[2] = (short) ((int)buffer[5] << 8 | (int)buffer[4]);
arturocontreras 0:1c15748ff0e1 28 }
arturocontreras 0:1c15748ff0e1 29
arturocontreras 0:1c15748ff0e1 30 void ADXL345::calibrate(int times, float separation_time)
arturocontreras 0:1c15748ff0e1 31 {
arturocontreras 0:1c15748ff0e1 32 // calibrate sensor with an average of count samples (result of calibration stored in offset[])
arturocontreras 0:1c15748ff0e1 33 float calib[3] = {0,0,0}; // temporary array for the sum of calibration measurement
arturocontreras 0:1c15748ff0e1 34
arturocontreras 0:1c15748ff0e1 35 for (int i = 0; i < times; i++) { // read 'times' times the data in a very short time
arturocontreras 0:1c15748ff0e1 36 readraw();
arturocontreras 0:1c15748ff0e1 37 for (int j = 0; j < 3; j++)
arturocontreras 0:1c15748ff0e1 38 calib[j] += raw[j];
arturocontreras 0:1c15748ff0e1 39 wait(separation_time);
arturocontreras 0:1c15748ff0e1 40 }
arturocontreras 0:1c15748ff0e1 41
arturocontreras 0:1c15748ff0e1 42 for (int i = 0; i < 2; i++)
arturocontreras 0:1c15748ff0e1 43 offset[i] = calib[i]/times; // take the average of the calibration measurements
arturocontreras 0:1c15748ff0e1 44 }