micro:bit 倾斜光点定位器:按键记住姿态,回到中心后显示确认

2026-10-31 / 0 评论 / 2 阅读

micro:bit 倾斜光点定位器:按键记住姿态,回到中心后显示确认 教程示意图

编写日期:2026-10-31。

适用场景

想做一个不用外接传感器的小作品,可以让 micro:bit 把倾斜变化显示成屏幕上的光点:向左右或前后倾斜时,光点离开中心;按 A 键记住一个摆放姿态,回到这个姿态并保持片刻后,屏幕显示对勾。

它适合练习传感器输入与二维显示,也可以用于桌面姿态重复摆放的教学演示。它不是经过校准的水平仪,不能用于施工、车辆控制或任何安全判断。保存的是相对于当前参考姿态的变化,不是地理朝向。

原理:从两个轴映射到两个坐标

加速度计返回 X、Y、Z 三个方向的加速度,单位为毫重力加速度,即千分之一标准重力加速度。板子静止倾斜时,重力在各轴上的分量发生变化;运动时,读数还包含运动造成的加速度。micro:bit 加速度计官方文档

本例先记住 X、Y 的参考值,再计算当前读数与参考值的差,将差值分成中心、内圈、外圈三个等级。为了减少轻微抖动,程序对读数做简单平滑。只有两个轴都进入更小的容差范围并持续六百毫秒,才显示确认,因此光点暂时位于中心不一定马上出现对勾。

准备工作

准备 micro:bit V2、一根可传数据的 USB 线和官方 Python 编辑器。保存板上原程序的源码或已有工程,再创建新项目。实验只用开发板自带按键、加速度计和显示屏,不连接边缘接口,也不需要额外焊接。

让板子显示面朝上,放在干燥、绝缘且稳定的表面。USB 线应留有余量,避免线材拉力改变姿态。如果选择电池供电,只使用厂商支持的电池盒,不向引脚或电池接口接入其他电压。

分步骤操作

第一步:理解屏幕坐标

micro:bit 屏幕有五行五列,左上角为坐标零、零,中心为二、二。像素亮度范围为零到九。显示屏官方文档

程序将中心点作为参考姿态,光点最远只能移动到屏幕边缘。这样的限幅可以避免大幅倾斜时产生超出屏幕范围的坐标。

第二步:输入完整程序

在编辑器中输入以下代码。所有数值都是本例的初始参数,可以先保持原样运行;代码中没有需要补填的硬件地址或连接参数。

from microbit import *

base_x = 0
base_y = 0
filtered_x = 0
filtered_y = 0
center_since = None

def save_reference():
    while button_a.is_pressed():
        sleep(20)
    display.show('C')
    sleep(300)
    total_x = 0
    total_y = 0
    for _ in range(20):
        x, y, z = accelerometer.get_values()
        total_x += x
        total_y += y
        sleep(20)
    return total_x // 20, total_y // 20

def offset(value):
    magnitude = abs(value)
    if magnitude < 150:
        return 0
    step = min(2, 1 + (magnitude - 150) // 250)
    if value < 0:
        return -step
    return step

while True:
    if button_a.was_pressed():
        base_x, base_y = save_reference()
        filtered_x = base_x
        filtered_y = base_y
        center_since = None

    x, y, z = accelerometer.get_values()
    filtered_x = (3 * filtered_x + x) // 4
    filtered_y = (3 * filtered_y + y) // 4
    dx = filtered_x - base_x
    dy = filtered_y - base_y

    close = abs(dx) < 100 and abs(dy) < 100
    now = running_time()
    if close:
        if center_since is None:
            center_since = now
    else:
        center_since = None

    if center_since is not None and now - center_since >= 600:
        display.show(Image.YES)
    else:
        display.clear()
        display.set_pixel(2, 2, 2)
        column = 2 + offset(dx)
        row = 2 + offset(dy)
        display.set_pixel(column, row, 9)

    sleep(40)

第三步:保存参考姿态

将程序写入开发板后,把板子显示面朝上摆稳,短按 A 键并松手。出现 C 时不要移动,程序会等待片刻,再连续采集二十次读数求平均。等待松手的设计可以减少持续按压带来的干扰,但仍需要你在采样期间保持板子稳定。

按键检测方法会记录自上次读取以来发生的按下事件,读取后清除记录,因此无需通过持续按住来维持校准。按键官方文档

第四步:观察光点并返回中心

缓慢向左右、前后倾斜,观察光点分别沿两个方向移动。先用小角度找出当前拿板方向与屏幕方向的对应关系,不要预设它一定像手机屏幕那样旋转。

再把板子放回参考姿态,等待对勾出现。离开容差范围后,程序会清除持续计时;再次靠近时需要重新保持六百毫秒。参考数据只存在内存中,断电或复位后需要重新按 A 键保存。

验证方法

先在同一表面完成三次“保存参考、缓慢倾斜、返回原位”,观察两个轴是否都能使光点变化。然后故意只短暂经过中心,确认不会仅凭瞬间接近就立即显示对勾。

接着保持一个轻微倾斜姿态,按 A 键重新保存。若板子随后保持不动,也应能出现对勾,这说明它判断的是相对参考姿态,而不是绝对水平。最后重启开发板,重新保存参考,确认你没有把内存数据误认为永久配置。

常见错误

快速摇晃时光点移动不能解释为准确倾角,因为此时存在运动加速度。屏幕中心的显示范围比确认范围宽,看到中心光点却暂时没有对勾属于设计行为。若光点不断跳动,先检查桌面振动和 USB 线拉力,不要立即扩大容差掩盖问题。

如果代码出现缩进错误,应检查是否混用了空格与制表符。若希望调整灵敏度,可以逐次修改分档门槛,再重复同一组动作;每次只改一项,才能判断变化来自哪里。

安全与回退

不要把板子放在导电金属片上,也不要在通电时夹接不明导线。移动时握住边缘,避免拉扯 USB 插头。停止实验可以直接断开正常供电;恢复原用途时重新写入先前保存的程序。当前作品没有外部接线和永久校准写入,重新烧录即可移除其行为。

参考资料与转载说明

本文依据上述公开资料进行中文原创整理,不是逐句翻译,也不替代厂商手册。操作前请核对自己的版本、型号和备份。

评论一下?

OωO
取消