syouichi imamori / Mbed OS MulticopterQuadX

Dependencies:   IAP

Revision:
2:59ac9df97701
Parent:
0:cca1c4e84da4
Child:
3:27407c4984cf
--- a/I2cPeripherals/I2cPeripherals.cpp	Tue Jul 16 06:37:28 2013 +0000
+++ b/I2cPeripherals/I2cPeripherals.cpp	Fri Nov 15 20:53:36 2013 +0000
@@ -1,128 +1,197 @@
 #include "mbed.h"
 #include "I2cPeripherals.h"
-
+//Serial pc(USBTX, USBRX);
 I2cPeripherals::I2cPeripherals(PinName sda, PinName scl): _i2c(sda,scl)
-{   
+{
+
     _i2c.frequency(400000);
-    LCD_contrast = 60; 
+//    LCD_contrast = 60;
+    wait(0.5);
+    LCD_addr = 0;
+    Gyro_addr = 0;
+    Accel_addr = 0;
+    barometor_addr = 0;
+    find();
+    start();
+
 }
 
-void I2cPeripherals::start(char I2cAddr,int contrast)
+void I2cPeripherals::start(int contrast)
 {
-    LCD_contrast = contrast;
-    start(I2cAddr);
+    char tx[2];
+//    find();             // I2C interface sensor detect
+#ifdef ST7032
+    LCD_addr = 0x7c;
+    LCD_data = 0x40;
+    tx[0] = 0x00;
+    tx[1] = 0x38;
+    if ( _i2c.write(LCD_addr,tx,2) == 0 )    {
+        tx[1] = 0x39;
+        _i2c.write(LCD_addr,tx,2);
+        tx[1] = 0x14;       //1F
+        _i2c.write(LCD_addr,tx,2);
+        tx[1] = 0x70 | (contrast & 0x0F);
+        _i2c.write(LCD_addr,tx,2);
+        tx[1] = 0x5C | ((contrast >> 4) & 0x03);
+        _i2c.write(LCD_addr,tx,2);
+        tx[1] = 0x6A;
+        _i2c.write(LCD_addr,tx,2);
+        wait(0.3);
+        tx[1] = 0x0C;
+        _i2c.write(LCD_addr,tx,2); // display on
+        tx[1] = 0x06;
+        _i2c.write(LCD_addr,tx,2); 
+ //       tx[0] = 0x40;
+//        tx[1] = '*';
+//        _i2c.write(LCD_addr,tx,2); // Display clear
+        return;
+    }
+#endif
+#ifdef ACM1602
+    LCD_addr = 0xA0;
+    LCD_data = 0x80;
+    tx[0] = 0x00;
+    tx[1] = 0x01;
+    if ( _i2c.write(LCD_addr,tx,2) == 0 )  {
+        wait(0.005);
+        tx[1] = 0x38;
+        _i2c.write(LCD_addr,tx,2);
+        wait(0.005);
+        tx[1] = 0x0F;
+        _i2c.write(LCD_addr,tx,2);
+        wait(0.005);
+        tx[1] = 0x06;
+        _i2c.write(LCD_addr,tx,2);
+        wait(0.005);
+        return;
+    }
+#endif
+    LCD_addr = 0;
 }
 
-void I2cPeripherals::start(char I2cAddr)
+void I2cPeripherals::find()
 {
     char tx[2];
+    char rx[1];
+    SensorInf sens[10] = { 0xD0,0x68,0x00,      //ITG3200
+                           0xD2,0x68,0x00,
+                           0xD0,0x68,0x75,     //MPU6050
+                           0xD2,0x68,0x75,
+                           0xD4,0xD4,0x0F,    //L3GD20
+                           0xD6,0xD4,0x0F,
+                           0xA6,0xE5,0x00,     //ADXL345
+                           0x3A,0xE5,0x00,
+                           0xB8,0xBB,0x0F,     //LPS331
+                           0xBA,0xBB,0x0F
+                         };
 
-    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;
+    for ( int num = 0; num < 10; num++ )    {
+        tx[0]= sens[num].whoaddr;
+        if ( _i2c.write(sens[num].addr,tx,1,true) != 0 ) continue;
+        _i2c.read (sens[num].addr,rx,1);
+        if ( (rx[0]&0x7E) != (sens[num].who&0x7E) ) continue;
 
-        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;
-    }                    
+        switch ( num )   {
+#ifdef ITG3200
+            case 0:     //ITG3200
+            case 1:
+                Gyro_addr = sens[num].addr;
+                Gyro_data = 0x1D;
+                tx[0] = 0x16;
+                tx[1] = 0x18;    // 0x1D
+                _i2c.write(sens[num].addr,tx,2);
+                tx[0] = 0x3E;
+                tx[1] = 0x01;
+                _i2c.write(sens[num].addr,tx,2);
+                wait_ms(10);
+                break;
+#endif
+#ifdef MPU6050
+            case 2:     //MPU6050
+            case 3:
+                Gyro_addr = sens[num].addr;
+                Gyro_data = 0x43;
+                Accel_addr = sens[num].addr;
+                Accel_data = 0x3B;
+                tx[0] = 0x6B;
+                tx[1] = 0x00;       // PWR on
+                _i2c.write(sens[num].addr,tx,2);
+                tx[0] = 0x1A;       // DLPF(Digitel low pass filter)
+                tx[1] = 0x02;       // set 0 to 7
+                _i2c.write(sens[num].addr,tx,2);
+                wait(0.01);
+                tx[0] = 0x1B;
+                tx[1] = 0x18;       // +-2000deg
+                _i2c.write(sens[num].addr,tx,2);
+                wait(0.01);
+                tx[0] = 0x1C;
+                tx[1] = 0x18;       // +-16g
+                _i2c.write(sens[num].addr,tx,2);
+                wait_ms(10);
+                break;
+#endif
+#ifdef L3GD20
+            case 4:     //L3GD20
+            case 5:
+                Gyro_addr = sens[num].addr;
+                Gyro_data = 0x28;
+                tx[0] = 0x20;
+                tx[1] = 0xBF;               //rate 400Hz 0x8F-0xBF
+                _i2c.write(sens[num].addr,tx,2);
+                tx[0] = 0x21;
+                tx[1] = 0x09;
+                _i2c.write(sens[num].addr,tx,2);
+                tx[0] = 0x23;
+                tx[1] = 0xF0;
+                _i2c.write(sens[num].addr,tx,2);
+                tx[0] = 0x24;
+                tx[1] = 0x10;
+                _i2c.write(sens[num].addr,tx,2);
+                break;
+#endif
+#ifdef ADXL345
+            case 6:      //ADXL345
+            case 7:
+                Accel_addr = sens[num].addr;
+                Accel_data = 0x32;
+                tx[0] = 0x2D;
+                tx[1] = 0x00;
+                _i2c.write(sens[num].addr,tx,2);
+                tx[0] = 0x31;
+                tx[1] = 0x0B;       //full range   08:2g 09:4g 0A:8g 0B:16g
+                _i2c.write(sens[num].addr,tx,2);
+                tx[0] = 0x2C;
+                tx[1] = 0x09;       //out rate  0xC:400Hz  0xD:800Hz
+                _i2c.write(sens[num].addr,tx,2);
+                tx[0] = 0x2D;
+                tx[1] = 0x08;
+                _i2c.write(sens[num].addr,tx,2);
+                break;
+#endif
+#ifdef LPS331AP
+            case 8:        //barometor
+            case 9:
+                barometor_addr = sens[num].addr;
+                barometor_data = 0x2B;
+                tx[0] = 0x10;    //RES_CNF
+                tx[1] = 0x7A;
+                _i2c.write(sens[num].addr,tx,2);
+                tx[0] = 0x20;    // CTL_REG1
+                tx[1] = 0xB0;    // power on
+                _i2c.write(sens[num].addr,tx,2);
+//            tx[0]= 0x21;    // CTL_REG2
+//            tx[1]= 0x01;    // one shot start
+//            _i2c.write(sens[num].addr,tx,2);
+                wait(1);
+                break;
+#endif
+        }
+    }
 }
 
-int I2cPeripherals::_putc(int value) {
+int I2cPeripherals::_putc(int value)
+{
+    if ( LCD_addr == 0 ) return value;
     _i2c.start();
     _i2c.write(LCD_addr);
     _i2c.write(LCD_data);
@@ -131,12 +200,32 @@
     return value;
 }
 
-int I2cPeripherals::_getc() {
+int I2cPeripherals::_getc()
+{
     return -1;
 }
 
+void I2cPeripherals::write_reg(char I2cAddr,char reg_addr,char* data,int len)
+{
+    char tx[17];
+    if ( len >16 ) len = 16;
+    tx[0] = reg_addr;
+    if ( len > 1 ) tx[0] |= 0x80;
+    for (int i=0; i<len; i++) tx[i+1] = data[i];
+    _i2c.write(I2cAddr,tx,len+1);
+}
+
+void I2cPeripherals::read_reg(char I2cAddr,char reg_addr,char* data,int len)
+{
+    char tx[1];
+    tx[0] = reg_addr | 0x80;
+    _i2c.write(I2cAddr,tx,1,true);
+    _i2c.read(I2cAddr,data,len);
+}
+
 void I2cPeripherals::cls()
 {
+    if ( LCD_addr == 0 ) return;
     char tx[2] = { 0x00, 0x01 };
     _i2c.write(LCD_addr,tx,2);
 }
@@ -144,89 +233,130 @@
 void I2cPeripherals::locate(int clm,int row)
 {
     char tx[2];
-    
+
+    if ( LCD_addr == 0 ) return;
     tx[0] = 0x00;
     tx[1] = 0x80 + (row * 0x40) + clm;
     _i2c.write(LCD_addr,tx,2);
-    
+
 }
 
-int I2cPeripherals::angular(int *x,int *y,int *z)
-{ 
+int I2cPeripherals::angular(float *x,float *y,float *z)
+{
     char rx[6];
     char tx[1];
+    float i = 0;
     tx[0] = Gyro_data | 0x80;
     if ( _i2c.write(Gyro_addr,tx,1,true) != 0 )     {
-        x=y=z=0;
-        return false;
+        *x=*y=*z=0;
+        return Gyro_addr;
+    }
+    switch ( Gyro_addr )    {
+        case 0xD0:
+        case 0xD2:
+            i = 0.06098;
+            break;
+        case 0xD4:
+        case 0xD6:
+            i = 0.06957;
     }
     _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]);
+    *x = ( short(rx[0] << 8 | (uint8_t)rx[1]) ) * i;
+    *y = ( short(rx[2] << 8 | (uint8_t)rx[3]) ) * i;
+    *z = ( short(rx[4] << 8 | (uint8_t)rx[5]) ) * i;
     return true;
 }
-int  I2cPeripherals::Acceleration(int *x,int *y,int *z)
+
+int  I2cPeripherals::Acceleration(float *x,float *y,float *z)
 {
-   //AXDL345 Data Read
+    //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;
+        *x=*y=0;
+        *z=9.8;
         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]);
+    switch ( Accel_addr )   {
+        case 0xD0:
+        case 0xD2:
+#ifdef MPU6050
+            *y = ( -(short(rx[0] << 8 | (uint8_t)rx[1])) ) * 0.0048;
+            *x = ( short(rx[2] << 8 | (uint8_t)rx[3]) ) * 0.0048;
+            *z = ( short(rx[4] << 8 | (uint8_t)rx[5]) ) * 0.0048;
+#endif
+            break;
+        case 0xA6:
+        case 0x3A:
+#ifdef ADXL345
+            *y = ( -(short(rx[1] << 8 | (uint8_t)rx[0])) ) * 0.04;
+            *x = ( short(rx[3] << 8 | (uint8_t)rx[2]) ) * 0.04;
+            *z = ( short(rx[5] << 8 | (uint8_t)rx[4]) ) * 0.04;
+#endif
+    }
     return true;
 }
- 
+
 int  I2cPeripherals::pressure()
 {
     char tx[2];
     char rx[3];
-    int press;
-     
-    tx[0]= 0x21;
-    rx[0] = 0;
+    int press = 0;
+
+    tx[0]= 0x28 | 0x80;
     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);
-
+    _i2c.read (barometor_addr,rx,3);
     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); 
-    
+    _i2c.read (barometor_addr,rx,2);
+
     temp = short(rx[1]<<8 | rx[0]);
     return temp;
-};
+}
+
+void I2cPeripherals::i2c_write(int i2caddr,char* tx,int len)
+{
+    char rx[1];
+    rx[0] = 0;
+    while( 1 )  {
+        _i2c.write(i2caddr,tx,len);
+        _i2c.write(i2caddr,tx,1,true);
+        _i2c.read (i2caddr,rx,1);
+        if ( tx[1] == rx[0] ) return;
+    }
+}
+
+int I2cPeripherals::GetAddr(int type)   
+{
+    switch ( type ) {
+    case GYRO_ADDR:
+        return Gyro_addr;
+    case ACCEL_ADDR:
+        return Accel_addr;
+    case LCD_ADDR:
+        return LCD_addr;
+    case BARO_ADDR:
+        return barometor_addr;
+    }
+    return 0;        
+}
+;
 
 
+
+
+