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@20:e444e7dd815a, 2021-11-03 (annotated)
- 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?
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 | 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 |