实验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 再试 |
| 三轴没数据但方位角有 | 方位角和三轴是两个独立订阅,要分别调 RequestMagnetometerBearingUpdates 和 RequestMagnetometerDataUpdates |
六、下一步
- 实验05:外接按钮 —— 开始用 P0/P1/P2 引脚接自己的元件
- 实验08:摇一摇 —— 加速度计,和磁力计常一起用来做姿态判断
相关文档
- Microbit_Magnetometer 组件参考
- 官方原版教程(英文,已标注过时):MIT_App_Inventor_Microbit_Magnetometer.pdf
扫码添加客服咨询