syouichi imamori / Mbed OS MulticopterQuadX

Dependencies:   IAP

Committer:
komaida424
Date:
Thu Jul 11 19:18:44 2013 +0000
Revision:
0:cca1c4e84da4
Child:
2:59ac9df97701
version1.03

Who changed what in which revision?

UserRevisionLine numberNew contents of line
komaida424 0:cca1c4e84da4 1 #include "mbed.h"
komaida424 0:cca1c4e84da4 2 #include "I2cPeripherals.h"
komaida424 0:cca1c4e84da4 3
komaida424 0:cca1c4e84da4 4 I2cPeripherals::I2cPeripherals(PinName sda, PinName scl): _i2c(sda,scl)
komaida424 0:cca1c4e84da4 5 {
komaida424 0:cca1c4e84da4 6 _i2c.frequency(400000);
komaida424 0:cca1c4e84da4 7 LCD_contrast = 60;
komaida424 0:cca1c4e84da4 8 }
komaida424 0:cca1c4e84da4 9
komaida424 0:cca1c4e84da4 10 void I2cPeripherals::start(char I2cAddr,int contrast)
komaida424 0:cca1c4e84da4 11 {
komaida424 0:cca1c4e84da4 12 LCD_contrast = contrast;
komaida424 0:cca1c4e84da4 13 start(I2cAddr);
komaida424 0:cca1c4e84da4 14 }
komaida424 0:cca1c4e84da4 15
komaida424 0:cca1c4e84da4 16 void I2cPeripherals::start(char I2cAddr)
komaida424 0:cca1c4e84da4 17 {
komaida424 0:cca1c4e84da4 18 char tx[2];
komaida424 0:cca1c4e84da4 19
komaida424 0:cca1c4e84da4 20 switch (I2cAddr) {
komaida424 0:cca1c4e84da4 21 case ST7032_ADDR: //I2C LCD
komaida424 0:cca1c4e84da4 22 LCD_addr = I2cAddr;
komaida424 0:cca1c4e84da4 23 LCD_data = 0x40;
komaida424 0:cca1c4e84da4 24 tx[0] = 0x00;
komaida424 0:cca1c4e84da4 25 tx[1] = 0x38;
komaida424 0:cca1c4e84da4 26 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 27 tx[1] = 0x39;
komaida424 0:cca1c4e84da4 28 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 29 tx[1] = 0x1F;
komaida424 0:cca1c4e84da4 30 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 31 tx[1] = 0x70 | (LCD_contrast & 0x0F);
komaida424 0:cca1c4e84da4 32 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 33 tx[1] = 0x5C | ((LCD_contrast >> 4) & 0x03);
komaida424 0:cca1c4e84da4 34 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 35 tx[1] = 0x6A;
komaida424 0:cca1c4e84da4 36 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 37 wait(0.3);
komaida424 0:cca1c4e84da4 38 tx[1] = 0x38;
komaida424 0:cca1c4e84da4 39 _i2c.write(I2cAddr,tx,2); // function set
komaida424 0:cca1c4e84da4 40 tx[1] = 0x0C;
komaida424 0:cca1c4e84da4 41 _i2c.write(I2cAddr,tx,2); // Display On
komaida424 0:cca1c4e84da4 42 break;
komaida424 0:cca1c4e84da4 43 case ACM1602_ADDR: //I2C LCD
komaida424 0:cca1c4e84da4 44 LCD_addr = I2cAddr;
komaida424 0:cca1c4e84da4 45 LCD_data = 0x80;
komaida424 0:cca1c4e84da4 46 wait(0.015);
komaida424 0:cca1c4e84da4 47 tx[0] = 0x00;
komaida424 0:cca1c4e84da4 48 tx[1] = 0x01;
komaida424 0:cca1c4e84da4 49 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 50 wait(0.005);
komaida424 0:cca1c4e84da4 51 tx[1] = 0x38;
komaida424 0:cca1c4e84da4 52 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 53 wait(0.005);
komaida424 0:cca1c4e84da4 54 tx[1] = 0x0F;
komaida424 0:cca1c4e84da4 55 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 56 wait(0.005);
komaida424 0:cca1c4e84da4 57 tx[1] = 0x06;
komaida424 0:cca1c4e84da4 58 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 59 wait(0.005);
komaida424 0:cca1c4e84da4 60 break;
komaida424 0:cca1c4e84da4 61
komaida424 0:cca1c4e84da4 62 case ITG3200_ADDR0: //gyro
komaida424 0:cca1c4e84da4 63 case ITG3200_ADDR1:
komaida424 0:cca1c4e84da4 64 Gyro_addr = I2cAddr;
komaida424 0:cca1c4e84da4 65 Gyro_data = 0x1D;
komaida424 0:cca1c4e84da4 66 tx[0] = 0x16;
komaida424 0:cca1c4e84da4 67 tx[1] = 0x18; // 0x1D
komaida424 0:cca1c4e84da4 68 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 69 tx[0] = 0x3E;
komaida424 0:cca1c4e84da4 70 tx[1] = 0x01;
komaida424 0:cca1c4e84da4 71 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 72 wait_ms(100);
komaida424 0:cca1c4e84da4 73 break;
komaida424 0:cca1c4e84da4 74
komaida424 0:cca1c4e84da4 75 case L3GD20_ADDR0: //gyro
komaida424 0:cca1c4e84da4 76 case L3GD20_ADDR1:
komaida424 0:cca1c4e84da4 77 Gyro_addr = I2cAddr;
komaida424 0:cca1c4e84da4 78 Gyro_data = 0x28;
komaida424 0:cca1c4e84da4 79 tx[0] = 0x20;
komaida424 0:cca1c4e84da4 80 tx[1] = 0xFF;
komaida424 0:cca1c4e84da4 81 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 82 tx[0] = 0x21;
komaida424 0:cca1c4e84da4 83 tx[1] = 0x09;
komaida424 0:cca1c4e84da4 84 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 85 tx[0] = 0x23;
komaida424 0:cca1c4e84da4 86 tx[1] = 0xF0;
komaida424 0:cca1c4e84da4 87 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 88 break;
komaida424 0:cca1c4e84da4 89
komaida424 0:cca1c4e84da4 90 case LDXL345_ADDR0: //accelametor
komaida424 0:cca1c4e84da4 91 case LDXL345_ADDR1:
komaida424 0:cca1c4e84da4 92 Accel_addr = I2cAddr;
komaida424 0:cca1c4e84da4 93 Accel_data = 0x32;
komaida424 0:cca1c4e84da4 94 tx[0] = 0x2D;
komaida424 0:cca1c4e84da4 95 tx[1] = 0x00;
komaida424 0:cca1c4e84da4 96 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 97 tx[0] = 0x31;
komaida424 0:cca1c4e84da4 98 tx[1] = 0x08; //full range 08:2g 09:4g 0A:8g 0B:16g
komaida424 0:cca1c4e84da4 99 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 100 tx[0] = 0x2C;
komaida424 0:cca1c4e84da4 101 tx[1] = 0x0C; //out rate 0xC:400Hz 0xD:800Hz
komaida424 0:cca1c4e84da4 102 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 103 tx[0] = 0x2D;
komaida424 0:cca1c4e84da4 104 tx[1] = 0x08;
komaida424 0:cca1c4e84da4 105 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 106 break;
komaida424 0:cca1c4e84da4 107
komaida424 0:cca1c4e84da4 108 case LPS331AP_ADDR0: //barometor
komaida424 0:cca1c4e84da4 109 case LPS331AP_ADDR1:
komaida424 0:cca1c4e84da4 110 barometor_addr = I2cAddr;
komaida424 0:cca1c4e84da4 111 barometor_data = 0x2B;
komaida424 0:cca1c4e84da4 112 tx[0] = 0x10; //RES_CNF
komaida424 0:cca1c4e84da4 113 tx[1] = 0x19;
komaida424 0:cca1c4e84da4 114 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 115 tx[0] = 0x20; // CTL_REG1
komaida424 0:cca1c4e84da4 116 tx[1] = 0x80; // power on
komaida424 0:cca1c4e84da4 117 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 118 tx[0]= 0x21; // CTL_REG2
komaida424 0:cca1c4e84da4 119 tx[1]= 0x01; // one shot start
komaida424 0:cca1c4e84da4 120 _i2c.write(I2cAddr,tx,2);
komaida424 0:cca1c4e84da4 121 break;
komaida424 0:cca1c4e84da4 122 }
komaida424 0:cca1c4e84da4 123 }
komaida424 0:cca1c4e84da4 124
komaida424 0:cca1c4e84da4 125 int I2cPeripherals::_putc(int value) {
komaida424 0:cca1c4e84da4 126 _i2c.start();
komaida424 0:cca1c4e84da4 127 _i2c.write(LCD_addr);
komaida424 0:cca1c4e84da4 128 _i2c.write(LCD_data);
komaida424 0:cca1c4e84da4 129 _i2c.write(value);
komaida424 0:cca1c4e84da4 130 _i2c.stop();
komaida424 0:cca1c4e84da4 131 return value;
komaida424 0:cca1c4e84da4 132 }
komaida424 0:cca1c4e84da4 133
komaida424 0:cca1c4e84da4 134 int I2cPeripherals::_getc() {
komaida424 0:cca1c4e84da4 135 return -1;
komaida424 0:cca1c4e84da4 136 }
komaida424 0:cca1c4e84da4 137
komaida424 0:cca1c4e84da4 138 void I2cPeripherals::cls()
komaida424 0:cca1c4e84da4 139 {
komaida424 0:cca1c4e84da4 140 char tx[2] = { 0x00, 0x01 };
komaida424 0:cca1c4e84da4 141 _i2c.write(LCD_addr,tx,2);
komaida424 0:cca1c4e84da4 142 }
komaida424 0:cca1c4e84da4 143
komaida424 0:cca1c4e84da4 144 void I2cPeripherals::locate(int clm,int row)
komaida424 0:cca1c4e84da4 145 {
komaida424 0:cca1c4e84da4 146 char tx[2];
komaida424 0:cca1c4e84da4 147
komaida424 0:cca1c4e84da4 148 tx[0] = 0x00;
komaida424 0:cca1c4e84da4 149 tx[1] = 0x80 + (row * 0x40) + clm;
komaida424 0:cca1c4e84da4 150 _i2c.write(LCD_addr,tx,2);
komaida424 0:cca1c4e84da4 151
komaida424 0:cca1c4e84da4 152 }
komaida424 0:cca1c4e84da4 153
komaida424 0:cca1c4e84da4 154 int I2cPeripherals::angular(int *x,int *y,int *z)
komaida424 0:cca1c4e84da4 155 {
komaida424 0:cca1c4e84da4 156 char rx[6];
komaida424 0:cca1c4e84da4 157 char tx[1];
komaida424 0:cca1c4e84da4 158 tx[0] = Gyro_data | 0x80;
komaida424 0:cca1c4e84da4 159 if ( _i2c.write(Gyro_addr,tx,1,true) != 0 ) {
komaida424 0:cca1c4e84da4 160 x=y=z=0;
komaida424 0:cca1c4e84da4 161 return false;
komaida424 0:cca1c4e84da4 162 }
komaida424 0:cca1c4e84da4 163 _i2c.read(Gyro_addr,rx,6);
komaida424 0:cca1c4e84da4 164 *x = short(rx[0] << 8 | (uint8_t)rx[1]);
komaida424 0:cca1c4e84da4 165 *y = short(rx[2] << 8 | (uint8_t)rx[3]);
komaida424 0:cca1c4e84da4 166 *z = short(rx[4] << 8 | (uint8_t)rx[5]);
komaida424 0:cca1c4e84da4 167 return true;
komaida424 0:cca1c4e84da4 168 }
komaida424 0:cca1c4e84da4 169 int I2cPeripherals::Acceleration(int *x,int *y,int *z)
komaida424 0:cca1c4e84da4 170 {
komaida424 0:cca1c4e84da4 171 //AXDL345 Data Read
komaida424 0:cca1c4e84da4 172 char rx[6];
komaida424 0:cca1c4e84da4 173 char tx[1];
komaida424 0:cca1c4e84da4 174 tx[0] = Accel_data | 0x80;
komaida424 0:cca1c4e84da4 175 if ( _i2c.write(Accel_addr,tx,1,true) != 0 ) {
komaida424 0:cca1c4e84da4 176 x=y=z=0;
komaida424 0:cca1c4e84da4 177 return false;
komaida424 0:cca1c4e84da4 178 }
komaida424 0:cca1c4e84da4 179 _i2c.read(Accel_addr,rx,6);
komaida424 0:cca1c4e84da4 180 *y = -short(rx[1] << 8 | (uint8_t)rx[0]);
komaida424 0:cca1c4e84da4 181 *x = short(rx[3] << 8 | (uint8_t)rx[2]);
komaida424 0:cca1c4e84da4 182 *z = short(rx[5] << 8 | (uint8_t)rx[4]);
komaida424 0:cca1c4e84da4 183 return true;
komaida424 0:cca1c4e84da4 184 }
komaida424 0:cca1c4e84da4 185
komaida424 0:cca1c4e84da4 186 int I2cPeripherals::pressure()
komaida424 0:cca1c4e84da4 187 {
komaida424 0:cca1c4e84da4 188 char tx[2];
komaida424 0:cca1c4e84da4 189 char rx[3];
komaida424 0:cca1c4e84da4 190 int press;
komaida424 0:cca1c4e84da4 191
komaida424 0:cca1c4e84da4 192 tx[0]= 0x21;
komaida424 0:cca1c4e84da4 193 rx[0] = 0;
komaida424 0:cca1c4e84da4 194 if ( _i2c.write(barometor_addr,tx,1,true) != 0 )
komaida424 0:cca1c4e84da4 195 return 0;
komaida424 0:cca1c4e84da4 196 _i2c.read (barometor_addr,rx,1);
komaida424 0:cca1c4e84da4 197 while( rx[0]&0x01 ) {
komaida424 0:cca1c4e84da4 198 wait(0.0001);
komaida424 0:cca1c4e84da4 199 _i2c.write(barometor_addr,tx,1,true);
komaida424 0:cca1c4e84da4 200 _i2c.read (barometor_addr,rx,1);
komaida424 0:cca1c4e84da4 201 }
komaida424 0:cca1c4e84da4 202
komaida424 0:cca1c4e84da4 203 tx[0]= 0x28 | 0x80;
komaida424 0:cca1c4e84da4 204 _i2c.write(barometor_addr,tx,1,true);
komaida424 0:cca1c4e84da4 205 _i2c.read (barometor_addr,rx,3);
komaida424 0:cca1c4e84da4 206
komaida424 0:cca1c4e84da4 207 tx[0]= 0x21; // CTL_REG2
komaida424 0:cca1c4e84da4 208 tx[1]= 0x01; // one shot start
komaida424 0:cca1c4e84da4 209 _i2c.write(barometor_addr, tx, 2);
komaida424 0:cca1c4e84da4 210
komaida424 0:cca1c4e84da4 211 press =int( rx[2]<<16 | rx[1]<<8 | rx[0] );
komaida424 0:cca1c4e84da4 212 return press;
komaida424 0:cca1c4e84da4 213 }
komaida424 0:cca1c4e84da4 214
komaida424 0:cca1c4e84da4 215
komaida424 0:cca1c4e84da4 216 //Update-Methode
komaida424 0:cca1c4e84da4 217 int I2cPeripherals::temperature()
komaida424 0:cca1c4e84da4 218 {
komaida424 0:cca1c4e84da4 219 char tx[1];
komaida424 0:cca1c4e84da4 220 char rx[2];
komaida424 0:cca1c4e84da4 221 int temp;
komaida424 0:cca1c4e84da4 222
komaida424 0:cca1c4e84da4 223 tx[0]= 0x2B | 0x80;
komaida424 0:cca1c4e84da4 224 if ( _i2c.write(barometor_addr,tx,1,true) != 0 )
komaida424 0:cca1c4e84da4 225 return 0;
komaida424 0:cca1c4e84da4 226 _i2c.read (barometor_addr,rx,2);
komaida424 0:cca1c4e84da4 227
komaida424 0:cca1c4e84da4 228 temp = short(rx[1]<<8 | rx[0]);
komaida424 0:cca1c4e84da4 229 return temp;
komaida424 0:cca1c4e84da4 230 };
komaida424 0:cca1c4e84da4 231
komaida424 0:cca1c4e84da4 232