Quad X Type Multicopter

Dependencies:   IAP

Revision:
0:cca1c4e84da4
Child:
2:59ac9df97701
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/I2cPeripherals/I2cPeripherals.cpp	Thu Jul 11 19:18:44 2013 +0000
@@ -0,0 +1,232 @@
+#include "mbed.h"
+#include "I2cPeripherals.h"
+
+I2cPeripherals::I2cPeripherals(PinName sda, PinName scl): _i2c(sda,scl)
+{   
+    _i2c.frequency(400000);
+    LCD_contrast = 60; 
+}
+
+void I2cPeripherals::start(char I2cAddr,int contrast)
+{
+    LCD_contrast = contrast;
+    start(I2cAddr);
+}
+
+void I2cPeripherals::start(char I2cAddr)
+{
+    char tx[2];
+
+    switch (I2cAddr)   {
+        case ST7032_ADDR:           //I2C LCD
+            LCD_addr = I2cAddr;
+            LCD_data = 0x40;
+            tx[0] = 0x00;
+            tx[1] = 0x38;
+            _i2c.write(I2cAddr,tx,2);
+            tx[1] = 0x39;
+            _i2c.write(I2cAddr,tx,2);
+            tx[1] = 0x1F;
+            _i2c.write(I2cAddr,tx,2);
+            tx[1] = 0x70 | (LCD_contrast & 0x0F);
+            _i2c.write(I2cAddr,tx,2);
+            tx[1] = 0x5C | ((LCD_contrast >> 4) & 0x03);
+            _i2c.write(I2cAddr,tx,2);
+            tx[1] = 0x6A;
+            _i2c.write(I2cAddr,tx,2);
+            wait(0.3);
+            tx[1] = 0x38;
+            _i2c.write(I2cAddr,tx,2); // function set
+            tx[1] = 0x0C;
+            _i2c.write(I2cAddr,tx,2); // Display On
+            break;
+        case ACM1602_ADDR:          //I2C LCD
+            LCD_addr = I2cAddr;
+            LCD_data = 0x80;
+            wait(0.015);
+            tx[0] = 0x00;
+            tx[1] = 0x01;
+            _i2c.write(I2cAddr,tx,2);
+            wait(0.005);
+            tx[1] = 0x38;
+            _i2c.write(I2cAddr,tx,2);
+            wait(0.005);
+            tx[1] = 0x0F;
+            _i2c.write(I2cAddr,tx,2);
+            wait(0.005);
+            tx[1] = 0x06;
+            _i2c.write(I2cAddr,tx,2);
+            wait(0.005);
+            break;
+
+        case ITG3200_ADDR0:     //gyro
+        case ITG3200_ADDR1:
+            Gyro_addr = I2cAddr;
+            Gyro_data = 0x1D;
+            tx[0] = 0x16;
+            tx[1] = 0x18;    // 0x1D
+            _i2c.write(I2cAddr,tx,2);
+            tx[0] = 0x3E;
+            tx[1] = 0x01;
+            _i2c.write(I2cAddr,tx,2);
+            wait_ms(100);
+            break;
+        
+        case L3GD20_ADDR0:      //gyro
+        case L3GD20_ADDR1:
+            Gyro_addr = I2cAddr;
+            Gyro_data = 0x28;
+            tx[0] = 0x20;
+            tx[1] = 0xFF;             
+            _i2c.write(I2cAddr,tx,2);
+            tx[0] = 0x21;
+            tx[1] = 0x09;             
+            _i2c.write(I2cAddr,tx,2);
+            tx[0] = 0x23;
+            tx[1] = 0xF0;             
+            _i2c.write(I2cAddr,tx,2);
+            break;
+        
+        case LDXL345_ADDR0:      //accelametor
+        case LDXL345_ADDR1:     
+            Accel_addr = I2cAddr;
+            Accel_data = 0x32;
+            tx[0] = 0x2D;
+            tx[1] = 0x00;             
+            _i2c.write(I2cAddr,tx,2);
+            tx[0] = 0x31;
+            tx[1] = 0x08;       //full range   08:2g 09:4g 0A:8g 0B:16g
+            _i2c.write(I2cAddr,tx,2);
+            tx[0] = 0x2C;
+            tx[1] = 0x0C;       //out rate  0xC:400Hz  0xD:800Hz                    
+            _i2c.write(I2cAddr,tx,2);
+            tx[0] = 0x2D;
+            tx[1] = 0x08;             
+            _i2c.write(I2cAddr,tx,2);
+            break;
+
+        case LPS331AP_ADDR0:        //barometor   
+        case LPS331AP_ADDR1:
+            barometor_addr = I2cAddr;
+            barometor_data = 0x2B;    
+            tx[0] = 0x10;    //RES_CNF
+            tx[1] = 0x19;
+            _i2c.write(I2cAddr,tx,2);
+            tx[0] = 0x20;    // CTL_REG1
+            tx[1] = 0x80;    // power on
+            _i2c.write(I2cAddr,tx,2);
+            tx[0]= 0x21;    // CTL_REG2
+            tx[1]= 0x01;    // one shot start
+            _i2c.write(I2cAddr,tx,2);
+            break;
+    }                    
+}
+
+int I2cPeripherals::_putc(int value) {
+    _i2c.start();
+    _i2c.write(LCD_addr);
+    _i2c.write(LCD_data);
+    _i2c.write(value);
+    _i2c.stop();
+    return value;
+}
+
+int I2cPeripherals::_getc() {
+    return -1;
+}
+
+void I2cPeripherals::cls()
+{
+    char tx[2] = { 0x00, 0x01 };
+    _i2c.write(LCD_addr,tx,2);
+}
+
+void I2cPeripherals::locate(int clm,int row)
+{
+    char tx[2];
+    
+    tx[0] = 0x00;
+    tx[1] = 0x80 + (row * 0x40) + clm;
+    _i2c.write(LCD_addr,tx,2);
+    
+}
+
+int I2cPeripherals::angular(int *x,int *y,int *z)
+{ 
+    char rx[6];
+    char tx[1];
+    tx[0] = Gyro_data | 0x80;
+    if ( _i2c.write(Gyro_addr,tx,1,true) != 0 )     {
+        x=y=z=0;
+        return false;
+    }
+    _i2c.read(Gyro_addr,rx,6);
+    *x = short(rx[0] << 8 | (uint8_t)rx[1]);  
+    *y = short(rx[2] << 8 | (uint8_t)rx[3]);
+    *z = short(rx[4] << 8 | (uint8_t)rx[5]);
+    return true;
+}
+int  I2cPeripherals::Acceleration(int *x,int *y,int *z)
+{
+   //AXDL345 Data Read
+    char rx[6];
+    char tx[1];
+    tx[0] = Accel_data | 0x80;
+    if ( _i2c.write(Accel_addr,tx,1,true) != 0 )     {
+        x=y=z=0;
+        return false;
+    }
+    _i2c.read(Accel_addr,rx,6);
+    *y = -short(rx[1] << 8 | (uint8_t)rx[0]);  
+    *x = short(rx[3] << 8 | (uint8_t)rx[2]);
+    *z = short(rx[5] << 8 | (uint8_t)rx[4]);
+    return true;
+}
+ 
+int  I2cPeripherals::pressure()
+{
+    char tx[2];
+    char rx[3];
+    int press;
+     
+    tx[0]= 0x21;
+    rx[0] = 0;
+    if ( _i2c.write(barometor_addr,tx,1,true) != 0 )
+        return 0;
+    _i2c.read (barometor_addr,rx,1);
+    while( rx[0]&0x01 )  {
+        wait(0.0001);
+        _i2c.write(barometor_addr,tx,1,true);
+        _i2c.read (barometor_addr,rx,1);
+    } 
+    
+    tx[0]= 0x28 | 0x80;
+    _i2c.write(barometor_addr,tx,1,true);
+    _i2c.read (barometor_addr,rx,3); 
+    
+    tx[0]= 0x21;    // CTL_REG2
+    tx[1]= 0x01;    // one shot start
+    _i2c.write(barometor_addr, tx, 2);
+
+    press =int( rx[2]<<16 | rx[1]<<8 | rx[0] );
+    return press;
+}
+
+
+//Update-Methode
+int I2cPeripherals::temperature()
+{
+    char tx[1];
+    char rx[2];
+    int temp;
+     
+    tx[0]= 0x2B | 0x80;
+    if ( _i2c.write(barometor_addr,tx,1,true) != 0 )
+        return 0;
+    _i2c.read (barometor_addr,rx,2); 
+    
+    temp = short(rx[1]<<8 | rx[0]);
+    return temp;
+};
+
+