Micro:bit 重力控制水平仪

上一节 的教程里,我们学习了如何使用 Micro:bit 在线编程网站提供的选择、循环、按钮事件和游戏精灵模块实现一个简单的模拟传球小程序,这回我们来学习一下如何使用 Micro:bit 的重力模块,用它实现一个重力控制上下左右滑动的 LED,相当于一个水平仪。这节教程将会有 3 种水平仪的实现,分别是敏捷版、智障版和优化版,从简单到复杂,我们可以从中体会不同的实现带来的不同效果。

敏捷版

Micro:bit 重力控制水平仪

智障版
Micro:bit 重力控制水平仪

优化版
Micro:bit 重力控制水平仪

可以看出

  1. 敏捷版 最灵敏,基本上是跟随鼠标移动的方向(实际上是板子的倾斜方向)进行移动

  2. 智障版 就很智障了,只能动一下挪一下,感觉特别懒

  3. 优化版 介于敏捷版和智障版之间,能跟随重力方向自动移动,并且加上了一定延迟,使得 led 的变化更加自然

3 轴传感器

Micro:bit 板子上集成了一个 3 轴传感器,水平方向 (按钮 A 到 按钮 B) 的方向为 X 轴,垂直方向 ( 徽标(徽标就是那个椭圆形中间两个小点点像个娃娃头一样的) 到 引脚孔 2) 为 Y 轴,垂直穿过板子为 Z 轴,每个轴的加速度范围都是 -1024 到 1024,具体方向见下图
Micro:bit 重力控制水平仪

今天的这篇教程不涉及 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 灯来回跑啦。
Micro:bit 重力控制水平仪

解释如下:

  1. 给 X 和 Y 方向的加速度 加 1024,换算成正值,范围变成 0 ~ 2048

  2. 由于 X 和 Y 方向只有 5 个 LED,需要换算坐标,用 2048 / 5 约等于 410,所以用 2048 / 410 向下取整(10/3=3.3333 向下取整为 3,向上取整为 4)后得到 0、1、2、3、4 这 5 个整数


实现如下:

  1. 当开机时,在 (2,2) 处创建一个精灵

  2. 无限循环读取 X 方向的加速度,加 1024 后除以 410,得到的结果用来改变精灵的 X 坐标

  3. 无限循环读取 Y 方向的加速度,加 1024 后除以 410,得到的结果用来改变精灵的 Y 坐标

Micro:bit 重力控制水平仪

是不是很简单呀


智障版

实现智障版需要用到 4 个事件,位于 输入 分类下的 当振动 事件,我们会用到的是 当徽标朝上 当徽标朝下 当向左倾斜当向右倾斜 这 4 个事件
Micro:bit 重力控制水平仪

解释如下:

  1. 当徽标朝上 即水平放置板子后,向上倾斜板子,也就是徽标一端翘起,此时 Y 方向加速度为正

  2. 当徽标朝上 即水平放置板子后,向下倾斜板子,也就是有引脚孔的一端翘起,此时 Y 方向加速度为负

  3. 当向左倾斜 即水平放置板子后,向左倾斜板子,也就是按钮 B 所在的一端翘起,此时 X 方向加速度为负

  4. 当向右倾斜 即水平放置板子后,向右倾斜板子,也就是按钮 A 所在的一端翘起,此时 X 方向加速度为正


实现如下:

  1. 当开机时,在 (2,2) 处创建一个精灵

  2. 当徽标朝上 精灵的 Y 坐标 加 1

  3. 当徽标朝下 精灵的 Y 坐标 减 1 (加 -1)

  4. 当向左倾斜 精灵的 X 坐标 减 1 (加 -1)

  5. 当向右倾斜 精灵的 X 坐标 加 1

Micro:bit 重力控制水平仪

但是这个有个缺点,就是每次都要移动一次板子才能触发事件,也就是向左移动一次板子,精灵向左移动 1 步,其他方向同理,下面我们看看优化版。


优化版

为了达到精灵自动移动的效果,我们需要用到循环,时刻检测板子在 X Y 方向上的加速度,并控制精灵向该方向自动移动,为了精灵不至于移动太快,我加上了一个 500 毫秒的延迟,同时为了降低灵敏度,使得板子倾斜一定程度精灵才移动,因此我加上了阈值,300  (反方向移动为 -300)。


实现如下:

  1. 当开机时,在 (2,2) 处创建一个精灵

  2. 创建1个循环,判断 X 方向的加速度值,如果大于 300,则让精灵的 X 坐标  加 1,暂停 500 毫秒

  3. 创建1个循环,判断 X 方向的加速度值,如果小于 -300,则让精灵的 X 坐标 减 1 (加 -1),暂停 500 毫秒

  4. 创建1个循环,判断 Y 方向的加速度值,如果大于 300,则让精灵的 Y 坐标  加 1,暂停 500 毫秒

  5. 创建1个循环,判断 Y 方向的加速度值,如果小于 -300,则让精灵的 Y 坐标 减 1 (加 -1),暂停 500 毫秒


这样就可以让 精灵 自动向倾斜方向移动啦

Micro:bit 重力控制水平仪


练习题

改变优化版中 阈值 300 和 延迟 500 毫秒的数值,体会这两个值不同数值下的效果。


有问题可以在微信公众号中给我发消息呦。

始发于微信公众号: 暴王不暴燥

打赏

猜你喜欢

博主开通了微信公众号,欢迎关注啦

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.