Example from X-NUCLEO-IKS01A3 to calibrate Magnetometer and use to read compass heading degrees without declination
Dependencies: X_NUCLEO_IKS01A3
Revision 9:3486ba668395, committed 2022-06-14
- 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);
}
+
+
}