First draft HMC5883 magnetometer sensor using physical quantities, outputting via serial port using std::cout on mbed os 5

Committer:
skyscraper
Date:
Thu Mar 26 21:59:18 2020 +0000
Revision:
10:75c8ce89aeb7
Parent:
9:87a7169b4d5c
Child:
11:de7c9ae7ef65
clean up a little

Who changed what in which revision?

UserRevisionLine numberNew contents of line
skyscraper 8:c5dc1ce10722 1
skyscraper 8:c5dc1ce10722 2 #include "magnetometer.h"
skyscraper 8:c5dc1ce10722 3 #include "quan_time.h"
skyscraper 8:c5dc1ce10722 4 #include "hmc5883.h"
skyscraper 8:c5dc1ce10722 5 #include "resourceManager.h"
skyscraper 8:c5dc1ce10722 6
skyscraper 8:c5dc1ce10722 7 namespace {
skyscraper 8:c5dc1ce10722 8 hmc5883L hmc5883L_ID1{resource::i2c1,0x3D};
skyscraper 8:c5dc1ce10722 9 }
skyscraper 8:c5dc1ce10722 10
skyscraper 8:c5dc1ce10722 11 bool mag_init()
skyscraper 8:c5dc1ce10722 12 {
skyscraper 10:75c8ce89aeb7 13 // if startup, allow magnetometer hardware time to start
skyscraper 10:75c8ce89aeb7 14 if ( Kernel::get_ms_count() < 500U){
skyscraper 10:75c8ce89aeb7 15 ThisThread::sleep_until(500U);
skyscraper 10:75c8ce89aeb7 16 }
skyscraper 10:75c8ce89aeb7 17 if (! hmc5883L_ID1.detected(true)){
skyscraper 10:75c8ce89aeb7 18 return false; // usr has been notified
skyscraper 10:75c8ce89aeb7 19 }
skyscraper 8:c5dc1ce10722 20
skyscraper 10:75c8ce89aeb7 21 hmc5883L_ID1.set_idle_mode();
skyscraper 8:c5dc1ce10722 22
skyscraper 9:87a7169b4d5c 23 // gains from calib engine
skyscraper 8:c5dc1ce10722 24 quan::three_d::vect<double> gain{1.37689,1.35057,1.56647};
skyscraper 8:c5dc1ce10722 25
skyscraper 10:75c8ce89aeb7 26 // offsets from calibration engine
skyscraper 10:75c8ce89aeb7 27 // Need an option to output raw data for calibration
skyscraper 8:c5dc1ce10722 28 quan::three_d::vect<
skyscraper 8:c5dc1ce10722 29 quan::magnetic_flux_density::uT
skyscraper 8:c5dc1ce10722 30 > offset{10.5724_uT,-10.869_uT,2.241468_uT};
skyscraper 10:75c8ce89aeb7 31
skyscraper 10:75c8ce89aeb7 32 // TODO should be max earthmagnetic field or
skyscraper 10:75c8ce89aeb7 33 // as a function of location
skyscraper 10:75c8ce89aeb7 34 constexpr auto earth_magnetic_field_flux_density = 31.869_uT;
skyscraper 10:75c8ce89aeb7 35
skyscraper 10:75c8ce89aeb7 36 return
skyscraper 10:75c8ce89aeb7 37 hmc5883L_ID1.set_samples_average(8) &&
skyscraper 10:75c8ce89aeb7 38 hmc5883L_ID1.set_range( earth_magnetic_field_flux_density * 2U) &&
skyscraper 10:75c8ce89aeb7 39 hmc5883L_ID1.set_gain(gain) &&
skyscraper 10:75c8ce89aeb7 40 hmc5883L_ID1.set_offset(offset);
skyscraper 8:c5dc1ce10722 41 }
skyscraper 8:c5dc1ce10722 42
skyscraper 8:c5dc1ce10722 43 bool mag_start_measurement()
skyscraper 8:c5dc1ce10722 44 {
skyscraper 8:c5dc1ce10722 45 return hmc5883L_ID1.start_measurement();
skyscraper 8:c5dc1ce10722 46 }
skyscraper 8:c5dc1ce10722 47
skyscraper 8:c5dc1ce10722 48 bool mag_data_ready()
skyscraper 8:c5dc1ce10722 49 {
skyscraper 8:c5dc1ce10722 50 return hmc5883L_ID1.data_ready();
skyscraper 8:c5dc1ce10722 51 }
skyscraper 8:c5dc1ce10722 52
skyscraper 8:c5dc1ce10722 53 bool mag_read(quan::three_d::vect<quan::magnetic_flux_density::uT> & v)
skyscraper 8:c5dc1ce10722 54 {
skyscraper 9:87a7169b4d5c 55 return hmc5883L_ID1.read(v);
skyscraper 8:c5dc1ce10722 56 }