micro:bit 实验04 - 用磁力计做一个指南针

« 返回 micro:bit 平台  IoT 专题

实验04:用磁力计做一个指南针

这个实验做完你会得到什么

手机上显示 micro:bit 正对着的方位角(0~359°)和方向汉字(北/东北/东…),转动 micro:bit 数字跟着变。进阶部分再拿一块小磁铁靠近,屏幕上的小蜜蜂会跟着磁场跑。

项目 说明
难度 ★★★☆☆
用时 约 40 分钟
前置 实验01实验03(订阅套路一样)

改编自 MIT 官方教程 Flying bees with BBC Micro:bit Magnetometer sensor,扩展改用本站本地文件。


一、器材清单

器材 数量 说明
BBC micro:bit 1 用板载磁力计
小磁铁 1 可选,进阶部分用;冰箱贴那种就行

固件:MakeCode 里加 Bluetooth 扩展 + 蓝牙磁力计服务,打开 No Pairing Required

第一次用必须先校准:micro:bit 收到磁力计请求时会在点阵上显示 TILT TO FILL SCREEN, 按提示把板子朝各个方向倾斜,直到 25 个点全部点亮。不校准读数是乱的,这不是程序问题。


二、界面组件

在实验01 的连接界面基础上加:

组件 命名 关键属性
标签 标签_方位角 字号 48、粗体、居中,文本「–」
标签 标签_方向 字号 24、居中,文本「等待数据」
画布 画布1 宽度充满、高度 200(进阶部分用)
图像精灵 图像精灵_蜜蜂 放画布上,30×30
Microbit_Magnetometer Microbit_Magnetometer1 不可见,BluetoothDevice = BluetoothLE1

三、分步搭代码块

第 1 步:连上就订阅方位角

when BluetoothLE1.Connected() {
  标签_状态.Text = "已连接,请按 micro:bit 提示完成校准"
  Microbit_Magnetometer1.RequestMagnetometerBearingUpdates()
}

中途验证:micro:bit 点阵上出现校准提示(TILT TO FILL SCREEN 或转圈动画), 按提示倾斜板子把 25 个点填满。

第 2 步:显示方位角,并翻译成方向汉字

global 方位表 = list("北", "东北", "东", "东南", "南", "西南", "西", "西北")

function 方位名(角度) {
  return 方位表[round(角度 / 45) % 8 + 1]
}

when Microbit_Magnetometer1.MagnetometerBearingReceived(bearing_value) {
  标签_方位角.Text = join(round(bearing_value), "°")
  标签_方向.Text = 方位名(bearing_value)
}

中途验证:数字开始跳动,下面跟着显示方向汉字。把 micro:bit 水平放在桌上慢慢转一圈, 数字应该平滑地从 0 转到 359 再回到 0。注意 0° 是磁北,不是正北,和手机地图会有几度偏差, 正常。

为什么用查表而不是一串 if:每个方向占 45°,round(角度 / 45) 直接得到 0~8 的序号; % 8 让 8 折回 0,正好解决「北」跨越 0° 这个环形数据最容易写错的地方; 列表下标从 1 开始所以再 + 1。八个 if-else 也能写,但边界值(22.5、337.5)很容易抄错一个。


四、进阶:让蜜蜂跟着磁铁飞

方位角只有一个数,三轴磁场数据能玩得更有意思。

when 按钮_三轴.Click() {
  Microbit_Magnetometer1.RequestMagnetometerDataUpdates()
  标签_状态.Text = "拿磁铁靠近试试"
}

when Microbit_Magnetometer1.MagnetometerDataReceived(Magnetometer_X, Magnetometer_Y, Magnetometer_Z) {
  var 新X = 画布1.Width / 2 + Magnetometer_X / 200
  var 新Y = 画布1.Height / 2 + Magnetometer_Y / 200
  图像精灵_蜜蜂.MoveTo(max(0, min(画布1.Width - 30, 新X)), max(0, min(画布1.Height - 30, 新Y)))
  标签_状态.Text = join("X ", round(Magnetometer_X), " Y ", round(Magnetometer_Y), " Z ", round(Magnetometer_Z))
}

中途验证:蜜蜂停在画布中间;拿磁铁贴近 micro:bit 的不同边,蜜蜂朝对应方向跑。

除以 200 是量程缩放:磁力计原始值单位是纳特斯拉,地磁场大约几万,靠近磁铁能到几十万。 直接当像素用会瞬间飞出屏幕。这个系数按你的磁铁强度调,蜜蜂动得太猛就调大。

max/min 把坐标夹在画布内,比开「允许离开边界」更可控 —— 蜜蜂会贴着边走而不是卡住不动。


五、排错表

现象 原因与处理
micro:bit 一直显示倾斜提示 校准没做完。把板子朝各个方向慢慢转,直到 25 个点全亮;手别捂住点阵
数字乱跳、转一圈对不上 没校准;或旁边有铁质桌腿、音箱、手机等磁性物体,换个地方
方位角和手机指南针差十几度 正常,读的是磁北;且金属环境会引起偏差
359° 时方向显示错乱 查表序号没折回。round(359 / 45) 得 8,必须 % 8 变回 0 才落到「北」
蜜蜂瞬间飞出屏幕 缩放系数太小,把 / 200 调大到 / 1000 再试
三轴没数据但方位角有 方位角和三轴是两个独立订阅,要分别调 RequestMagnetometerBearingUpdatesRequestMagnetometerDataUpdates

六、下一步

  • 实验05:外接按钮 —— 开始用 P0/P1/P2 引脚接自己的元件
  • 实验08:摇一摇 —— 加速度计,和磁力计常一起用来做姿态判断

相关文档

文档反馈