micro:bit加速度感測應用
Revised on August 9, 2021
 速度與加速度
 三軸加速度計
 三軸加速度計控制指令
 實作練習
 電子骰子
 運動方向指示器
 傾斜移動控制
 平衡控制遊戲
 地震偵測器
 速度定義為位置相對於時間的變化率,也可以稱為瞬時速度,以強調
與平均速度的區別
 𝑣
⃑
∆
∆
 加速度(m/s2)是速度向量(m/s)對於時間的變化率,描述速度的方向
和大小變化的快慢
 𝑎
⃑
 ⼀段時間內平均的速度變化,稱為平均加速度
 在極短時間內平均的速度變化,稱為瞬時加速度
 𝑣 𝑣 𝑎𝑡 𝑣 :末速,𝑣 :初速,𝑎:加速度,𝑡:時間
速度與加速度 1/2
2
速度與加速度 2/2
https://youtu.be/byngcwjO51U
3
 原理:透過可移動物體在固定電極片移動產生電容值差值,換算物體
重心的位移和方向
 搖晃micro:bit時會聽到「喀啦~喀啦~」的碰撞聲,就是三軸加速度計
內部移動體的碰撞聲
micro:bit三軸加速度計 1/2
4
固定電極片
移動體
固定電極片
X
Z
Y
X
Y Z
 MMA8653FC
micro:bit三軸加速度計 2/2
5
 讀取三軸加速度計三維度中其中⼀個的加速度值,或是所有維度的合
⼒,單位為千分之⼀G⼒ (重⼒加速度G = 9.80665m/s2)
strength3D = Math.sqrt(accelX * accelX + accelY * accelY + accelZ * accelZ)
三軸加速度計控制指令 1/2
6
X (left & right)
Y (back & forth)
Z (up & down)
 動作偵測
 分析加速度計3個軸向數值變化來推斷使用者操作micro:bit之動作
 晃動
 下側偏低
 上側偏低
 正面朝上
 背面朝上
 左側偏低
 右側偏低
 自由掉落
 3G動⼒、6G動⼒、8G動⼒
三軸加速度計控制指令 2/2
7
 初始顯示?,搖晃micro:bit控制板後隨機顯示1~6點,3秒後回復顯
示?
 隨機指令
實作練習 - 電子骰子 1/5
8
實作練習 - 電子骰子 2/5
9
分別編輯骰子點數,置入選擇結構中
 Python程式
def on_gesture_shake():
global Roll
Roll = randint(1, 6)
if Roll == 1:
basic.show_leds("""
. . . . .
. . . . .
. . # . .
. . . . .
. . . . .
""")
elif Roll == 2:
basic.show_leds("""
. . . . .
. . . # .
. . . . .
. # . . .
. . . . .
""")
實作練習 - 電子骰子 3/5
10
elif Roll == 3:
basic.show_leds("""
. . . . #
. . . . .
. . # . .
. . . . .
# . . # .
""")
elif Roll == 4:
basic.show_leds("""
. . . . .
. # . # .
. . . . .
. # . # .
. . . . .
""")
elif Roll == 5:
basic.show_leds("""
. . . . .
. # . # .
. . # . .
. # . # .
. . . . .
""")
實作練習 - 電子骰子 4/5
11
else:
basic.show_leds("""
. # . # .
. . . . .
. # . # .
. . . . .
. # . # .
""")
basic.pause(3000)
basic.show_string("?")
input.on_gesture(Gesture.SHAKE, on_gesture_shake)
Roll = 0
basic.show_string("?")
def on_forever():
pass
basic.forever(on_forever)
實作練習 - 電子骰子 5/5
12
實作練習 - 運動方向指示器 1/5
 顯示micro:bit控制板運動方向
 使用方向箭頭指示micro:bit控制板左右及前後移動,上下移動以大小菱
形表示
13
實作練習 - 運動方向指示器 2/5
14
實作練習 - 運動方向指示器 3/5
15
 Python程式
forward_backward = 0
up_down = 0
left_right = 0
def check_Y():
if forward_backward >= 1200:
basic.show_arrow(ArrowNames.NORTH)
if forward_backward <= -1200:
basic.show_arrow(ArrowNames.SOUTH)
def check_Z():
if up_down >= 100:
basic.show_icon(IconNames.SMALL_DIAMOND)
if up_down <= -2000:
basic.show_icon(IconNames.DIAMOND)
def check_X():
if left_right >= 1200:
basic.show_arrow(ArrowNames.WEST)
if left_right <= -1200:
basic.show_arrow(ArrowNames.EAST)
實作練習 - 運動方向指示器 4/5
16
def on_forever():
global left_right, forward_backward, up_down
left_right = input.acceleration(Dimension.X)
forward_backward = input.acceleration(Dimension.Y)
up_down = input.acceleration(Dimension.Z)
check_X()
check_Y()
check_Z()
basic.forever(on_forever)
實作練習 - 運動方向指示器 5/5
17
 光點(ball)初始位於正中央
 傾斜micro:bit來控制光點往低處移動
實作練習 - 傾斜移動控制 1/2
18
實作練習 - 傾斜移動控制 2/2
19
 光點初始位於正中央
 傾斜micro:bit來控制光點在點矩陣內部移動,每移動⼀格得1分,光
點碰到邊緣則結束遊戲
實作練習 - 平衡控制遊戲 1/5
20
實作練習 - 平衡控制遊戲 2/5
21
實作練習 - 平衡控制遊戲 3/5
22
 Python程式
def moving():
if input.acceleration(Dimension.X) > 150:
ball.change(LedSpriteProperty.X, 1)
score += 1
if input.acceleration(Dimension.X) < -150:
ball.change(LedSpriteProperty.X, -1)
score += 1
if input.acceleration(Dimension.Y) > 150:
ball.change(LedSpriteProperty.Y, 1)
score += 1
if input.acceleration(Dimension.Y) < -150:
ball.change(LedSpriteProperty.Y, -1)
score += 1
def isTouchingEdge():
if ball.is_touching_edge():
game.set_score(score)
game.game_over()
實作練習 - 平衡控制遊戲 4/5
23
ball = game.create_sprite(2, 2)
score = 0
def on_forever():
moving()
isTouchingdge()
basic.pause(200)
basic.forever(on_forever)
實作練習 - 平衡控制遊戲 5/5
24
實作練習 - 地震偵測器 1/3
25
實作練習 - 地震偵測器 2/3
26
實作練習 - 地震偵測器 3/3
27

micro:bit加速度感測應用