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:

Odkaz na YouTube

 

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 13.12.2012