Utiliser l'accéléromètre

La carte microbit est livrée avec un accéléromètre. Comme sur les smartphones, elle est capable de détecter son orientation ce qui peut donner naissance à des projets originaux.

L'utilisation est très simple

1
from microbit import *
2
3
while True:
4
    accX = accelerometer.get_x()
5
    if accX > 40:
6
        display.show(">")
7
    elif accY < -40:
8
        display.show("<")
9
    else:
10
        display.show("-")

Complément

Il existe bien sûr accelerometer.get_z() et accelerometer.get_z()

Détecter des gestes

L'accéléromètre sait aussi interpréter les données d'accélération en gestes prédéfinis. Observez le code ci-dessous :

1
from microbit import *
2
3
while True:
4
    gesture = accelerometer.current_gesture()
5
    if gesture == "face up":
6
        display.show(Image.HAPPY)
7
    else:
8
        display.show(Image.ANGRY)

ComplémentGestes prédéfiniis

Les gestes reconnus sont : up, down, left, right, face up, face down, freefall, 3g, 6g, 8g, shake

Comme pour les boutons :

  • les gestes sont accumulés dans une pile que l'on peut interroger par accelerometer.get_gestures()

  • on peut détecter si un geste (par exemple une secousse) a eu lieu par accelerometer.was_gesture("shake")

  • on peut détecter si un geste est en cours par accelerometer.is_gesture("up")

ExempleMini projet : le jeu du slalom

1
# Simple Slalom by Larry Hastings, September 2015
2
#
3
# This program has been placed into the public domain.
4
5
import microbit as m
6
import random
7
8
p = m.display.show
9
10
min_x = -1024
11
max_x = 1024
12
range_x = max_x - min_x
13
14
wall_min_speed = 400
15
player_min_speed = 200
16
17
wall_max_speed = 100
18
player_max_speed = 50
19
20
speed_max = 12
21
22
23
while True:
24
25
    i = m.Image('00000:'*5)
26
    s = i.set_pixel
27
28
    player_x = 2
29
30
    wall_y = -1
31
    hole = 0
32
33
    score = 0
34
    handled_this_wall = False
35
36
    wall_speed = wall_min_speed
37
    player_speed = player_min_speed
38
39
    wall_next = 0
40
    player_next = 0
41
42
    while True:
43
        t = m.running_time()
44
        player_update = t >= player_next
45
        wall_update = t >= wall_next
46
        if not (player_update or wall_update):
47
            next_event = min(wall_next, player_next)
48
            delta = next_event - t
49
            m.sleep(delta)
50
            continue
51
52
        if wall_update:
53
            # calculate new speeds
54
            speed = min(score, speed_max)
55
            wall_speed = wall_min_speed + int((wall_max_speed - wall_min_speed) * speed / speed_max)
56
            player_speed = player_min_speed + int((player_max_speed - player_min_speed) * speed / speed_max)
57
58
            wall_next = t + wall_speed
59
            if wall_y < 5:
60
                # erase old wall
61
                use_wall_y = max(wall_y, 0)
62
                for wall_x in range(5):
63
                    if wall_x != hole:
64
                        s(wall_x, use_wall_y, 0)
65
66
        wall_reached_player = (wall_y == 4)
67
        if player_update:
68
            player_next = t + player_speed
69
            # find new x coord
70
            x = m.accelerometer.get_x()
71
            x = min(max(min_x, x), max_x)
72
            # print("x accel", x)
73
            s(player_x, 4, 0) # turn off old pixel
74
            x = ((x - min_x) / range_x) * 5
75
            x = min(max(0, x), 4)
76
            x = int(x + 0.5)
77
            # print("have", position, "want", x)
78
79
            if not handled_this_wall:
80
                if player_x < x:
81
                    player_x += 1
82
                elif player_x > x:
83
                    player_x -= 1
84
            # print("new", position)
85
            # print()
86
87
        if wall_update:
88
            # update wall position
89
            wall_y += 1
90
            if wall_y == 7:
91
                wall_y = -1
92
                hole = random.randrange(5)
93
                handled_this_wall = False
94
95
            if wall_y < 5:
96
                # draw new wall
97
                use_wall_y = max(wall_y, 0)
98
                for wall_x in range(5):
99
                    if wall_x != hole:
100
                        s(wall_x, use_wall_y, 6)
101
102
        if wall_reached_player and not handled_this_wall:
103
            handled_this_wall = True
104
            if (player_x != hole):
105
                # collision! game over!
106
                break
107
            score += 1
108
109
        if player_update:
110
            s(player_x, 4, 9) # turn on new pixel
111
112
        p(i)
113
114
    p(i.SAD)
115
    m.sleep(1000)
116
    m.display.scroll("Score:" + str(score))
117
118
    while True:
119
        if (m.button_a.is_pressed() and m.button_a.is_pressed()):
120
            break
121
        m.sleep(100)