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 01:58:30 2020 +0000
Revision:
6:cc08f2d64773
Parent:
5:47026facc081
Child:
8:c5dc1ce10722
add gain of magnetometer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
skyscraper 0:37dbfb036586 1
skyscraper 0:37dbfb036586 2 #include "mbed.h"
skyscraper 2:9ffb2f18756b 3 #include "hmc5883.h"
skyscraper 0:37dbfb036586 4 #include <quan/max.hpp>
skyscraper 0:37dbfb036586 5 #include <quan/min.hpp>
skyscraper 3:2834be4e10ef 6 #include <quan/time.hpp>
skyscraper 3:2834be4e10ef 7
skyscraper 4:53e468c49c17 8 void mag_adjusted_values(
skyscraper 4:53e468c49c17 9 quan::time::ms const & update_rate,
skyscraper 6:cc08f2d64773 10 quan::three_d::vect<double> const & gains,
skyscraper 6:cc08f2d64773 11 quan::three_d::vect<quan::magnetic_flux_density::uT> const & offsets
skyscraper 4:53e468c49c17 12 );
skyscraper 3:2834be4e10ef 13 void mag_raw_values(quan::time::ms const & update_rate);
skyscraper 3:2834be4e10ef 14 void mag_offset_calibrate();
skyscraper 0:37dbfb036586 15
skyscraper 2:9ffb2f18756b 16 namespace {
skyscraper 2:9ffb2f18756b 17
skyscraper 2:9ffb2f18756b 18 QUAN_QUANTITY_LITERAL(magnetic_flux_density,gauss);
skyscraper 2:9ffb2f18756b 19 QUAN_QUANTITY_LITERAL(magnetic_flux_density,milli_gauss);
skyscraper 2:9ffb2f18756b 20 QUAN_QUANTITY_LITERAL(magnetic_flux_density,uT);
skyscraper 3:2834be4e10ef 21 QUAN_QUANTITY_LITERAL(time,ms);
skyscraper 0:37dbfb036586 22
skyscraper 2:9ffb2f18756b 23 // terminal loop, printing message periodically
skyscraper 2:9ffb2f18756b 24 void loop_forever(std::string const & str)
skyscraper 2:9ffb2f18756b 25 {
skyscraper 3:2834be4e10ef 26 DigitalOut led2(LED2);
skyscraper 2:9ffb2f18756b 27 // stop but print error dynamically
skyscraper 2:9ffb2f18756b 28 int count = 0;
skyscraper 2:9ffb2f18756b 29 for (;;) {
skyscraper 2:9ffb2f18756b 30 led2 = 1;
skyscraper 2:9ffb2f18756b 31 std::cout << str << " " << count++ << '\n';
skyscraper 2:9ffb2f18756b 32 ThisThread::sleep_for(200U);
skyscraper 2:9ffb2f18756b 33 led2 = 0;
skyscraper 2:9ffb2f18756b 34 ThisThread::sleep_for(800U);
skyscraper 2:9ffb2f18756b 35 }
skyscraper 0:37dbfb036586 36 }
skyscraper 0:37dbfb036586 37 }// namespace
skyscraper 0:37dbfb036586 38
skyscraper 0:37dbfb036586 39 int main()
skyscraper 0:37dbfb036586 40 {
skyscraper 0:37dbfb036586 41 std::cout << "HMC5883 test\n";
skyscraper 0:37dbfb036586 42 //wait for mag to init
skyscraper 0:37dbfb036586 43 ThisThread::sleep_for(500U);
skyscraper 0:37dbfb036586 44
skyscraper 3:2834be4e10ef 45 if ( mag_detected() ) {
skyscraper 0:37dbfb036586 46 std::cout << "Detected a HMC5883\n";
skyscraper 0:37dbfb036586 47 } else {
skyscraper 0:37dbfb036586 48 loop_forever("Failed to detect HMC5883");
skyscraper 0:37dbfb036586 49 }
skyscraper 0:37dbfb036586 50
skyscraper 5:47026facc081 51 // N.b after offsets removed mag was reading around 34.49 uT, so not bad!
skyscraper 0:37dbfb036586 52 constexpr auto earth_magnetic_field_flux_density = 31.869_uT;
skyscraper 3:2834be4e10ef 53 bool const success =
skyscraper 0:37dbfb036586 54 mag_set_samples_average(8) &&
skyscraper 0:37dbfb036586 55 mag_set_range( earth_magnetic_field_flux_density * 2U);
skyscraper 0:37dbfb036586 56 if ( !success) {
skyscraper 0:37dbfb036586 57 loop_forever("HMC5883 setup failed");
skyscraper 0:37dbfb036586 58 }
skyscraper 3:2834be4e10ef 59 std::cout << " mag range set to " << mag_get_range() << '\n';
skyscraper 2:9ffb2f18756b 60
skyscraper 6:cc08f2d64773 61 //gains form calib engine
skyscraper 6:cc08f2d64773 62 quan::three_d::vect<double> gains{1.37689,1.35057,1.56647};
skyscraper 6:cc08f2d64773 63
skyscraper 4:53e468c49c17 64 // offsets from calib engine
skyscraper 4:53e468c49c17 65 quan::three_d::vect<
skyscraper 4:53e468c49c17 66 quan::magnetic_flux_density::uT
skyscraper 6:cc08f2d64773 67 > offsets{10.5724_uT,-10.869_uT,2.241468_uT};
skyscraper 4:53e468c49c17 68
skyscraper 6:cc08f2d64773 69 mag_adjusted_values(20_ms,gains,offsets);
skyscraper 4:53e468c49c17 70 // mag_raw_values(20_ms);
skyscraper 3:2834be4e10ef 71 // mag_offset_calibrate();
skyscraper 3:2834be4e10ef 72
skyscraper 0:37dbfb036586 73 }