Micro:bit 方向偵測與應用

Micro:bit 上有加速度感測器,俗稱加速針,用來偵測Micro:bit 裝置的移動。加速針可以偵測三個方向的移動狀態,分別是x, y 與z 方向。x 方向偵測左右移動,y 方向偵測前後,z 方向偵測上下。我們可以方別利用 accelerometer.get_x(), accelerometer.get_y() 和 accelerometer.get_z() 來取得個別方向加速的數值。

透過加速計我們首先設計一個簡單平衡儀,對應程式如下:

 

 

from microbit import *
while True:
    reading = accelerometer.get_x()
    reading2 = accelerometer.get_y()
    if abs(reading)<20 and abs(reading2)<20:
        display.show("O")
    else:
        if abs(reading)>abs(reading2):
            if reading > 0:
                display.show("R")
            else:    
                display.show("L")
        else:
            if reading2 >0:
                display.show("+")
            else:
                display.show("-")
    

 

 

這個程式不考慮z 方向的作用,只考慮水平上xy 方向的偵測,可作為水平儀來應用。當xy 方向的偵測數值小於正負20時,我們當作是平的,並顯示大寫O 的字樣。 x 方向的數值為正時,代表Micro:bit 往右邊傾斜,反之是左邊。y 方向數值為正時,代表Micro:bit 往身體方向傾斜,反之亦然。

我們可以利用上列的感測方式製作一個競賽小遊戲,利用保持Micro:bit 平衡的能力來看誰是最能快速保持平衡的人。程式範例如下:

from microbit import *

flash =0
while True:
    reading = accelerometer.get_x()
    reading2 = accelerometer.get_y()
    if abs(reading)<20 and abs(reading2)<20:
        display.show("O")
        flash +=1
        if flash >3000:
            break
    else:
        flash = 0
        if abs(reading)>abs(reading2):
            if reading > 0:
                display.show("R")
            else:    
                display.show("L")
        else:
            if reading2 >0:
                display.show("+")
            else:
                display.show("-")
display.scroll("You win!")    

除了偵測Micro:bit 的平衡狀態之外,加速針更迷人的地方是可以分辨出許多有意義的動作,例如往上(up),往下(down),往左(left),往右(right),往正面朝上(face up),反面朝上(face down),3g 加速,6g 加速,8g 加速還有搖動(shake)。

我們可用下列的方式來讀取Micro:bit 的動作:

from microbit import *

while True:
    gesture = accelerometer.current_gesture()
    if gesture == "face up":
        display.show(Image.HAPPY)
    else:
        display.show(Image.ANGRY)

使用 accelerometer.current_gesture() 函數取得Micro:bit 的動作,再判斷該動作為何,進而觸動其他的程式。

下列是一個測步器的範例:

from microbit import *
n = 0
for i in range(5,0,-1):
    display.show(str(i))
    sleep(1000)
display.scroll('go')
while True:
    gesture = accelerometer.current_gesture()

    if gesture =="shake":
        n+=1
        sleep(500)
    if button_a.is_pressed():
        display.scroll(str(n))
    if button_b.is_pressed():
        display.scroll('bye bye')
        break