First draft HMC5883 magnetometer sensor using physical quantities, outputting via serial port using std::cout on mbed os 5
Diff: main.cpp
- Revision:
- 3:2834be4e10ef
- Parent:
- 2:9ffb2f18756b
- Child:
- 4:53e468c49c17
--- a/main.cpp Tue Mar 24 15:21:34 2020 +0000 +++ b/main.cpp Tue Mar 24 22:43:44 2020 +0000 @@ -3,18 +3,22 @@ #include "hmc5883.h" #include <quan/max.hpp> #include <quan/min.hpp> +#include <quan/time.hpp> + +void mag_raw_values(quan::time::ms const & update_rate); +void mag_offset_calibrate(); namespace { - DigitalOut led2(LED2); - QUAN_QUANTITY_LITERAL(magnetic_flux_density,gauss); QUAN_QUANTITY_LITERAL(magnetic_flux_density,milli_gauss); QUAN_QUANTITY_LITERAL(magnetic_flux_density,uT); + QUAN_QUANTITY_LITERAL(time,ms); // terminal loop, printing message periodically void loop_forever(std::string const & str) { + DigitalOut led2(LED2); // stop but print error dynamically int count = 0; for (;;) { @@ -30,12 +34,10 @@ int main() { std::cout << "HMC5883 test\n"; - //wait for mag to init ThisThread::sleep_for(500U); - bool success = mag_detected(); - if ( success ) { + if ( mag_detected() ) { std::cout << "Detected a HMC5883\n"; } else { loop_forever("Failed to detect HMC5883"); @@ -43,53 +45,16 @@ // N.b after offsets removed mag was reading around 33.6 uT, so not bad! constexpr auto earth_magnetic_field_flux_density = 31.869_uT; - success = + bool const success = mag_set_samples_average(8) && - mag_set_data_rate<3,4>() && - // N.B if offsets are large then may need to set larger range - // prob need to cycle through looking for best range - // so this may not work mag_set_range( earth_magnetic_field_flux_density * 2U); if ( !success) { loop_forever("HMC5883 setup failed"); } + std::cout << " mag range set to " << mag_get_range() << '\n'; - std::cout << " mag range set to " << mag_get_range() << '\n'; - - // calculate the offsets dynamically by averaging - // the min and max over time - quan::three_d::vect<quan::magnetic_flux_density::uT> voffsets; - quan::three_d::vect<quan::magnetic_flux_density::uT> vmax; - quan::three_d::vect<quan::magnetic_flux_density::uT> vmin; - - auto prev = Kernel::get_ms_count(); - for (;;) { - - quan::three_d::vect<quan::magnetic_flux_density::uT> values; - if(mag_do_single_measurement(values)) { - - vmax.x = quan::max(vmax.x,values.x); - vmax.y = quan::max(vmax.y,values.y); - vmax.z = quan::max(vmax.z,values.z); - - vmin.x = quan::min(vmin.x,values.x); - vmin.y = quan::min(vmin.y,values.y); - vmin.z = quan::min(vmin.z,values.z); - - voffsets = (vmin + vmax)/2.f; - - values -= voffsets; - - std::cout << "val = " << values << '\n'; - std::cout << "off = " << voffsets << "\n\n"; - } else { - std::cout << "mag read failed\n"; - } - ThisThread::sleep_for(10U); - auto now = Kernel::get_ms_count(); - if (( now - prev)> 500){ - prev = now; - led2 = ! led2; - } - } + mag_raw_values(20_ms); + + // mag_offset_calibrate(); + } \ No newline at end of file