sheen.bot 标志

← 深度见解

为什么你的 micro:bit 每节课都要校准指南针

2026年9月28日·Sheen Robotics
为什么你的 micro:bit 每节课都要校准指南针

micro:bit 频繁强制弹出校准小游戏,是因为断电后磁力计偏移数据会丢失,而学校的钢架课桌又会立刻干扰局部磁场。本文将介绍在 MakeCode 和 MicroPython 中解决这一问题的方法。

micro:bit 之所以在每节课刚开始时都会要求校准,主要有两个共同原因:磁力计的校准数据仅保存在易失性存储器(RAM)中,一旦拔掉开发板电源,数据就会丢失;此外,当代码首次向未校准的传感器请求朝向数据时,运行时(runtime)会自动暂停程序执行以运行校准程序。在学校环境中,教室桌椅更加剧了这一问题:标准的钢架课桌以及相邻的计算机设备会干扰局部地磁场,导致任何未经校准的读数都极不准确。

为什么学校课桌会干扰磁力计读数

micro:bit 采用了一颗集成了加速度计和磁力计的芯片(例如 v1 版本上的 LSM303 或 FXOS8700,以及 v2 版本上的 LSM303AGR)。磁力计负责测量沿三个正交轴的磁场强度和方向。在开阔的运动场上,测得的主要磁场是地球的地磁场(大约在 30 到 60 微特斯拉之间)。

然而,在标准的南非教室里,学生们坐在低碳钢管焊接的课桌前,地面下方往往是含有钢筋的钢筋混凝土楼板。附近的笔记本电脑、显示器电源适配器和充电车也会产生主动电磁场。这些因素会产生两类磁干扰:

  • 硬铁干扰(Hard iron distortion):附近的永磁体或被磁化的钢制物体会产生一个恒定的偏移量,使整个磁场圆偏离坐标原点 (0, 0, 0)。
  • 软铁干扰(Soft iron distortion):铁磁性材料(如低碳钢课桌框架)会扭曲并挤压地球磁力线,把原本应当呈球形的测量数据图谱变成一个不对称的椭球体。

当 micro:bit 重新开机时,其内部的校准矩阵是空白的。一旦某行代码调用了 compass heading 或 compass.heading(),micro:bit 运行时就会检查是否存在有效的校准矩阵。如果找不到,它便会冻结你的脚本,并启动强制倾斜校准程序(在 5x5 LED 点阵上画圈或填满像素格),以此计算硬铁和软铁补偿偏移量。

教室中的反复断电重启问题

由于默认运行时仅将校准数据存储在 RAM 中,每当学生从 USB 接口拔下 micro:bit 或切换电池盒开关时,这些偏移量就会消失。如果你的课程需要 30 名学生反复修改代码、通过 USB 烧录并运行,那么每次烧录时开发板都会经历断电重启。这意味着在短短 45 分钟的一节课内,每名学生可能要触发多达三十次校准流程。

更糟糕的是,如果学生在胸前高度悬空晃动 micro:bit 完成了校准,然后将板子放回到距离钢制桌腿仅 5 厘米的位置,磁场就会发生剧烈变化。除非运行时检测到彻底无效的磁场矢量,否则 micro:bit 不会自动察觉到基准已经发生偏移,从而导致航向读数不准或指南针指针晃动不定。

在 MakeCode 中绕过与控制校准

在 Microsoft MakeCode 中,积木块 compass heading (°) 内置了检查机制:如果磁力计未校准,它会自动调用 input.calibrateCompass()。根据课程目标,你可以采用以下三种方式来管理这一行为。

1. 如果不需要绝对航向:改用加速度计

如果你教授的是基础输入、倾斜控制或简单的方向判定(例如控制小车左转或右转),你几乎肯定不需要磁力计。教师们常常在实际只需要倾斜角(tilt)或偏航角(yaw)时误用了 compass heading。使用 rotation (pitch/roll) 或 acceleration 可以完全避开指南针子系统,且绝不会触发校准界面。

2. 在“当开机时”显式执行一次校准

如果你的项目确实需要指南针(例如定向越野或导航应用),请直接在 on start 积木块内显式调用校准,而不是让它在主循环中意外触发:

input.calibrateCompass()

指导学生站起来,将 micro:bit 拿离身体,在悬空的空气中完成倾斜校准,然后再坐下。这样可以防止在后续测试代码时校准小游戏突然打断主逻辑循环。

在 MicroPython 中管理校准

在 MicroPython 中,你对传感器的生命周期拥有更细致的控制权。你可以检查校准状态、进行非交互式校准,甚至直接注入硬编码的偏移参数。

防止阻塞式校准界面的出现

默认情况下,如果在 MicroPython 中调用 compass.heading() 时 compass.is_calibrated() 返回 False,就会唤起校准程序。你可以通过显式检查状态来防范意外的代码阻塞:

import compass

if not compass.is_calibrated():
    compass.calibrate()

while True:
    heading = compass.heading()
    # Project logic here

手动提供校准数据

如果学生在固定的实验室环境中操作,而你希望在迭代编写代码的过程中彻底消除倾斜小游戏,可以测定一次基准偏移量,将其写入非易失性存储区(micro:bit 内部 Flash 文件系统),并在开机时加载。MicroPython 提供了底层接口,可通过 compass.get_field_strength() 和校准配置方法直接设置偏移值,从而完全跳过倾斜校准步骤。

实用的课堂教学规范

为了确保机器人或编程课堂顺畅进行,避免把十分钟的时间浪费在晃动板子上:

  • 让开发板远离课桌钢架:确保 micro:bit 与任何钢制桌腿、桌面支架或显示器底座保持至少 15 到 20 厘米的距离。
  • 切勿贴在桌面上校准:如果 micro:bit 是平放在钢架课桌上校准的,它校准的其实是课桌产生的局部异常磁场。一旦学生拿起来走动,朝向读数就会完全失效。务必在腰部或胸部高度的悬空空间进行校准。
  • 评估是否真的需要绝对正北方向:在 80% 的入门级课堂任务中——比如巡线、避障或倾斜感应游戏——磁力计都不是合适的传感器。请改用惯性测量单元(加速度计)。

如需获取针对南非课堂环境配置的结构化机器人教学模块、硬件参考设计以及配套课程套件,请浏览 Sheen Canvas 上的教学指南,或在 Sheen Academy 上了解我们的教师专业发展研修工作坊。

#microbit#磁力计#makecode#micropython#机器人教学

更多深度见解