Francesco Beraldini / Mbed 2 deprecated Project_2

Dependencies:   mbed X_NUCLEO_IKS01A2

Committer:
berajay
Date:
Wed Nov 03 12:18:19 2021 +0000
Revision:
19:00a099052986
Parent:
18:91a38b13d21d
Child:
20:e444e7dd815a
SDfilesystemDMA;

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