Example from X-NUCLEO-IKS01A3 to calibrate Magnetometer and use to read compass heading degrees without declination

Dependencies:   X_NUCLEO_IKS01A3

Files at this revision

API Documentation at this revision

Comitter:
teachloris
Date:
Tue Jun 14 20:20:06 2022 +0000
Parent:
8:f9a18e31c9d4
Commit message:
Example calibration and read magnetometer

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Thu Oct 29 12:57:19 2020 +0000
+++ b/main.cpp	Tue Jun 14 20:20:06 2022 +0000
@@ -41,113 +41,91 @@
 #include "rtos.h"
 #include "XNucleoIKS01A3.h"
 
+#define PI 3.14159
+int32_t minx,miny,minz,maxx,maxy,maxz;
+
+
 /* Instantiate the expansion board */
-static XNucleoIKS01A3 *mems_expansion_board = XNucleoIKS01A3::instance(D14, D15, D4, D5, A3, D6, A4);
+static XNucleoIKS01A3 *mems_expansion_board = XNucleoIKS01A3::instance(D14, D15);//, D4, D5, A3, D6, A4);
 
 /* Retrieve the composing elements of the expansion board */
 static LIS2MDLSensor *magnetometer = mems_expansion_board->magnetometer;
-static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
-static LPS22HHSensor *press_temp = mems_expansion_board->pt_sensor;
-static LSM6DSOSensor *acc_gyro = mems_expansion_board->acc_gyro;
-static LIS2DW12Sensor *accelerometer = mems_expansion_board->accelerometer;
-static STTS751Sensor *temp = mems_expansion_board->t_sensor;
+
 
-/* Helper function for printing floats & doubles */
-static char *print_double(char *str, double v, int decimalDigits = 2)
+void calibra()
 {
-    int i = 1;
-    int intPart, fractPart;
-    int len;
-    char *ptr;
-
-    /* prepare decimal digits multiplicator */
-    for (; decimalDigits != 0; i *= 10, decimalDigits--);
-
-    /* calculate integer & fractinal parts */
-    intPart = (int)v;
-    fractPart = (int)((v - (double)(int)v) * i);
+    int32_t axes[3];
 
-    /* fill in integer part */
-    sprintf(str, "%i.", intPart);
-
-    /* prepare fill in of fractional part */
-    len = strlen(str);
-    ptr = &str[len];
-
-    /* fill in leading fractional zeros */
-    for (i /= 10; i > 1; i /= 10, ptr++) {
-        if (fractPart >= i) {
-            break;
-        }
-        *ptr = '0';
+    magnetometer->get_m_axes(axes);
+    
+    //setto tutti i valori alla prima lettura
+    minx=axes[0];
+    miny=axes[1];
+    minz=axes[2];
+    maxx=minx;
+    maxy=miny;
+    maxz=minz;
+    //imposto un timer per leggere per 10 secondi
+    Timer t;
+    t.start();
+    while(t.read()<10){
+       
+        magnetometer->get_m_axes(axes);
+    
+        if (minx>axes[0])minx=axes[0];      
+        if (miny>axes[1])miny=axes[1];
+        if (minz>axes[2])minz=axes[2];
+        if (maxx<axes[0])maxx=axes[0];      
+        if (maxy<axes[1])maxy=axes[1];
+        if (maxz<axes[2])maxz=axes[2];
     }
-
-    /* fill in (rest of) fractional part */
-    sprintf(ptr, "%i", fractPart);
-
-    return str;
+    t.stop();
+    printf("LIS2MDL [mag/mgauss]:  minx %6d, maxx %6d, miny %6d maxy %6d\r\n", minx,maxx,miny,maxy);
+    
 }
-
+void normalizza(int32_t axes[]){
+    int32_t max,min;
+    
+    if (minx>axes[0])max=minx;
+    else max=axes[0];
+    if (max<maxx)min=max;
+    else min=maxx;
+    axes[0]=(min-minx)*200/(maxx-minx)-100;
+    
+    if (miny>axes[1])max=miny;
+    else max=axes[1];
+    if (max<maxy)min=max;
+    else min=maxy;
+    axes[1]=(min-miny)*200/(maxy-miny)-100;
+   
+    }
+    
 /* Simple main function */
 int main()
 {
     uint8_t id;
-    float value1, value2;
-    char buffer1[32], buffer2[32];
+    //float value1, value2;
+    //char buffer1[32], buffer2[32];
     int32_t axes[3];
-
+    int direzione=0;
+    
     /* Enable all sensors */
-    hum_temp->enable();
-    press_temp->enable();
-    temp->enable();
     magnetometer->enable();
-    accelerometer->enable_x();
-    acc_gyro->enable_x();
-    acc_gyro->enable_g();
-
-    printf("\r\n--- Starting new run ---\r\n");
-
-    hum_temp->read_id(&id);
-    printf("HTS221  humidity & temperature    = 0x%X\r\n", id);
-    press_temp->read_id(&id);
-    printf("LPS22HH  pressure & temperature   = 0x%X\r\n", id);
-    temp->read_id(&id);
-    printf("STTS751 temperature               = 0x%X\r\n", id);
     magnetometer->read_id(&id);
-    printf("LIS2MDL magnetometer              = 0x%X\r\n", id);
-    accelerometer->read_id(&id);
-    printf("LIS2DW12 accelerometer            = 0x%X\r\n", id);
-    acc_gyro->read_id(&id);
-    printf("LSM6DSO accelerometer & gyroscope = 0x%X\r\n", id);
-
+    calibra();
+  
+  //  magnetometer->get_m_axes(axes);
+   // printf("LIS2MDL [mag/mgauss]:  %6d, %6d, %6d\r\n", axes[0], axes[1], axes[2]);
+        
     while (1) {
-        printf("\r\n");
-
-        hum_temp->get_temperature(&value1);
-        hum_temp->get_humidity(&value2);
-        printf("HTS221: [temp] %7s C,   [hum] %s%%\r\n", print_double(buffer1, value1), print_double(buffer2, value2));
-
-        press_temp->get_temperature(&value1);
-        press_temp->get_pressure(&value2);
-        printf("LPS22HH: [temp] %7s C, [press] %s mbar\r\n", print_double(buffer1, value1), print_double(buffer2, value2));
-
-        temp->get_temperature(&value1);
-        printf("STTS751: [temp] %7s C\r\n", print_double(buffer1, value1));
-
-        printf("---\r\n");
-
+        
         magnetometer->get_m_axes(axes);
-        printf("LIS2MDL [mag/mgauss]:  %6d, %6d, %6d\r\n", axes[0], axes[1], axes[2]);
-
-        accelerometer->get_x_axes(axes);
-        printf("LIS2DW12 [acc/mg]:  %6d, %6d, %6d\r\n", axes[0], axes[1], axes[2]);
-
-        acc_gyro->get_x_axes(axes);
-        printf("LSM6DSO [acc/mg]:      %6d, %6d, %6d\r\n", axes[0], axes[1], axes[2]);
-
-        acc_gyro->get_g_axes(axes);
-        printf("LSM6DSO [gyro/mdps]:   %6d, %6d, %6d\r\n", axes[0], axes[1], axes[2]);
-
-        ThisThread::sleep_for(1500);
+        normalizza(axes);
+        direzione = atan2(axes[1], axes[0]) * 180.0 / PI;
+        direzione+=180;
+        printf("gradi=%d\r\n",direzione);
+        ThisThread::sleep_for(500);
     }
+    
+    
 }