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:
Mon Jun 10 13:22:46 2013 +0000
Revision:
34:3aa1cbcde59d
Child:
36:128c55793728
First version with new ESCs (they are working with the KK Board); some strange kicks in the behaviour of balancing, next step a logger

Who changed what in which revision?

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