Accelerometer & Gyroskop

Grundlæggende

M5StickC indeholder en bevægelsessensor, (SH200Q/MPU6886), der består af et accelerometer og et gyroskop. Bevægelsessensoren kan fx bruges til at måle:

  • hvor hurtigt man roterer (gyroskop)

  • hvor hurtigt man accelererer eller bremser (accelerometer)

  • tyngdekraften fra jorden, og dermed hvilken retning er nedad (accelerometer)

Bevægelsessensoren er derfor vigtig komponent i fx i biler til at udløse airbags, i fly til styring. I mobiltelefoner og smart watches bruges bevægelsessensoren fx til at finde ud af hvilken vej den vender, eller til den indbyggede skridttæller.

En bevægelsessensor af denne type kaldes en IMU - inertial measurement unit, og den IMU der er indbygget i M5StickC har 6 grader af frihed.

6 graders frihed, plus pitch, roll og yaw

For at starte med at bruge bevægelsessensoren, skal imu-biblioteket importeres og objektet myIMU initieres:

import imu

myIMU = imu.IMU()

Accelerometer

Accelerometeret registrerer den acceleration hvormed M5StickC bevæges i retning frem/tilbage eller op/ned langs en akse i tre dimensioner.

Man kan forestille sig at hver akse er forsynet med en lille fjeder med en vægt, og så måler om fjederen bliver strakt eller trykket sammen.

acceleration langs x-, y-, z-aksen.

Ved hjælp af myIMU.acceleration kan man hente de rå aflæsninger fra accelerometeret.:

import imu
import time

myIMU = imu.IMU()

while True:
     time.sleep_ms(10)
     print(myIMU.acceleration)

Klik på Run RUN og derefter Plotter PLOT i mu-editoren, for at få vist en graf. Bevæg M5stickC og se at dine bevægelse bliver registreret

_images/acc.gif

Hvis man skal bruge sensorens x y z målinger separeret, kan man gemme dem som enkeltstående variabler:

ax, ay, az = myIMU.acceleration

Når man holder M5StickC stille med skærmen opad, så vil man kunne måle cirka (0.0, 0.0, 1.0) Det er tyngdekraften der påvirker z-aksen. Hvis M5StickC drejes som vist på illustrationerne, vil tyngdekræften påvirke henholdsvis x- og y-aksen.

acceleration langs x-, y-, z-aksen.

Gyroskop

Gyroskopet registrerer rotationshastighed omkring en akse. Rotationshastigheden måles i antal grader per sekund.

Gyroskop, drejning x-, y-, z-aksen.

Ved at bruge myIMU.gyro kan man få vist de rå gyroskop data:

import imu
import time

myIMU = imu.IMU()

while True:
        time.sleep_ms(10)
        print(myIMU.gyro)

Hvis man skal bruge sensorens x y z målinger separeret, kan man gemme dem som enkeltstående variabler:

gx, gy, gz = myIMU.gyro

Hvis vi for eksempel starter med at holde M5StickC helt stille, så er Gyroskop aflæsningen (0, 0, 0), da den ikke roteres. Roterer vi den langsomt rundt om x aksen, fx med 30 grader hvert sekund, så vil Gyroskop-aflæsningen give (30, 0, 0).

EKSEMPEL: Registrer bevægelse

Som illustration på hvordan accelerometeret kan bruges er her eksemplekode:

import imu
import time
from m5stack import lcd

myIMU = imu.IMU()

def detectAccel(accel, threshold):
        if abs(accel) > threshold: detectAcceleration = True
        else: detectAcceleration = False
        return detectAcceleration

while True:
        time.sleep_ms(10)
        print((myIMU.acceleration))
        if detectAccel(myIMU.acceleration[0], 50):
                lcd.clear(0xFF0000)
                time.sleep_ms(1200)
        if detectAccel(myIMU.acceleration[1], 50):
                lcd.clear(0x00FF00)
                time.sleep_ms(1200)
        if detectAccel(myIMU.acceleration[2], 50):
                lcd.clear(0x0000FF)
                time.sleep_ms(1200)
        else: lcd.clear(0x000000)

EKSEMPEL: Registrer bevægelse 2

Bevægelse langs y-aksen kan aflæses på M5StcikC og i REPL:

#bibliotek til at bruge accelerometer/gyroskop
from lib import imu
#bibliotek til at bruge skærmen på M5stickC
from m5stack import lcd
#bibliotek til at bruge tidsenheder
import time

myIMU = imu.IMU()

ax, ay, az = myIMU.acceleration
ay_sidst = ay
hastighed = 0.025

while True:
        ax, ay, az = myIMU.acceleration
        if ay > ay_sidst:
                #denne linje skriver til Mu-editoren
                print('godt!')
                #denne linje sætter en baggrundsfarve på M5StickC
                lcd.clear(0x75ad0a)
                #denne linje skriver text til M5StickC
                lcd.text(5,5,"godt!")
        else:
                #denne linje skriver til Mu-editoren
                print('lidt hurtigere..')
                #denne linje sætter en baggrundsfarve på M5StickC
                lcd.clear(0xffff99)
                #denne linje skriver text til M5StickC
                lcd.text(5,5,"lidt hurtigere..")

        ay_sidst = ay+hastighed
        time.sleep_ms(300)