Firmware Test of Tilt Sense using BMI160

Dependencies:   mbed TI_ADS1220 ESP8266

Fork of GeoDynamics by GeoDynamics Hibrid Seismograph

Committer:
firewalk
Date:
Thu Oct 20 04:27:46 2016 +0000
Revision:
5:96fff32333e8
Parent:
4:c79a3c86ab36
Complete Firmware of Geodynamic Seismograph

Who changed what in which revision?

UserRevisionLine numberNew contents of line
firewalk 5:96fff32333e8 1 //GeoDynamics Seismograph
firewalk 5:96fff32333e8 2 //Celso B. Varella Neto
firewalk 5:96fff32333e8 3 //-----------------------------------------------------------------------------
firewalk 0:aa129e8d6912 4 #include "mbed.h"
firewalk 5:96fff32333e8 5 #include "ESP8266.h"
firewalk 5:96fff32333e8 6 #include "ADS1220.h"
firewalk 0:aa129e8d6912 7
firewalk 4:c79a3c86ab36 8 /*Timer*/
firewalk 4:c79a3c86ab36 9 Timer t;
firewalk 0:aa129e8d6912 10
firewalk 0:aa129e8d6912 11 /* defines the axis for acc */
firewalk 0:aa129e8d6912 12 #define ACC_NOOF_AXIS 3
firewalk 1:268fc98970bb 13 #define GYR_NOOF_AXIS 2
firewalk 0:aa129e8d6912 14
firewalk 0:aa129e8d6912 15 /* bmi160 slave address */
firewalk 0:aa129e8d6912 16 #define BMI160_ADDR ((0x68)<<1)
firewalk 0:aa129e8d6912 17
firewalk 5:96fff32333e8 18 /*Value to Transform Rad to Deg*/
firewalk 1:268fc98970bb 19 #define RAD_DEG 57.29577951
firewalk 4:c79a3c86ab36 20
firewalk 5:96fff32333e8 21 #define PGA 1 // Programmable Gain = 1
firewalk 5:96fff32333e8 22 #define VREFE 5.0 // External reference of 5.00V
firewalk 5:96fff32333e8 23 #define VFSR VREFE/PGA
firewalk 5:96fff32333e8 24 #define FSR (((long int)1<<23))
firewalk 5:96fff32333e8 25 #define LSB_Size (VFSR/FSR)
firewalk 5:96fff32333e8 26
firewalk 5:96fff32333e8 27 #define IP "184.106.153.149" // thingspeak.com IP Address
firewalk 5:96fff32333e8 28
firewalk 5:96fff32333e8 29 /*Serial-USB LPCXpresso4337*/
firewalk 0:aa129e8d6912 30 Serial pc(USBTX, USBRX); // tx, rx
firewalk 0:aa129e8d6912 31
firewalk 5:96fff32333e8 32 /*I2C pin connected to BMI160*/
firewalk 0:aa129e8d6912 33 I2C i2c(P2_3, P2_4);
firewalk 0:aa129e8d6912 34
firewalk 5:96fff32333e8 35 /*Serial pin connected to ESP8266*/
firewalk 5:96fff32333e8 36 ESP8266 wifi(P2_10, P2_11, 115200); // baud rate for wifi
firewalk 5:96fff32333e8 37 char snd[255],rcv[1000];
firewalk 0:aa129e8d6912 38
firewalk 5:96fff32333e8 39 /*SPI pin connected to ADS120*/
firewalk 5:96fff32333e8 40 ADS1220 ads1220_com(D11, D12, D13);
firewalk 5:96fff32333e8 41 DigitalIn DRDY(D9);
firewalk 5:96fff32333e8 42
firewalk 5:96fff32333e8 43
firewalk 5:96fff32333e8 44
firewalk 5:96fff32333e8 45 /* variable to store IMU BMI160 samples and manipulate */
firewalk 0:aa129e8d6912 46 int16_t acc_sample_buffer[ACC_NOOF_AXIS] = {0x5555, 0x5555, 0x5555};
firewalk 1:268fc98970bb 47 int16_t gyr_sample_buffer[GYR_NOOF_AXIS] = {0x5555, 0x5555};
firewalk 0:aa129e8d6912 48
firewalk 0:aa129e8d6912 49 double acc_result_buffer[ACC_NOOF_AXIS] = {0x5555, 0x5555, 0x5555};
firewalk 1:268fc98970bb 50 double gyr_result_buffer[GYR_NOOF_AXIS] = {0x5555, 0x5555};
firewalk 1:268fc98970bb 51
firewalk 1:268fc98970bb 52 double accel_ang_x, accel_ang_y;
firewalk 1:268fc98970bb 53 double tiltx, tilty;
firewalk 1:268fc98970bb 54 double tiltx_prev, tilty_prev;
firewalk 0:aa129e8d6912 55
firewalk 0:aa129e8d6912 56 char i2c_reg_buffer[2] = {0};
firewalk 5:96fff32333e8 57
firewalk 5:96fff32333e8 58 /*variables to store ADS1220 samples and manipulate*/
firewalk 5:96fff32333e8 59 void showvolt(float volts);
firewalk 5:96fff32333e8 60 signed long t1Data, t2Data;
firewalk 5:96fff32333e8 61 float Vout, volt, ch1[2000], ch2[2000];
firewalk 5:96fff32333e8 62 char AIN1 = 57, AIN2 = 56;
firewalk 5:96fff32333e8 63 int chn, i;
firewalk 5:96fff32333e8 64
firewalk 5:96fff32333e8 65 /*Functions*/
firewalk 5:96fff32333e8 66 float code2volt(float c); //Convert ADC numeric 24bit to Volts
firewalk 5:96fff32333e8 67 int find_maximum(float a[]); //Find Largest Value in Array
firewalk 5:96fff32333e8 68 void wifi_send(void); //Send data to ThingSpeak using WIFI ESP8266
firewalk 0:aa129e8d6912 69
firewalk 0:aa129e8d6912 70 int main() {
firewalk 5:96fff32333e8 71
firewalk 5:96fff32333e8 72 pc.printf("GEODYNAMICS SEISMOGRAPH - EMBARCADOS CONTEST\n\r");
firewalk 5:96fff32333e8 73 pc.printf("Configuring IMU BMI160...\n\r");
firewalk 0:aa129e8d6912 74 wait_ms(250);
firewalk 0:aa129e8d6912 75
firewalk 0:aa129e8d6912 76 /*Config Freq. I2C Bus*/
firewalk 0:aa129e8d6912 77 i2c.frequency(20000);
firewalk 0:aa129e8d6912 78
firewalk 0:aa129e8d6912 79 /*Reset BMI160*/
firewalk 0:aa129e8d6912 80 i2c_reg_buffer[0] = 0x7E;
firewalk 0:aa129e8d6912 81 i2c_reg_buffer[1] = 0xB6;
firewalk 0:aa129e8d6912 82 i2c.write(BMI160_ADDR, i2c_reg_buffer, sizeof(i2c_reg_buffer), false);
firewalk 0:aa129e8d6912 83 wait_ms(200);
firewalk 5:96fff32333e8 84 pc.printf("BMI160 Reseted\n\r");
firewalk 0:aa129e8d6912 85
firewalk 0:aa129e8d6912 86 /*Habilita o Acelerometro*/
firewalk 0:aa129e8d6912 87 i2c_reg_buffer[0] = 0x7E;
firewalk 0:aa129e8d6912 88 i2c_reg_buffer[1] = 0x11; //PMU Normal
firewalk 0:aa129e8d6912 89 i2c.write(BMI160_ADDR, i2c_reg_buffer, sizeof(i2c_reg_buffer), false);
firewalk 5:96fff32333e8 90 pc.printf("Acc Enable\n\r");
firewalk 0:aa129e8d6912 91
firewalk 0:aa129e8d6912 92 /*Habilita o Giroscopio*/
firewalk 0:aa129e8d6912 93 i2c_reg_buffer[0] = 0x7E;
firewalk 0:aa129e8d6912 94 i2c_reg_buffer[1] = 0x15; //PMU Normal
firewalk 0:aa129e8d6912 95 i2c.write(BMI160_ADDR, i2c_reg_buffer, sizeof(i2c_reg_buffer), false);
firewalk 5:96fff32333e8 96 pc.printf("Gyr Enable\n\r");
firewalk 0:aa129e8d6912 97
firewalk 2:986e8a434da3 98 /*Config o Data Rate ACC em 1600Hz*/
firewalk 0:aa129e8d6912 99 i2c_reg_buffer[0] = 0x40;
firewalk 2:986e8a434da3 100 i2c_reg_buffer[1] = 0x2C;
firewalk 0:aa129e8d6912 101 i2c.write(BMI160_ADDR, i2c_reg_buffer, sizeof(i2c_reg_buffer), false);
firewalk 5:96fff32333e8 102 pc.printf("ACC Data Rate Configured to 1600Hz\n\r");
firewalk 0:aa129e8d6912 103
firewalk 2:986e8a434da3 104 /*Config o Data Rate GYR em 1600Hz*/
firewalk 0:aa129e8d6912 105 i2c_reg_buffer[0] = 0x42;
firewalk 2:986e8a434da3 106 i2c_reg_buffer[1] = 0x2C;
firewalk 0:aa129e8d6912 107 i2c.write(BMI160_ADDR, i2c_reg_buffer, sizeof(i2c_reg_buffer), false);
firewalk 5:96fff32333e8 108 pc.printf("GYR Data Rate Configured to 1600Hz\n\r");
firewalk 2:986e8a434da3 109
firewalk 2:986e8a434da3 110 /*Config o Range GYR em 250º/s*/
firewalk 2:986e8a434da3 111 i2c_reg_buffer[0] = 0x43;
firewalk 2:986e8a434da3 112 i2c_reg_buffer[1] = 0x03;
firewalk 2:986e8a434da3 113 i2c.write(BMI160_ADDR, i2c_reg_buffer, sizeof(i2c_reg_buffer), false);
firewalk 5:96fff32333e8 114 pc.printf("GYR Range Configured to 250deg/s\n\r");
firewalk 0:aa129e8d6912 115
firewalk 0:aa129e8d6912 116 wait_ms(2000);
firewalk 5:96fff32333e8 117 pc.printf("BMI160 Configured\n\r");
firewalk 5:96fff32333e8 118
firewalk 5:96fff32333e8 119 pc.printf("ADS1220 Initializing\n\r");
firewalk 5:96fff32333e8 120 ads1220_com.Config();
firewalk 5:96fff32333e8 121 //Configure ADS1220 to Single Shot, Turbo Mode & 2000sps
firewalk 5:96fff32333e8 122 pc.printf("ADS1220 Configured and Initialized\n\r");
firewalk 0:aa129e8d6912 123
firewalk 5:96fff32333e8 124 pc.printf("Configuring ESP8266\n\r");
firewalk 5:96fff32333e8 125 pc.printf("SET mode to AP\r\n");
firewalk 5:96fff32333e8 126 wifi.SetMode(1); // set ESP mode to 1
firewalk 5:96fff32333e8 127 wifi.RcvReply(rcv, 1000); //receive a response from ESP
firewalk 5:96fff32333e8 128 pc.printf("%s",rcv); //Print the response onscreen
firewalk 5:96fff32333e8 129 pc.printf("Conneting to AP\r\n");
firewalk 5:96fff32333e8 130 wifi.Join("cbv", "26141916"); // Your wifi username & Password
firewalk 5:96fff32333e8 131 wifi.RcvReply(rcv, 1000); //receive a response from ESP
firewalk 5:96fff32333e8 132 pc.printf("%s", rcv); //Print the response onscreen
firewalk 5:96fff32333e8 133 wait(8); //waits for response from ESP
firewalk 5:96fff32333e8 134 pc.printf("Getting IP\r\n"); //get IP addresss from the connected AP
firewalk 5:96fff32333e8 135 wifi.GetIP(rcv); //receive an IP address from the AP
firewalk 5:96fff32333e8 136 pc.printf("%s", rcv);
firewalk 5:96fff32333e8 137 wait(5); // Delay 5 sec to give the pir time to get snapshut of the surrounding
firewalk 5:96fff32333e8 138 pc.printf("ESP8266 Configured\r\n");
firewalk 5:96fff32333e8 139
firewalk 5:96fff32333e8 140 wait(2);
firewalk 5:96fff32333e8 141
firewalk 5:96fff32333e8 142 t.start();
firewalk 0:aa129e8d6912 143
firewalk 0:aa129e8d6912 144 while(1) {
firewalk 0:aa129e8d6912 145
firewalk 5:96fff32333e8 146 /*Read Register from Accelerometer*/
firewalk 0:aa129e8d6912 147 i2c_reg_buffer[0] = 0x12;
firewalk 0:aa129e8d6912 148 i2c.write(BMI160_ADDR, i2c_reg_buffer, 1, true);
firewalk 0:aa129e8d6912 149 i2c.read(BMI160_ADDR, (char *)&acc_sample_buffer, sizeof(acc_sample_buffer), false);
firewalk 0:aa129e8d6912 150
firewalk 5:96fff32333e8 151 /*Read Register from Gyroscope*/
firewalk 0:aa129e8d6912 152 i2c_reg_buffer[0] = 0x0C;
firewalk 0:aa129e8d6912 153 i2c.write(BMI160_ADDR, i2c_reg_buffer, 1, true);
firewalk 0:aa129e8d6912 154 i2c.read(BMI160_ADDR, (char *)&gyr_sample_buffer, sizeof(gyr_sample_buffer), false);
firewalk 0:aa129e8d6912 155
firewalk 5:96fff32333e8 156 /*Adjust Raw Data from Accelerometer to G Units*/
firewalk 1:268fc98970bb 157 acc_result_buffer[0] = (acc_sample_buffer[0]/16384.0);
firewalk 1:268fc98970bb 158 acc_result_buffer[1] = (acc_sample_buffer[1]/16384.0);
firewalk 1:268fc98970bb 159 acc_result_buffer[2] = (acc_sample_buffer[2]/16384.0);
firewalk 0:aa129e8d6912 160
firewalk 5:96fff32333e8 161 /*Adjust Raw Data from Gyroscope to deg/s Units */
firewalk 2:986e8a434da3 162 gyr_result_buffer[0] = (gyr_sample_buffer[0]/131.2);
firewalk 2:986e8a434da3 163 gyr_result_buffer[1] = (gyr_sample_buffer[1]/131.2);
firewalk 1:268fc98970bb 164
firewalk 5:96fff32333e8 165 /*Compute Dip Angle from Accelerometer Data*/
firewalk 1:268fc98970bb 166 accel_ang_x=atan(acc_result_buffer[0]/sqrt(pow(acc_result_buffer[1],2) + pow(acc_result_buffer[2],2)))*RAD_DEG;
firewalk 1:268fc98970bb 167 accel_ang_y=atan(acc_result_buffer[1]/sqrt(pow(acc_result_buffer[0],2) + pow(acc_result_buffer[2],2)))*RAD_DEG;
firewalk 1:268fc98970bb 168
firewalk 5:96fff32333e8 169 /*Stop Timer*/
firewalk 4:c79a3c86ab36 170 t.stop();
firewalk 4:c79a3c86ab36 171
firewalk 5:96fff32333e8 172 /*Compute Rotation Angle from Gyroscope and Fusion Data using Complementary Filter*/
firewalk 5:96fff32333e8 173 tiltx = (0.0280*(tiltx_prev+(gyr_result_buffer[0]*t.read())))+(0.9719*(accel_ang_x));
firewalk 5:96fff32333e8 174 tilty = (0.0280*(tilty_prev+(gyr_result_buffer[1]*t.read())))+(0.9719*(accel_ang_y));
firewalk 4:c79a3c86ab36 175
firewalk 5:96fff32333e8 176 /*Debug to find Loop Time*/
firewalk 5:96fff32333e8 177 //pc.printf("Tempo Loop %f \r\n",t.read());
firewalk 4:c79a3c86ab36 178
firewalk 5:96fff32333e8 179 /*Reset Timer*/
firewalk 4:c79a3c86ab36 180 t.reset();
firewalk 5:96fff32333e8 181 /*Start Timer*/
firewalk 4:c79a3c86ab36 182 t.start();
firewalk 1:268fc98970bb 183
firewalk 1:268fc98970bb 184 tiltx_prev = tiltx;
firewalk 5:96fff32333e8 185 tilty_prev = tilty;
firewalk 0:aa129e8d6912 186
firewalk 5:96fff32333e8 187 i = 0;
firewalk 5:96fff32333e8 188 while(i != 2000) {
firewalk 5:96fff32333e8 189 //Read Analog Data
firewalk 5:96fff32333e8 190 ads1220_com.set_MUX(AIN1); //Configure to Sample Channel 1
firewalk 5:96fff32333e8 191 ads1220_com.SendStartCommand(); //Start Aquisition
firewalk 5:96fff32333e8 192 while (DRDY != 0){} // Wait data on Buffer
firewalk 5:96fff32333e8 193 t1Data = ads1220_com.ReadData(); //Read Data Sampled on Channel 1
firewalk 5:96fff32333e8 194
firewalk 5:96fff32333e8 195 ads1220_com.set_MUX(AIN2); //Configure to Sample Channel 2
firewalk 5:96fff32333e8 196 ads1220_com.SendStartCommand(); //Start Aquisition
firewalk 5:96fff32333e8 197 while (DRDY != 0){} // Wait data on Buffer
firewalk 5:96fff32333e8 198 t2Data = ads1220_com.ReadData(); //Read Data Sampled on Channel 2
firewalk 5:96fff32333e8 199
firewalk 5:96fff32333e8 200
firewalk 5:96fff32333e8 201 ch1[i] = code2volt(t1Data); //Convert ADC Ch1 data to Volts
firewalk 5:96fff32333e8 202 ch2[i] = code2volt(t2Data); //Convert ADC Ch2 data to Volts
firewalk 5:96fff32333e8 203
firewalk 5:96fff32333e8 204 i = i + 1;
firewalk 5:96fff32333e8 205 }
firewalk 5:96fff32333e8 206 /*Send Sensors Data to Serial*/
firewalk 5:96fff32333e8 207 pc.printf("%.3f, %.3f\n\r",tiltx, tilty);
firewalk 5:96fff32333e8 208 pc.printf("%4.3f, %4.3f\n\r",ch1[find_maximum(ch1)], ch2[find_maximum(ch2)]);
firewalk 5:96fff32333e8 209 pc.printf("Sending WiFi information\n\r");
firewalk 5:96fff32333e8 210 wifi_send(); //Send Sensors Data to ThingSpeak using ESP8266
firewalk 1:268fc98970bb 211
firewalk 1:268fc98970bb 212
firewalk 1:268fc98970bb 213
firewalk 0:aa129e8d6912 214 }
firewalk 0:aa129e8d6912 215 }
firewalk 5:96fff32333e8 216
firewalk 5:96fff32333e8 217 //Function to Convert ADC Data Read
firewalk 5:96fff32333e8 218 float code2volt(float c)
firewalk 5:96fff32333e8 219 {
firewalk 5:96fff32333e8 220 float Vout = 0;
firewalk 5:96fff32333e8 221 Vout = (float)(c*LSB_Size*1000); //In mV
firewalk 5:96fff32333e8 222 return Vout;
firewalk 5:96fff32333e8 223 }
firewalk 5:96fff32333e8 224
firewalk 5:96fff32333e8 225 //Function Return Largest Element on Array
firewalk 5:96fff32333e8 226 int find_maximum(float a[]) {
firewalk 5:96fff32333e8 227 int c, index;
firewalk 5:96fff32333e8 228 float max;
firewalk 5:96fff32333e8 229 max = a[0];
firewalk 5:96fff32333e8 230 index = 0;
firewalk 5:96fff32333e8 231
firewalk 5:96fff32333e8 232 for (c = 1; c < 2000; c++) {
firewalk 5:96fff32333e8 233 if (a[c] > max) {
firewalk 5:96fff32333e8 234 index = c;
firewalk 5:96fff32333e8 235 max = a[c];
firewalk 5:96fff32333e8 236 }
firewalk 5:96fff32333e8 237 }
firewalk 5:96fff32333e8 238 return index;
firewalk 5:96fff32333e8 239 }
firewalk 5:96fff32333e8 240
firewalk 5:96fff32333e8 241 //SEND DATA TO THINGSPEAK VIA ESP8266
firewalk 5:96fff32333e8 242 void wifi_send(void){
firewalk 5:96fff32333e8 243
firewalk 5:96fff32333e8 244 strcpy(snd,"AT+CIPMODE=0");//Setting WiFi into MultiChannel mode
firewalk 5:96fff32333e8 245 wifi.SendCMD(snd);
firewalk 5:96fff32333e8 246 //pc.printf(snd);
firewalk 5:96fff32333e8 247 wifi.RcvReply(rcv, 3000);
firewalk 5:96fff32333e8 248 //pc.printf("%s", rcv);
firewalk 5:96fff32333e8 249
firewalk 5:96fff32333e8 250 //WIFI updates the Status to Thingspeak servers//
firewalk 5:96fff32333e8 251 strcpy(snd,"AT+CIPMUX=1");//Setting WiFi into MultiChannel mode
firewalk 5:96fff32333e8 252 wifi.SendCMD(snd);
firewalk 5:96fff32333e8 253 //pc.printf(snd);
firewalk 5:96fff32333e8 254 wifi.RcvReply(rcv, 3000);
firewalk 5:96fff32333e8 255 //pc.printf("%s", rcv);
firewalk 5:96fff32333e8 256
firewalk 5:96fff32333e8 257
firewalk 5:96fff32333e8 258 sprintf(snd,"AT+CIPSTART=4,\"TCP\",\"%s\",80",IP); //Initiate connection with THINGSPEAK server
firewalk 5:96fff32333e8 259 wifi.SendCMD(snd);
firewalk 5:96fff32333e8 260 //pc.printf(snd);
firewalk 5:96fff32333e8 261 wifi.RcvReply(rcv, 3000);
firewalk 5:96fff32333e8 262 //pc.printf("%s", rcv);
firewalk 5:96fff32333e8 263
firewalk 5:96fff32333e8 264 strcpy(snd,"AT+CIPSEND=4,99"); //Send Number of open connections,Characters to send
firewalk 5:96fff32333e8 265 wifi.SendCMD(snd);
firewalk 5:96fff32333e8 266 //pc.printf(snd);
firewalk 5:96fff32333e8 267 wifi.RcvReply(rcv, 3000);
firewalk 5:96fff32333e8 268 //pc.printf("%s", rcv);
firewalk 5:96fff32333e8 269
firewalk 5:96fff32333e8 270
firewalk 5:96fff32333e8 271 sprintf(snd,"GET /update?key=WHZBPNRREAXDKYII&field1=%2.2f&field2=%2.2f&field3=%4.2f&field4=%4.2f\r\n",tiltx, tilty, ch1[find_maximum(ch1)], ch2[find_maximum(ch2)]); //Post values to thingspeak
firewalk 5:96fff32333e8 272 //pc.printf("String length %3d\r\n",strlen(snd));
firewalk 5:96fff32333e8 273 //pc.printf("%s",snd);
firewalk 5:96fff32333e8 274 wifi.SendCMD(snd);
firewalk 5:96fff32333e8 275 wifi.RcvReply(rcv, 3000);
firewalk 5:96fff32333e8 276 //pc.printf("%s", rcv);
firewalk 5:96fff32333e8 277
firewalk 5:96fff32333e8 278
firewalk 5:96fff32333e8 279 //wifi.SendCMD("AT+CIPCLOSE"); //Close the connection to server
firewalk 5:96fff32333e8 280 //wifi.RcvReply(rcv, 3000);
firewalk 5:96fff32333e8 281 //pc.printf("%s", rcv);
firewalk 5:96fff32333e8 282 pc.printf("Data Sent \r\n");
firewalk 5:96fff32333e8 283 }