加速度计

此对象使您可以访问板载加速度计。加速度计还提供用于检测手势的便利功能。识别的手势是:up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, shake.

默认情况下,MicroPython 将加速度计范围设置为 +/- 2g,目前在 MicroPython 中无法更改加速度计范围。加速度计为每个轴返回一个 0..1024 范围内的值,然后相应地缩放。

职能

microbit.accelerometer.get_x()

x 根据方向获取轴上的加速度测量值,为正整数或负整数。测量单位为毫克。默认情况下,加速度计配置为 +/- 2g 的范围,因此该方法将返回 +/- 2000mg 的范围内。

microbit.accelerometer.get_y()

y 根据方向获取轴上的加速度测量值,为正整数或负整数。测量单位为毫克。默认情况下,加速度计配置为 +/- 2g 的范围,因此该方法将返回 +/- 2000mg 的范围内。

microbit.accelerometer.get_z()

z 根据方向获取轴上的加速度测量值,为正整数或负整数。测量单位为毫克。默认情况下,加速度计配置为 +/- 2g 的范围,因此该方法将返回 +/- 2000mg 的范围内。

microbit.accelerometer.get_values()

一次性获取所有轴上的加速度测量值,作为按 X、Y、Z 排序的三元素整数元组。默认情况下,加速度计配置的范围为 +/- 2g,因此 X、Y 和 Z 将在+/-2000mg的范围内。

microbit.accelerometer.get_strength()

获取所有轴组合的加速度测量值,为正整数。这是 X、Y 和 Z 轴的勾股和,测量值以毫克为单位。

microbit.accelerometer.current_gesture()

返回当前手势的名称。

笔记

MicroPython理解以下手势名称: "up", "down", "left", "right"手势始终表示为字符串。"face up", "face down", "freefall", "3g", "6g", "8g", "shake"

microbit.accelerometer.is_gesture(name)

返回 True 或 False 以指示指定的手势当前是否处于活动状态。

microbit.accelerometer.was_gesture(name)

返回 True 或 False 以指示自上次调用以来指定的手势是否处于活动状态。

microbit.accelerometer.get_gestures()

返回手势历史的元组。最新的列在最后。还会在返回之前清除手势历史记录。

笔记

手势不会在后台更新,因此需要不断调用某些加速度计方法来进行手势检测。通常可以使用具有小microbit.sleep()延迟的循环来检测手势。

例子

算命魔术8球。提出问题,然后摇动设备以获得答案。

# Magic 8 ball by Nicholas Tollervey. February 2016.
#
# Ask a question then shake.
#
# This program has been placed into the public domain.
from microbit import *
import random

answers = [
    "It is certain",
    "It is decidedly so",
    "Without a doubt",
    "Yes, definitely",
    "You may rely on it",
    "As I see it, yes",
    "Most likely",
    "Outlook good",
    "Yes",
    "Signs point to yes",
    "Reply hazy try again",
    "Ask again later",
    "Better not tell you now",
    "Cannot predict now",
    "Concentrate and ask again",
    "Don't count on it",
    "My reply is no",
    "My sources say no",
    "Outlook not so good",
    "Very doubtful",
]

while True:
    display.show('8')
    if accelerometer.was_gesture('shake'):
        display.clear()
        sleep(1000)
        display.scroll(random.choice(answers))
    sleep(10)

简单的激流回旋。移动设备以避开障碍物。

# Simple Slalom by Larry Hastings, September 2015
#
# This program has been placed into the public domain.

import microbit as m
import random

p = m.display.show

min_x = -1024
max_x = 1024
range_x = max_x - min_x

wall_min_speed = 400
player_min_speed = 200

wall_max_speed = 100
player_max_speed = 50

speed_max = 12


while True:

    i = m.Image('00000:'*5)
    s = i.set_pixel

    player_x = 2

    wall_y = -1
    hole = 0

    score = 0
    handled_this_wall = False

    wall_speed = wall_min_speed
    player_speed = player_min_speed

    wall_next = 0
    player_next = 0

    while True:
        t = m.running_time()
        player_update = t >= player_next
        wall_update = t >= wall_next
        if not (player_update or wall_update):
            next_event = min(wall_next, player_next)
            delta = next_event - t
            m.sleep(delta)
            continue

        if wall_update:
            # calculate new speeds
            speed = min(score, speed_max)
            wall_speed = wall_min_speed + int((wall_max_speed - wall_min_speed) * speed / speed_max)
            player_speed = player_min_speed + int((player_max_speed - player_min_speed) * speed / speed_max)

            wall_next = t + wall_speed
            if wall_y < 5:
                # erase old wall
                use_wall_y = max(wall_y, 0)
                for wall_x in range(5):
                    if wall_x != hole:
                        s(wall_x, use_wall_y, 0)

        wall_reached_player = (wall_y == 4)
        if player_update:
            player_next = t + player_speed
            # find new x coord
            x = m.accelerometer.get_x()
            x = min(max(min_x, x), max_x)
            # print("x accel", x)
            s(player_x, 4, 0) # turn off old pixel
            x = ((x - min_x) / range_x) * 5
            x = min(max(0, x), 4)
            x = int(x + 0.5)
            # print("have", position, "want", x)

            if not handled_this_wall:
                if player_x < x:
                    player_x += 1
                elif player_x > x:
                    player_x -= 1
            # print("new", position)
            # print()

        if wall_update:
            # update wall position
            wall_y += 1
            if wall_y == 7:
                wall_y = -1
                hole = random.randrange(5)
                handled_this_wall = False

            if wall_y < 5:
                # draw new wall
                use_wall_y = max(wall_y, 0)
                for wall_x in range(5):
                    if wall_x != hole:
                        s(wall_x, use_wall_y, 6)

        if wall_reached_player and not handled_this_wall:
            handled_this_wall = True
            if (player_x != hole):
                # collision! game over!
                break
            score += 1

        if player_update:
            s(player_x, 4, 9) # turn on new pixel

        p(i)

    p(i.SAD)
    m.sleep(1000)
    m.display.scroll("Score:" + str(score))

    while True:
        if (m.button_a.is_pressed() and m.button_a.is_pressed()):
            break
        m.sleep(100)