Francesco Beraldini / Mbed 2 deprecated Project_2

Dependencies:   mbed X_NUCLEO_IKS01A2

Committer:
berajay
Date:
Wed Nov 03 18:06:48 2021 +0000
Revision:
20:e444e7dd815a
Parent:
19:00a099052986
STM32F401RE + ISK01A2 + SD Module + GPS Neo 6m

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cparata 0:69566eea0fba 1 /* Includes */
cparata 0:69566eea0fba 2 #include "mbed.h"
davide.aliprandi@st.com 13:fc873da5b445 3 #include "XNucleoIKS01A2.h"
berajay 20:e444e7dd815a 4 #include "SDFileSystem.h"
berajay 18:91a38b13d21d 5 #include "FATFileSystem.h"
berajay 18:91a38b13d21d 6 #include "iostream"
berajay 19:00a099052986 7
berajay 20:e444e7dd815a 8 Serial pc(USBTX, USBRX, 115200);
berajay 20:e444e7dd815a 9 Serial gps(D8, D2, 9800);
berajay 18:91a38b13d21d 10
berajay 18:91a38b13d21d 11 SDFileSystem sd(D11, D12, D13, D10, "sd");// the pinout on the mbed Cool Components workshop board
berajay 18:91a38b13d21d 12 FILE *fp;
cparata 0:69566eea0fba 13
cparata 0:69566eea0fba 14 /* Instantiate the expansion board */
davide.aliprandi@st.com 13:fc873da5b445 15 static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
cparata 0:69566eea0fba 16
cparata 0:69566eea0fba 17 /* Retrieve the composing elements of the expansion board */
cparata 0:69566eea0fba 18 static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
davide.aliprandi@st.com 13:fc873da5b445 19 static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
cparata 0:69566eea0fba 20
berajay 19:00a099052986 21 DigitalIn userButton(PC_13); //USER BUTTON
berajay 19:00a099052986 22 bool live_writing = false;
cparata 0:69566eea0fba 23
berajay 19:00a099052986 24 // GPS
berajay 20:e444e7dd815a 25 char cDataBuffer[500];
berajay 20:e444e7dd815a 26 int i = 0;
berajay 19:00a099052986 27 char c;
berajay 20:e444e7dd815a 28 void parse(char *cmd, int n){
berajay 19:00a099052986 29 char ns, ew, tf, status;
berajay 20:e444e7dd815a 30 int fq, nst, fix, date; // fix quality, Number of satellites being tracked, 3D fix
berajay 19:00a099052986 31 float latitude, longitude, timefix, speed, altitude;
berajay 20:e444e7dd815a 32
berajay 19:00a099052986 33 // Global Positioning System Fix Data
berajay 20:e444e7dd815a 34 if(strncmp(cmd,"$GPGGA", 6) == 0){
berajay 19:00a099052986 35 sscanf(cmd, "$GPGGA,%f,%f,%c,%f,%c,%d,%d,%*f,%f", &timefix, &latitude, &ns, &longitude, &ew, &fq, &nst, &altitude);
berajay 20:e444e7dd815a 36 printf("GPGGA Fix taken at: %f, Latitude: %f %c, Longitude: %f %c, Fix quality: %d, Number of sat: %d, Altitude: %f M\r\n", timefix, latitude, ns, longitude, ew, fq, nst, altitude);
davide.aliprandi@st.com 13:fc873da5b445 37 }
berajay 19:00a099052986 38
berajay 19:00a099052986 39 // Satellite status
berajay 20:e444e7dd815a 40 if(strncmp(cmd,"$GPGSA", 6) == 0){
berajay 19:00a099052986 41 sscanf(cmd, "$GPGSA,%c,%d,%d", &tf, &fix, &nst);
berajay 20:e444e7dd815a 42 printf("GPGSA Type fix: %c, 3D fix: %d, number of sat: %d\r\n", tf, fix, nst);
berajay 19:00a099052986 43 }
berajay 19:00a099052986 44
berajay 19:00a099052986 45 // Geographic position, Latitude and Longitude
berajay 20:e444e7dd815a 46 if(strncmp(cmd,"$GPGLL", 6) == 0){
berajay 20:e444e7dd815a 47 sscanf(cmd, "$GPGLL,%f,%c,%f,%c,%f", &latitude, &ns, &longitude, &ew, &timefix);
berajay 20:e444e7dd815a 48 printf("GPGLL Latitude: %f %c, Longitude: %f %c, Fix taken at: %f\r\n", latitude, ns, longitude, ew, timefix);
berajay 20:e444e7dd815a 49 }
berajay 20:e444e7dd815a 50
berajay 20:e444e7dd815a 51 // Geographic position, Latitude and Longitude
berajay 20:e444e7dd815a 52 if(strncmp(cmd,"$GPRMC", 6) == 0){
berajay 19:00a099052986 53 sscanf(cmd, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,,%d", &timefix, &status, &latitude, &ns, &longitude, &ew, &speed, &date);
berajay 20:e444e7dd815a 54 printf("GPRMC Fix taken at: %f, Status: %c, Latitude: %f %c, Longitude: %f %c, Speed: %f, Date: %d\r\n", timefix, status, latitude, ns, longitude, ew, speed, date);
berajay 19:00a099052986 55 }
berajay 19:00a099052986 56 }
cparata 0:69566eea0fba 57
cparata 0:69566eea0fba 58 /* Simple main function */
cparata 0:69566eea0fba 59 int main() {
cparata 0:69566eea0fba 60 uint8_t id;
berajay 19:00a099052986 61 int32_t x_axes[3];
berajay 19:00a099052986 62 int32_t g_axes[3];
berajay 19:00a099052986 63 float x_freq[2];
berajay 19:00a099052986 64 float g_freq[2];
berajay 19:00a099052986 65 float x_sens[2];
berajay 19:00a099052986 66 float x_fs[2];
berajay 19:00a099052986 67 // Take time (https://unixtime.org/)
berajay 20:e444e7dd815a 68 set_time(1635956827);
berajay 19:00a099052986 69
berajay 19:00a099052986 70 // DATE
berajay 19:00a099052986 71 char s[100];
berajay 19:00a099052986 72 time_t t_l = time (NULL);
berajay 19:00a099052986 73 struct tm *tp = localtime (&t_l);
berajay 19:00a099052986 74 strftime (s,100, "\n\t %d %B %Y %H:%M:%S\r\n", tp);
berajay 19:00a099052986 75 printf ("%s", s);
cparata 0:69566eea0fba 76
cparata 0:69566eea0fba 77 /* Enable all sensors */
berajay 19:00a099052986 78 accelerometer->enable(); //Data from LSM303AGR
berajay 19:00a099052986 79 acc_gyro->enable_x(); //Data from LSM6DSL
berajay 19:00a099052986 80 acc_gyro->enable_g(); //Data from LSM6DSL
cparata 0:69566eea0fba 81
cparata 0:69566eea0fba 82 printf("\r\n--- Starting new run ---\r\n");
cparata 0:69566eea0fba 83
davide.aliprandi@st.com 13:fc873da5b445 84 accelerometer->read_id(&id);
cparata 0:69566eea0fba 85 printf("LSM303AGR accelerometer = 0x%X\r\n", id);
davide.aliprandi@st.com 13:fc873da5b445 86 acc_gyro->read_id(&id);
cparata 0:69566eea0fba 87 printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id);
berajay 19:00a099052986 88
berajay 18:91a38b13d21d 89 int n=0;
berajay 19:00a099052986 90 int arr_lenght = 500;
berajay 19:00a099052986 91
berajay 19:00a099052986 92 Timer t;
berajay 19:00a099052986 93 Timer t_down;
berajay 19:00a099052986 94 float time[arr_lenght];
berajay 20:e444e7dd815a 95 int acc_x[arr_lenght];
berajay 20:e444e7dd815a 96 int acc_y[arr_lenght];
berajay 20:e444e7dd815a 97 int acc_z[arr_lenght];
berajay 20:e444e7dd815a 98 int gyro_x[arr_lenght];
berajay 20:e444e7dd815a 99 int gyro_y[arr_lenght];
berajay 20:e444e7dd815a 100 int gyro_z[arr_lenght];
berajay 19:00a099052986 101 float frequency = 1000.0;
berajay 19:00a099052986 102 float range = 8.0;
berajay 19:00a099052986 103 //SET
berajay 19:00a099052986 104 acc_gyro->set_x_odr(frequency);
berajay 19:00a099052986 105 acc_gyro->set_g_odr(frequency);
berajay 19:00a099052986 106 acc_gyro->set_x_fs(range);
berajay 19:00a099052986 107 //GET
berajay 19:00a099052986 108 acc_gyro->get_x_odr(x_freq);
berajay 19:00a099052986 109 printf("Accelerometer frequency: %.1f, %.1f\r\n", x_freq[0],x_freq[1]);
berajay 19:00a099052986 110 acc_gyro->get_g_odr(g_freq);
berajay 19:00a099052986 111 printf("Gryroscope frequency: %.1f, %.1f\r\n", g_freq[0],g_freq[1]);
berajay 19:00a099052986 112 acc_gyro->get_x_sensitivity(x_sens);
berajay 19:00a099052986 113 printf("Accelerometer sensitivity: %.3f, %.1f\r\n", x_sens[0],x_sens[1]);
berajay 19:00a099052986 114 acc_gyro->get_x_fs(x_fs);
berajay 19:00a099052986 115 printf("Accelerometer meas. range: %.1f, %.1f\r\n", x_fs[0],x_fs[1]);
berajay 19:00a099052986 116
berajay 20:e444e7dd815a 117 printf("Check GPS\r\n");
berajay 19:00a099052986 118 while(1){
berajay 19:00a099052986 119 if(gps.readable()){
berajay 19:00a099052986 120 if(gps.getc() == '$');{ // wait a $
berajay 19:00a099052986 121 for(int i=0; i<sizeof(cDataBuffer); i++){
berajay 19:00a099052986 122 c = gps.getc();
berajay 19:00a099052986 123 if( c == '\r' ){
berajay 19:00a099052986 124 parse(cDataBuffer, i);
berajay 19:00a099052986 125 i = sizeof(cDataBuffer);
berajay 19:00a099052986 126 }else{
berajay 19:00a099052986 127 cDataBuffer[i] = c;
berajay 19:00a099052986 128 }
berajay 19:00a099052986 129 }
berajay 19:00a099052986 130 }
berajay 19:00a099052986 131 }
berajay 19:00a099052986 132 if(!userButton){
berajay 19:00a099052986 133 break;
berajay 19:00a099052986 134 }
berajay 19:00a099052986 135 }
berajay 20:e444e7dd815a 136
berajay 19:00a099052986 137 printf("OK\r\n");
berajay 19:00a099052986 138 printf("\r\n");
berajay 19:00a099052986 139 /* Start the cycle*/
berajay 19:00a099052986 140 while(true){ //run forever
berajay 19:00a099052986 141 if (!userButton) { // button is pressed
berajay 19:00a099052986 142 if (live_writing==false) {
berajay 19:00a099052986 143 live_writing = true;
berajay 19:00a099052986 144 n = 0;
berajay 19:00a099052986 145 //Initialize SD CARD
berajay 19:00a099052986 146 char filename[64];
berajay 19:00a099052986 147 char date[64];
berajay 20:e444e7dd815a 148 printf("Check SD\r\n");
berajay 19:00a099052986 149 mkdir("/sd/ISK01A2", 0777);
berajay 19:00a099052986 150 int name = 0;
berajay 19:00a099052986 151 // Save name with next name test_001,test_002, ecc...
berajay 19:00a099052986 152 while(1) {
berajay 19:00a099052986 153 sprintf(filename, "/sd/ISK01A2/test_%03d.txt", name);
berajay 19:00a099052986 154 FILE *fp = fopen(filename, "r");
berajay 19:00a099052986 155 if(fp == NULL) {
berajay 19:00a099052986 156 break;
berajay 19:00a099052986 157 }
berajay 19:00a099052986 158 fclose(fp);
berajay 19:00a099052986 159 name++;
berajay 19:00a099052986 160 }
berajay 19:00a099052986 161
berajay 19:00a099052986 162 fp = fopen(filename, "w");
berajay 19:00a099052986 163 if (fp == NULL) {
berajay 19:00a099052986 164 error("Unable to write the file\r\n");
berajay 19:00a099052986 165 }
berajay 19:00a099052986 166
berajay 19:00a099052986 167 // Name file on monitor
berajay 19:00a099052986 168 printf("\n\t test_%03d \r\n", name);
berajay 19:00a099052986 169 strftime (date,64, "%d %B %Y %H:%M", tp);
berajay 19:00a099052986 170 fprintf(fp, "\t %s \n", date); //DATE
berajay 19:00a099052986 171 fprintf(fp, "N,Time,Temp[C],Acc_x[mg],Acc_y[mg],Acc_z[mg],Gyro_x[mdps],Gyro_y[mdps],Gyro_z[mdps]\r\n"); //Header in the file text
berajay 19:00a099052986 172
berajay 19:00a099052986 173 printf("\r\n START NEW RUNNING \r\n");
berajay 19:00a099052986 174 t.start();
berajay 19:00a099052986 175 } else { // button is pressed but live_writing is true
berajay 19:00a099052986 176
berajay 19:00a099052986 177 // Now we write into sd card all data storaged
berajay 19:00a099052986 178 t.stop();
berajay 20:e444e7dd815a 179 int i;
berajay 20:e444e7dd815a 180 //int elementi = sizeof(acc_x)/sizeof(int);
berajay 20:e444e7dd815a 181
berajay 20:e444e7dd815a 182 for (i=0; i<=n; i++){
berajay 20:e444e7dd815a 183 fprintf(fp,"%3d,%3.3f,%6ld,%6ld,%6ld,%6ld,%6ld,%6ld\r\n", i, time[i], acc_x[i], acc_y[i], acc_z[i], gyro_x[i], gyro_y[i], gyro_z[i]); //Save current data into file txt
berajay 20:e444e7dd815a 184 //printf("%3d,%3.3f,%6ld,%6ld,%6ld,%6ld,%6ld,%6ld\r\n", i, time[i], acc_x[i], acc_y[i], acc_z[i], gyro_x[i], gyro_y[i], gyro_z[i]);
berajay 20:e444e7dd815a 185 }
berajay 19:00a099052986 186 t.reset();
berajay 19:00a099052986 187 fclose(fp);
berajay 20:e444e7dd815a 188 printf("File successfully written!\r\n");
berajay 19:00a099052986 189 live_writing = false;
berajay 19:00a099052986 190 wait(2);
berajay 19:00a099052986 191 }//end else
berajay 19:00a099052986 192 } //end if userbutton
berajay 20:e444e7dd815a 193 if (live_writing==true){
berajay 19:00a099052986 194 acc_gyro->get_x_axes(x_axes); //Read data from LSM6DSL accelerometer
berajay 20:e444e7dd815a 195 acc_x[n] = x_axes[0];
berajay 20:e444e7dd815a 196 acc_y[n] = x_axes[1];
berajay 20:e444e7dd815a 197 acc_z[n] = x_axes[2];
berajay 19:00a099052986 198
berajay 19:00a099052986 199 acc_gyro->get_g_axes(g_axes); //Read data from LSM6DSL gyroscope
berajay 20:e444e7dd815a 200 gyro_x[n] = g_axes[0];
berajay 20:e444e7dd815a 201 gyro_y[n] = g_axes[1];
berajay 20:e444e7dd815a 202 gyro_z[n] = g_axes[2];
berajay 19:00a099052986 203
berajay 19:00a099052986 204 time[n] = t.read();
berajay 19:00a099052986 205 n+=1;
berajay 19:00a099052986 206
berajay 19:00a099052986 207 if (n==arr_lenght){
berajay 19:00a099052986 208 t.stop();
berajay 20:e444e7dd815a 209 int i;
berajay 20:e444e7dd815a 210
berajay 20:e444e7dd815a 211 for (i=0; i<=n; i++){
berajay 20:e444e7dd815a 212 fprintf(fp,"%3d,%3.3f,%6ld,%6ld,%6ld,%6ld,%6ld,%6ld\r\n", i, time[i], acc_x[i], acc_y[i], acc_z[i], gyro_x[i], gyro_y[i], gyro_z[i]); //Save current data into file txt
berajay 20:e444e7dd815a 213 //printf("%3d,%3.3f,%6ld,%6ld,%6ld,%6ld,%6ld,%6ld\r\n", i, time[i], acc_x[i], acc_y[i], acc_z[i], gyro_x[i], gyro_y[i], gyro_z[i]);
berajay 20:e444e7dd815a 214 }
berajay 19:00a099052986 215 t.reset();
berajay 19:00a099052986 216 fclose(fp);
berajay 20:e444e7dd815a 217 printf("File successfully written!\r\n");
berajay 19:00a099052986 218 live_writing = false;
berajay 19:00a099052986 219 wait(2);
berajay 19:00a099052986 220 }
berajay 19:00a099052986 221 }//end while writing
berajay 19:00a099052986 222 }//end while
berajay 19:00a099052986 223 }//end main
cparata 0:69566eea0fba 224