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.
main.cpp@19:c765e311adbd, 2021-11-03 (annotated)
- Committer:
- berajay
- Date:
- Wed Nov 03 16:47:27 2021 +0000
- Revision:
- 19:c765e311adbd
- Parent:
- 18:91a38b13d21d
- Child:
- 20:2d02441d1876
save data of ISK01A2 in external SD;
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 | 18:91a38b13d21d | 4 | #include "SDFileSystem.h" | 
| berajay | 18:91a38b13d21d | 5 | #include "FATFileSystem.h" | 
| berajay | 18:91a38b13d21d | 6 | #include "iostream" | 
| berajay | 19:c765e311adbd | 7 | #include "locale.h" | 
| berajay | 19:c765e311adbd | 8 | #include "time.h" | 
| berajay | 18:91a38b13d21d | 9 | |
| berajay | 18:91a38b13d21d | 10 | Serial pc(USBTX, USBRX); | 
| berajay | 19:c765e311adbd | 11 | // MOSI, MISO, SCK, CS | 
| berajay | 18:91a38b13d21d | 12 | SDFileSystem sd(D11, D12, D13, D10, "sd");// the pinout on the mbed Cool Components workshop board | 
| berajay | 18:91a38b13d21d | 13 | FILE *fp; | 
| cparata | 0:69566eea0fba | 14 | |
| cparata | 0:69566eea0fba | 15 | /* Instantiate the expansion board */ | 
| davide.aliprandi@st.com | 13:fc873da5b445 | 16 | static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5); | 
| cparata | 0:69566eea0fba | 17 | |
| cparata | 0:69566eea0fba | 18 | /* Retrieve the composing elements of the expansion board */ | 
| cparata | 0:69566eea0fba | 19 | static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro; | 
| davide.aliprandi@st.com | 13:fc873da5b445 | 20 | static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer; | 
| cparata | 0:69566eea0fba | 21 | |
| berajay | 19:c765e311adbd | 22 | DigitalIn userButton(PC_13); //USER BUTTON | 
| berajay | 19:c765e311adbd | 23 | bool live_writing = false; | 
| cparata | 0:69566eea0fba | 24 | |
| cparata | 0:69566eea0fba | 25 | /* Simple main function */ | 
| cparata | 0:69566eea0fba | 26 | int main() { | 
| berajay | 19:c765e311adbd | 27 | pc.baud(115200); | 
| cparata | 0:69566eea0fba | 28 | uint8_t id; | 
| berajay | 19:c765e311adbd | 29 | int32_t x_axes[3]; | 
| berajay | 19:c765e311adbd | 30 | int32_t g_axes[3]; | 
| berajay | 19:c765e311adbd | 31 | float x_freq[2]; | 
| berajay | 19:c765e311adbd | 32 | float g_freq[2]; | 
| berajay | 19:c765e311adbd | 33 | float x_sens[2]; | 
| berajay | 19:c765e311adbd | 34 | float x_fs[2]; | 
| berajay | 19:c765e311adbd | 35 | // Take time (https://unixtime.org/) | 
| berajay | 19:c765e311adbd | 36 | set_time(1635956827); | 
| berajay | 19:c765e311adbd | 37 | |
| berajay | 19:c765e311adbd | 38 | // DATE | 
| berajay | 19:c765e311adbd | 39 | char s[100]; | 
| berajay | 19:c765e311adbd | 40 | time_t t_l = time (NULL); | 
| berajay | 19:c765e311adbd | 41 | struct tm *tp = localtime (&t_l); | 
| berajay | 19:c765e311adbd | 42 | strftime (s,100, "\n\t %d %B %Y %H:%M:%S\r\n", tp); | 
| berajay | 19:c765e311adbd | 43 | printf ("%s", s); | 
| cparata | 0:69566eea0fba | 44 | |
| cparata | 0:69566eea0fba | 45 | /* Enable all sensors */ | 
| berajay | 19:c765e311adbd | 46 | accelerometer->enable(); //Data from LSM303AGR | 
| berajay | 19:c765e311adbd | 47 | acc_gyro->enable_x(); //Data from LSM6DSL | 
| berajay | 19:c765e311adbd | 48 | acc_gyro->enable_g(); //Data from LSM6DSL | 
| cparata | 0:69566eea0fba | 49 | |
| cparata | 0:69566eea0fba | 50 | printf("\r\n--- Starting new run ---\r\n"); | 
| cparata | 0:69566eea0fba | 51 | |
| davide.aliprandi@st.com | 13:fc873da5b445 | 52 | accelerometer->read_id(&id); | 
| cparata | 0:69566eea0fba | 53 | printf("LSM303AGR accelerometer = 0x%X\r\n", id); | 
| davide.aliprandi@st.com | 13:fc873da5b445 | 54 | acc_gyro->read_id(&id); | 
| cparata | 0:69566eea0fba | 55 | printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id); | 
| berajay | 19:c765e311adbd | 56 | |
| berajay | 18:91a38b13d21d | 57 | int n=0; | 
| berajay | 19:c765e311adbd | 58 | int arr_lenght = 500; | 
| berajay | 19:c765e311adbd | 59 | Timer t; | 
| berajay | 19:c765e311adbd | 60 | Timer t_down; | 
| berajay | 19:c765e311adbd | 61 | float time[arr_lenght]; | 
| berajay | 19:c765e311adbd | 62 | int acc_x[arr_lenght]; | 
| berajay | 19:c765e311adbd | 63 | int acc_y[arr_lenght]; | 
| berajay | 19:c765e311adbd | 64 | int acc_z[arr_lenght]; | 
| berajay | 19:c765e311adbd | 65 | int gyro_x[arr_lenght]; | 
| berajay | 19:c765e311adbd | 66 | int gyro_y[arr_lenght]; | 
| berajay | 19:c765e311adbd | 67 | int gyro_z[arr_lenght]; | 
| berajay | 19:c765e311adbd | 68 | float frequency = 1000.0; | 
| berajay | 19:c765e311adbd | 69 | float range = 8.0; | 
| berajay | 19:c765e311adbd | 70 | //SET | 
| berajay | 19:c765e311adbd | 71 | acc_gyro->set_x_odr(frequency); | 
| berajay | 19:c765e311adbd | 72 | acc_gyro->set_g_odr(frequency); | 
| berajay | 19:c765e311adbd | 73 | acc_gyro->set_x_fs(range); | 
| berajay | 19:c765e311adbd | 74 | //GET | 
| berajay | 19:c765e311adbd | 75 | acc_gyro->get_x_odr(x_freq); | 
| berajay | 19:c765e311adbd | 76 | printf("Accelerometer frequency: %.1f, %.1f\r\n", x_freq[0],x_freq[1]); | 
| berajay | 19:c765e311adbd | 77 | acc_gyro->get_g_odr(g_freq); | 
| berajay | 19:c765e311adbd | 78 | printf("Gryroscope frequency: %.1f, %.1f\r\n", g_freq[0],g_freq[1]); | 
| berajay | 19:c765e311adbd | 79 | acc_gyro->get_x_sensitivity(x_sens); | 
| berajay | 19:c765e311adbd | 80 | printf("Accelerometer sensitivity: %.3f, %.1f\r\n", x_sens[0],x_sens[1]); | 
| berajay | 19:c765e311adbd | 81 | acc_gyro->get_x_fs(x_fs); | 
| berajay | 19:c765e311adbd | 82 | printf("Accelerometer meas. range: %.1f, %.1f\r\n", x_fs[0],x_fs[1]); | 
| cparata | 0:69566eea0fba | 83 | |
| cparata | 0:69566eea0fba | 84 | |
| berajay | 19:c765e311adbd | 85 | printf("\r\n"); | 
| berajay | 19:c765e311adbd | 86 | /* Start the cycle*/ | 
| berajay | 19:c765e311adbd | 87 | while(true){ //run forever | 
| berajay | 19:c765e311adbd | 88 | if (!userButton) { // button is pressed | 
| berajay | 19:c765e311adbd | 89 | if (live_writing==false) { | 
| berajay | 19:c765e311adbd | 90 | live_writing = true; | 
| berajay | 19:c765e311adbd | 91 | n = 0; | 
| berajay | 19:c765e311adbd | 92 | //Initialize SD CARD | 
| berajay | 19:c765e311adbd | 93 | char filename[64]; | 
| berajay | 19:c765e311adbd | 94 | char date[64]; | 
| berajay | 19:c765e311adbd | 95 | pc.printf("Check SD\r\n"); | 
| berajay | 19:c765e311adbd | 96 | mkdir("/sd/ISK01A2", 0777); | 
| berajay | 19:c765e311adbd | 97 | int name = 0; | 
| berajay | 19:c765e311adbd | 98 | // Save name with next name test_001,test_002, ecc... | 
| berajay | 19:c765e311adbd | 99 | while(1) { | 
| berajay | 19:c765e311adbd | 100 | sprintf(filename, "/sd/ISK01A2/test_%03d.txt", name); | 
| berajay | 19:c765e311adbd | 101 | FILE *fp = fopen(filename, "r"); | 
| berajay | 19:c765e311adbd | 102 | if(fp == NULL) { | 
| berajay | 19:c765e311adbd | 103 | break; | 
| berajay | 19:c765e311adbd | 104 | } | 
| berajay | 19:c765e311adbd | 105 | fclose(fp); | 
| berajay | 19:c765e311adbd | 106 | name++; | 
| berajay | 19:c765e311adbd | 107 | } | 
| berajay | 19:c765e311adbd | 108 | |
| berajay | 19:c765e311adbd | 109 | fp = fopen(filename, "w"); | 
| berajay | 19:c765e311adbd | 110 | if (fp == NULL) { | 
| berajay | 19:c765e311adbd | 111 | error("Unable to write the file\r\n"); | 
| berajay | 19:c765e311adbd | 112 | } | 
| berajay | 19:c765e311adbd | 113 | |
| berajay | 19:c765e311adbd | 114 | // Name file on monitor | 
| berajay | 19:c765e311adbd | 115 | printf("\n\t test_%03d \r\n", name); | 
| berajay | 19:c765e311adbd | 116 | |
| berajay | 19:c765e311adbd | 117 | fprintf(fp, " DATA of STM32F401RE with ISK01A2\r\n"); | 
| berajay | 19:c765e311adbd | 118 | strftime (date,64, "%d %B %Y %H:%M", tp); | 
| berajay | 19:c765e311adbd | 119 | fprintf(fp, "\t %s \n", date); //DATE | 
| berajay | 19:c765e311adbd | 120 | 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:c765e311adbd | 121 | |
| berajay | 19:c765e311adbd | 122 | printf("\r\n START NEW RUNNING \r\n"); | 
| berajay | 19:c765e311adbd | 123 | t.start(); | 
| berajay | 19:c765e311adbd | 124 | } else { // button is pressed but live_writing is true | 
| berajay | 19:c765e311adbd | 125 | |
| berajay | 19:c765e311adbd | 126 | // Now we write into sd card all data storaged | 
| berajay | 19:c765e311adbd | 127 | t.stop(); | 
| berajay | 19:c765e311adbd | 128 | int i; | 
| berajay | 19:c765e311adbd | 129 | //int elementi = sizeof(acc_x)/sizeof(int); | 
| berajay | 19:c765e311adbd | 130 | |
| berajay | 19:c765e311adbd | 131 | for (i=0; i<=n; i++){ | 
| berajay | 19:c765e311adbd | 132 | 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 | 19:c765e311adbd | 133 | //pc.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 | 19:c765e311adbd | 134 | } | 
| berajay | 19:c765e311adbd | 135 | t.reset(); | 
| berajay | 19:c765e311adbd | 136 | fclose(fp); | 
| berajay | 19:c765e311adbd | 137 | pc.printf("File successfully written!\r\n"); | 
| berajay | 19:c765e311adbd | 138 | live_writing = false; | 
| berajay | 19:c765e311adbd | 139 | wait(2); | 
| berajay | 19:c765e311adbd | 140 | }//end else | 
| berajay | 19:c765e311adbd | 141 | } //end if userbutton | 
| berajay | 19:c765e311adbd | 142 | if (live_writing==true){ | 
| berajay | 19:c765e311adbd | 143 | acc_gyro->get_x_axes(x_axes); //Read data from LSM6DSL accelerometer | 
| berajay | 19:c765e311adbd | 144 | acc_x[n] = x_axes[0]; | 
| berajay | 19:c765e311adbd | 145 | acc_y[n] = x_axes[1]; | 
| berajay | 19:c765e311adbd | 146 | acc_z[n] = x_axes[2]; | 
| berajay | 19:c765e311adbd | 147 | |
| berajay | 19:c765e311adbd | 148 | acc_gyro->get_g_axes(g_axes); //Read data from LSM6DSL gyroscope | 
| berajay | 19:c765e311adbd | 149 | gyro_x[n] = g_axes[0]; | 
| berajay | 19:c765e311adbd | 150 | gyro_y[n] = g_axes[1]; | 
| berajay | 19:c765e311adbd | 151 | gyro_z[n] = g_axes[2]; | 
| berajay | 19:c765e311adbd | 152 | |
| berajay | 19:c765e311adbd | 153 | time[n] = t.read(); | 
| berajay | 19:c765e311adbd | 154 | n+=1; | 
| berajay | 19:c765e311adbd | 155 | |
| berajay | 19:c765e311adbd | 156 | if (n==arr_lenght){ | 
| berajay | 19:c765e311adbd | 157 | t.stop(); | 
| berajay | 19:c765e311adbd | 158 | int i; | 
| berajay | 19:c765e311adbd | 159 | |
| berajay | 19:c765e311adbd | 160 | for (i=0; i<=n; i++){ | 
| berajay | 19:c765e311adbd | 161 | 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 | 19:c765e311adbd | 162 | //pc.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 | 19:c765e311adbd | 163 | } | 
| berajay | 19:c765e311adbd | 164 | t.reset(); | 
| berajay | 19:c765e311adbd | 165 | fclose(fp); | 
| berajay | 19:c765e311adbd | 166 | pc.printf("File successfully written!\r\n"); | 
| berajay | 19:c765e311adbd | 167 | live_writing = false; | 
| berajay | 19:c765e311adbd | 168 | wait(2); | 
| berajay | 19:c765e311adbd | 169 | } | 
| berajay | 19:c765e311adbd | 170 | }//end while writing | 
| berajay | 19:c765e311adbd | 171 | }//end while | 
| berajay | 19:c765e311adbd | 172 | }//end main | 
| cparata | 0:69566eea0fba | 173 |