First draft HMC5883 magnetometer sensor using physical quantities, outputting via serial port using std::cout on mbed os 5
magnetometer.cpp@10:75c8ce89aeb7, 2020-03-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |