NOT FINISHED YET!!! My first try to get a self built fully working Quadrocopter based on an mbed, a self built frame and some other more or less cheap parts.

Dependencies:   mbed MODI2C

Committer:
maetugr
Date:
Wed Oct 31 14:44:07 2012 +0000
Revision:
16:74a6531350b5
Parent:
15:753c5d6a63b3
Child:
17:e096e85f6c36
nach Kompassumstellung auf I2C_Sensor (nicht getestet)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maetugr 14:cf260677ecde 1 #include "mbed.h"
maetugr 14:cf260677ecde 2 #include "I2C_Sensor.h"
maetugr 14:cf260677ecde 3
maetugr 14:cf260677ecde 4 // calculate the 8-Bit write/read I2C-Address from the 7-Bit adress of the device
maetugr 14:cf260677ecde 5 #define GET_I2C_WRITE_ADDRESS(ADR) (ADR << 1&0xFE) // ADR & 1111 1110
maetugr 14:cf260677ecde 6 #define GET_I2C_READ_ADDRESS(ADR) (ADR << 1|0x01) // ADR | 0000 0001
maetugr 14:cf260677ecde 7
maetugr 14:cf260677ecde 8 I2C_Sensor::I2C_Sensor(PinName sda, PinName scl, int8_t i2c_address) : i2c(sda, scl), local("local")
maetugr 14:cf260677ecde 9 {
maetugr 14:cf260677ecde 10 I2C_Sensor::i2c_address = i2c_address;
maetugr 14:cf260677ecde 11 //i2c.frequency(400000); // standard speed
maetugr 14:cf260677ecde 12 i2c.frequency(1500000); // ultrafast!
maetugr 14:cf260677ecde 13 }
maetugr 14:cf260677ecde 14
maetugr 15:753c5d6a63b3 15 void I2C_Sensor::saveCalibrationValues(float values[], int size, char * filename)
maetugr 14:cf260677ecde 16 {
maetugr 14:cf260677ecde 17 FILE *fp = fopen(strcat("/local/", filename), "w");
maetugr 14:cf260677ecde 18 for(int i = 0; i < size; i++)
maetugr 14:cf260677ecde 19 fprintf(fp, "%f\r\n", values[i]);
maetugr 14:cf260677ecde 20 fclose(fp);
maetugr 14:cf260677ecde 21 }
maetugr 14:cf260677ecde 22
maetugr 15:753c5d6a63b3 23 void I2C_Sensor::loadCalibrationValues(float values[], int size, char * filename)
maetugr 14:cf260677ecde 24 {
maetugr 14:cf260677ecde 25 FILE *fp = fopen(strcat("/local/", filename), "r");
maetugr 14:cf260677ecde 26 for(int i = 0; i < size; i++)
maetugr 14:cf260677ecde 27 fscanf(fp, "%f", &values[i]);
maetugr 14:cf260677ecde 28 fclose(fp);
maetugr 14:cf260677ecde 29 }
maetugr 14:cf260677ecde 30
maetugr 16:74a6531350b5 31 //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
maetugr 16:74a6531350b5 32 // ATTENTION!!! the I2C option "repeated" = true is important because otherwise interrupts while bus communications cause crashes (see http://www.i2c-bus.org/repeated-start-condition/)
maetugr 16:74a6531350b5 33 //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
maetugr 16:74a6531350b5 34
maetugr 15:753c5d6a63b3 35 char I2C_Sensor::readRegister(char reg)
maetugr 15:753c5d6a63b3 36 {
maetugr 15:753c5d6a63b3 37 char value = 0;
maetugr 15:753c5d6a63b3 38
maetugr 16:74a6531350b5 39 i2c.write(GET_I2C_WRITE_ADDRESS(i2c_address), &reg, 1, true);
maetugr 16:74a6531350b5 40 i2c.read(GET_I2C_READ_ADDRESS(i2c_address), &value, 1, true);
maetugr 15:753c5d6a63b3 41
maetugr 15:753c5d6a63b3 42 return value;
maetugr 14:cf260677ecde 43 }
maetugr 14:cf260677ecde 44
maetugr 15:753c5d6a63b3 45 void I2C_Sensor::writeRegister(char reg, char data)
maetugr 15:753c5d6a63b3 46 {
maetugr 16:74a6531350b5 47 char buffer[2] = {reg, data};
maetugr 16:74a6531350b5 48 i2c.write(GET_I2C_WRITE_ADDRESS(i2c_address), buffer, 2, true);
maetugr 15:753c5d6a63b3 49 }
maetugr 15:753c5d6a63b3 50
maetugr 15:753c5d6a63b3 51 void I2C_Sensor::readMultiRegister(char reg, char* output, int size)
maetugr 16:74a6531350b5 52 {
maetugr 16:74a6531350b5 53 i2c.write (GET_I2C_WRITE_ADDRESS(i2c_address), &reg, 1, true); // tell register address of the MSB get the sensor to do slave-transmit subaddress updating.
maetugr 16:74a6531350b5 54 i2c.read (GET_I2C_READ_ADDRESS(i2c_address), output, size, true); // tell it where to store the data read
maetugr 14:cf260677ecde 55 }