Калибровка магнитометра
Очень важно перед использованием датчика и разработкой приложения с ним проверить, что его данные действительно правильны. Если это не так, датчик нужно откалибровать. Также датчик может быть сломан: по возможности полезно проверять работоспособность датчиков до и во время использования.
В моём случае на двух разных MB2 магнитометр LSM303AGR без калибровки заметно врёт. (У меня есть ещё один, у которого, похоже, сломана ось Z; у производителя есть дополнительное оборудование и процедура, которые помогают это выявить, но разбираться в этой сложности здесь мы не будем.)
У производителя есть описанная процедура калибровки магнитометра. Калибровка включает довольно много математики (матрицы), поэтому подробно разбирать её здесь не будем: если интересны детали, в этой технической заметке описана процедура.
К счастью, группа CODAL, которая создала исходное программное обеспечение micro:bit на C++, уже реализовала механизм калибровки производителя (или что-то похожее) на C++ здесь.
Перевод этой калибровки с C++ на Rust находится в src/lib.rs. Обратите внимание, что это перевод с Matlab на C++, а затем на Rust, и в нём сделаны некоторые интересные решения. В частности, при чтении откалиброванных значений оси переворачиваются, так что при взгляде сверху, с USB-разъёмом вперёд, оси X, Y и Z откалиброванного значения имеют «стандартную» ориентацию (вправо, вперёд, вверх).
Использование этого калибратора показано в src/main.rs.
Как пользователь проводит калибровку, показано в этом видео из версии на C++. (Начальный вывод можно пропустить: калибровка начинается примерно на середине.)
Нужно наклонять micro:bit, пока не загорятся все светодиоды матрицы. Мигающий курсор показывает текущий целевой светодиод.
Обратите внимание: матрица калибровки выводится демонстрационной программой. Эту матрицу можно «зашить» прямо в программу, например в компас из главы 13 (или как-то сохранить во флеш-памяти), чтобы не калибровать датчик при каждом запуске программы.