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:
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"),
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.
|