Raspberry Pi

26) MPU6050 ( čidlo zrychlení a rotace)
         - Pokus č.1: náklonoměr

Další z obvodů, které jsem k Raspíčku připojil, byl obvod MPU6050. 
Katalogový list je tady a popis registrů tady.

Obvod přidělaný na plošném spoji s nějakými doplňkovými součástkami jsem sehnal na eBayi za necelých 10$, ale dá se sehnat i na ověřených čínských  e-shopech (třeba tady ). Někdy se prodává na společné desce s magnetometrem (kompasem) nebo i s čidlem atmosférického tlaku (výškoměrem). Ale pak jsou ty ceny o dost vyšší. Takovéto obvody využívají hlavně letečtí modeláři k řízení svých strojů. 

Deska, kterou jsem si koupil já, obsahuje pouze obvod MPU6050 s několika dalšími součástkami (viz fotka).
Tento obvod má v sobě tři druhy čidel:

1) Tříosý akcelerometr (měřič zrychlení).
2) Tříosý gyroskop.
3) Pomocný (ne moc přesný) teploměr.

Pro zprovoznění základních funkcí ho stačí připojit čtyřmi dráty na napájení a na sběrnici I2C (+3,3V, GND, SDA, SCL).
Pro pokročilejší funkce je možné využít i další vývody. 

První pokus, který jsem s obvodem provedl, bylo vytvoření jednoduchého náklonoměru. Využívám při tom jeden z vnitřních  akcelerometrů, který měří gravitační tíhové zrychlení.

Vzhledem k tomu, že údaj z čidla není moc stabilní, musel jsem naměřené údaje průměrovat.
Po zprůměrování 200 hodnot už je údaj stabilní. Vypočtený úhel náklonu pak kolísá jen o desetinu stupně.

Program v Pythonu:

#!/usr/bin/python
# -*- encoding: utf-8 -*-

import smbus
import time
import math


#bus = smbus.SMBus(0) # starsi varianta RasPi (256MB)
bus = smbus.SMBus(1) # novejsi varianta RasPi (512MB)

bus.write_byte_data(0x68,0x6b,0x00) # reset a zacatek mereni (I2C adresa obvodu je 0x68)


# Pokus o jednoduchou trojbodovou kalibraci pomoci cisla ktere
#   posila cip do promenne "vystupaz" pri meznich polohach senzoru
# (cisla plati pro muj senzor, vy je budete mit trochu jine)

nulaz = 430     # pri vodorovne orientaci je v promenne "vystupaz" cislo 430
maxz  = 16969   # pri svislem smeru (90°) je tam cislo 16969
minz  = -16102  # pri 90° na opacnou stranu je tam cislo -16120


while True:     # "nekonecna" smycka

  sumaz = 0     # nulovani souctu pro prumerovani



  for sampl in range (200):  # smycka pro prumerovani 200 vzorku (kvuli stabilite mereni)
    data = bus.read_i2c_block_data(0x68,0x3a)
    vystupaz = ((256 * data[1]) + data[2])

    if(vystupaz & 0x8000):
      vystupaz = -0x10000 + vystupaz

    sumaz= float(sumaz) + vystupaz 



  prumerz = round(sumaz / 200.0 ,1)  # prumer ze 200 vzorku zaokrouhleny na desetinu
#  print prumerz   # zrusit komentar pri kalibraci krajnich poloh 

# Prepocet z prumerneho cisla ziskaneho z cidla na uhel ve stupnich
#    pro kladne a zaporne uhly
# Bylo to spis experimentovani - v ostatnich osach jsou ty vypocty trochu pootocene
# Dulezite je si uvedomit, ze cislo z cipu (vystupaz) neni
#    primo umerne uhlu natoceni, ale jeho sinu (nebo kosinu)

  if (prumerz > nulaz):
    if (prumerz > maxz):
      prumerz = maxz

    paramz= ( (prumerz-nulaz) / float(maxz-nulaz))
    stupnez = round(math.degrees(math.acos( paramz ))-90.0,1)
  else:
    if (prumerz < minz):
      prumerz = minz

    paramz= ( (prumerz-nulaz) / float(nulaz-minz))
    stupnez = round(math.degrees(math.acos( paramz ))-90.0,1)


  print "naklon = " + str(stupnez) + " stupnu"


Pak jsem ještě přidal měření náklonu ve druhé ose a trochu jsem upravil program, aby se naměřená hodnota zobrazovala na připojeném displeji. Tím jsem vlastně vytvořil dvouosou vodováhu.

Tady je video:

Odkaz na YouTube

 Příště se o tomto obvodu rozepíšu víc a zkusím i nějaké experimenty s gyroskopy.


Doplnění 8.12.2012

A tady ještě jedno video, ve kterém jsem využil Pythonovské kreslící nástroje (PYGAME) pro vykreslení nakloněné čáry v závislosti na úhlu natočení čidla. Výuka Pygame probíhá v online časopisu The MagPi (od druhého čísla, v pravidelném sloupku "The Python Pit"),


Odkaz na YouTube

 

Zdroják programu pro zobrazení nakloněné čáry, který vychází z výše uvedeného kódu si můžete stáhnout a prozkoumat tady.

 

 

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 26.10.2013