Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed X_NUCLEO_IKS01A2
main.cpp@19:00a099052986, 2021-11-03 (annotated)
- 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?
User | Revision | Line number | New 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 |