|
Raspberry Pi
27) MPU6050 ( čidlo zrychlení a rotace)
- Pokus č.2: gyroskop
Po tom, kdy jsem v minulém článku vytvořil pomocí akcelerometrů z čidla MPU6050 vodováhu,
pokusil jsem se ještě rozchodit gyroskop.
Gyroskop je zařízení, které snímá okamžitou rychlost a směr otáčení
čidla. Když je tedy čidlo v klidu, je výstupem z gyroskopu téměř
nulová hodnota. Když se s čidlem z tohoto klidového stavu pootočí, výstupní
hodnota se zvětší a je udržována tak dlouho, dokud se čidlo nepřestane
otáčet. V případě, že rychlost otáčení kolísá, mění se i výstupní
hodnota.
MPU6050 je v základní konfiguraci nastavené tak, že vyhodnocuje
okamžitou rychlost otáčení 1000x za sekundu.
Při takovéto rychlosti už program v Pythonu nestíhá vyhodnocovat a
zobrazovat všechny vzorky.
Čip sice dokáže pomocí jednoho parametru tuto vzorkovací frekvenci snížit
až na 4 vzorky za sekundu, ale to není vhodné řešení. Při tomto snížení
vzorkovací frekvence dochází pouze k prodloužení pauzy mezi vzorky,
takže nemusí být vyhodnoceny krátké změny rotace.
Python tedy není kvůli rychlosti vhodným programovacím jazykem pro
vyhodnocování dat z gyroskopu.
Pro první pokusy jsem napsal v Pythonu tento program:
#!/usr/bin/python
# -*- encoding: utf-8 -*-
import smbus
import time
import math
import os,pygame
from pygame.locals import *; pygame.init()
clock = pygame.time.Clock()
os.environ['SDL_VIDEO_WINDOW_POS'] = 'center'
pygame.display.set_caption("Gyroskop")
screen = pygame.display.set_mode([400,400],pygame.DOUBLEBUF,32)
pygame.draw.line(screen,(255,255,255),(200,200),(200,200),3)
bus = smbus.SMBus(0)) # starsi varianta RasPi (256MB)
#bus = smbus.SMBus(1) # novejsi varianta RasPi (512MB)
bus.write_byte_data(0x68,0x1a,0x03) # frekvence mereni (0x00 - 0x06)
bus.write_byte_data(0x68,0x19,0x00) # delic rychlosti vzorkovani
bus.write_byte_data(0x68,0x1b,0x00) # citlivost (0x00 / 0x08 / 0x10 / 0x18 )
bus.write_byte_data(0x68,0x6b,0x00) # reset a zacatek mereni
olda2=200
oldb2=200
while True:
gyroxh = bus.read_byte_data(0x68,0x43) # horni bajt z gyroskopu X
gyroxl = bus.read_byte_data(0x68,0x44) # dolni bajt z gyroskopu X
gyrozh = bus.read_byte_data(0x68,0x47) # horni bajt z gyroskopu Z
gyrozl = bus.read_byte_data(0x68,0x48) # dolni bajt z gyroskopu Z
vystupgx = ((256 * gyroxh) + gyroxl)
vystupgz = ((256 * gyrozh) + gyrozl)
if(vystupgx & 0x8000):
vystupgx = -0x10000 + vystupgx
osab = (vystupgx / 32768.0 * 200) + 200
if(vystupgz & 0x8000):
vystupgz = -0x10000 + vystupgz
osaa = -(vystupgz / 32768.0 * 200) + 200
pygame.draw.line(screen,(0,0,0),(200,200),(olda2,oldb2),3)
olda2=osaa
oldb2=osab
pygame.draw.line(screen,(0,255,255),(200,200),(osaa,osab),3)
pygame.display.update()
|
A tady je video z činnosti předchozího programu:
|
|
|