在 上一节 的教程里,我们学习了如何使用 Micro:bit 在线编程网站提供的选择、循环、按钮事件和游戏精灵模块实现一个简单的模拟传球小程序,这回我们来学习一下如何使用 Micro:bit 的重力模块,用它实现一个重力控制上下左右滑动的 LED,相当于一个水平仪。这节教程将会有 3 种水平仪的实现,分别是敏捷版、智障版和优化版,从简单到复杂,我们可以从中体会不同的实现带来的不同效果。
敏捷版
智障版
优化版
可以看出
敏捷版 最灵敏,基本上是跟随鼠标移动的方向(实际上是板子的倾斜方向)进行移动
智障版 就很智障了,只能动一下挪一下,感觉特别懒
优化版 介于敏捷版和智障版之间,能跟随重力方向自动移动,并且加上了一定延迟,使得 led 的变化更加自然
3 轴传感器
Micro:bit 板子上集成了一个 3 轴传感器,水平方向 (按钮 A 到 按钮 B) 的方向为 X 轴,垂直方向 ( 徽标(徽标就是那个椭圆形中间两个小点点像个娃娃头一样的) 到 引脚孔 2) 为 Y 轴,垂直穿过板子为 Z 轴,每个轴的加速度范围都是 -1024 到 1024,具体方向见下图
今天的这篇教程不涉及 Z 轴,只关心 X 轴和 Y 轴。水平放置板子,徽标朝上时,两个方向的加速度分别是 X = 0, Y = 0,在模拟器中,默认状态就相当于水平放置板子,即徽标朝向屏幕外,正对你。
基本原理
当板子水平倾斜时,会有一个 X 方向的加速度,当从按钮 A 向 按钮 B 倾斜,X 方向加速度为 正值,即大于零的值,0~1024,当从按钮 B 向 按钮 A倾斜,X 方向加速度为负值,即小于零的值,-1024~0,为了便于计算,我们给 X 方向的加速度值加上 1024,使范围变为 0~2048,这样就不用考虑负值的情况了
当板子垂直倾斜时,会有一个 Y 方向的加速度,当从 徽标 向 引脚孔 2 倾斜,Y 方向加速度为 正,0~1024,当从 引脚孔 2 向 徽标 倾斜,Y 方向加速度为负值,-1024~0,同样的,我们给 Y 方向的加速度值加上 1024,使范围变为 0~2048。
当板子同时向 水平方向 和 垂直方向 倾斜时,既有 X 方向 也有 Y 方向的加速度
当板子倾斜时,加速度会一直存在,直到板子被水平放置
敏捷版
敏捷版的思路比较简单,我们会用到 输入 分类下的 加速度值 模块,它提供了读取 3 轴方向上的加速度值的能力,我们可以把 X 轴的加速度和 Y 轴的加速度换算成 LED 灯阵的坐标,这样就可以控制 LED 灯来回跑啦。
解释如下:
给 X 和 Y 方向的加速度 加 1024,换算成正值,范围变成 0 ~ 2048
由于 X 和 Y 方向只有 5 个 LED,需要换算坐标,用 2048 / 5 约等于 410,所以用 2048 / 410 向下取整(10/3=3.3333 向下取整为 3,向上取整为 4)后得到 0、1、2、3、4 这 5 个整数
实现如下:
当开机时,在 (2,2) 处创建一个精灵
无限循环读取 X 方向的加速度,加 1024 后除以 410,得到的结果用来改变精灵的 X 坐标
无限循环读取 Y 方向的加速度,加 1024 后除以 410,得到的结果用来改变精灵的 Y 坐标
是不是很简单呀
智障版
实现智障版需要用到 4 个事件,位于 输入 分类下的 当振动 事件,我们会用到的是 当徽标朝上 当徽标朝下 当向左倾斜 和 当向右倾斜 这 4 个事件
解释如下:
当徽标朝上 即水平放置板子后,向上倾斜板子,也就是徽标一端翘起,此时 Y 方向加速度为正
当徽标朝上 即水平放置板子后,向下倾斜板子,也就是有引脚孔的一端翘起,此时 Y 方向加速度为负
当向左倾斜 即水平放置板子后,向左倾斜板子,也就是按钮 B 所在的一端翘起,此时 X 方向加速度为负
当向右倾斜 即水平放置板子后,向右倾斜板子,也就是按钮 A 所在的一端翘起,此时 X 方向加速度为正
实现如下:
当开机时,在 (2,2) 处创建一个精灵
当徽标朝上 精灵的 Y 坐标 加 1
当徽标朝下 精灵的 Y 坐标 减 1 (加 -1)
当向左倾斜 精灵的 X 坐标 减 1 (加 -1)
当向右倾斜 精灵的 X 坐标 加 1
但是这个有个缺点,就是每次都要移动一次板子才能触发事件,也就是向左移动一次板子,精灵向左移动 1 步,其他方向同理,下面我们看看优化版。
优化版
为了达到精灵自动移动的效果,我们需要用到循环,时刻检测板子在 X Y 方向上的加速度,并控制精灵向该方向自动移动,为了精灵不至于移动太快,我加上了一个 500 毫秒的延迟,同时为了降低灵敏度,使得板子倾斜一定程度精灵才移动,因此我加上了阈值,300 (反方向移动为 -300)。
实现如下:
当开机时,在 (2,2) 处创建一个精灵
创建1个循环,判断 X 方向的加速度值,如果大于 300,则让精灵的 X 坐标 加 1,暂停 500 毫秒
创建1个循环,判断 X 方向的加速度值,如果小于 -300,则让精灵的 X 坐标 减 1 (加 -1),暂停 500 毫秒
创建1个循环,判断 Y 方向的加速度值,如果大于 300,则让精灵的 Y 坐标 加 1,暂停 500 毫秒
创建1个循环,判断 Y 方向的加速度值,如果小于 -300,则让精灵的 Y 坐标 减 1 (加 -1),暂停 500 毫秒
这样就可以让 精灵 自动向倾斜方向移动啦
练习题
改变优化版中 阈值 300 和 延迟 500 毫秒的数值,体会这两个值不同数值下的效果。
有问题可以在微信公众号中给我发消息呦。
作者微信公众号:bw_bbz,欢迎关注。