mpu 9250ジャイロ振り回す小記

11452 ワード

mpu 9250を買って振り回し始めて、たくさんの資料を探して、たくさんの文章を見て、mpu 9250の資料は多くありません.
i 2 cを使用してベリーパイのsclにリンクし、sdaインタフェースvccは3 vに足を引っ張り、gndはベリーパイgndに接続すればokです.
振り回され始める:
mpuを操作するにはmpuのレジスタを使ってパラメータの設定と読み取りを実現しなければならないので、公式ダウンロード資料を取って見て、githubでpythonコードを探して、バグが多すぎて、それから簡略化しました.
やっとデータを読み取ることができて、読み取ったデータはすべて6バイトで、それからこの兄たちがpythonでmpuを読み取ってバイトの合併をしていないことを発見して、書き直して、それからデータはすべて整数で、私がどのように数字を回転しても正で、ネット上の1枚の文章を見てレジスタ度が出てきたのは1つの符号のない整数だと言いました.
しばらく考えていたのですが、携帯電話でジャイロアプリをダウンロードしてみるとマイナス数が出ることに気づき、軸と反対方向に運動するとマイナス数が出ることに気づき、ctypesを考えてintに強制変換しました.今回のデータは正数とマイナス数があるように見えますが、ジャイロが平らに置いている間に本を読むメリットが大きすぎて3000以上になりました.明らかにそうではありません.この数字は少し変換してやっと使うことができるようで、私はN余りの資料を探して、ついに個人のmpu 6050のコードの中で探し当てて、1つの固定的な常亮があって、彼はacc_を使いますxはこの固定定数を乗じて、それから私はテストして、確かに実行することができて、加速計の値を16.4を乗じて正しい値を得ることができます!
 
ジャイロの読数は13.を乗じなければならない.私は半日探しても見つからなかった.なぜ16.4を乗じたのか、探さなかった.もしこの文章を見て、なぜ16.4を乗じたのか知っている人がいたら、伝言やメールをください[email protected]ありがとう
次のコードを使用するにはsmbusライブラリをインストールする必要があります.ベリーパイで直接sudo apt-get install py-smbusをインストールすればokです.
pythonコードは次のとおりです.
import smbus
import sched, time
import binascii
from threading import Timer, Thread, Event
from struct import *
import ctypes
from math import acos

import sched, time
import binascii
from struct import *

i2c = smbus.SMBus(1)
addr = 0x68
t0 = time.time()


# ====== initial zone ======
try:
device_id = i2c.read_byte_data(addr, 0x75)
print "Device ID:" + str(hex(device_id))
print "MPU9250 I2C Connected."
print ""
except:
print "Connect failed"
print ""
i2c.write_byte_data(0x68, 0x6a, 0x00)
time.sleep(0.05);
i2c.write_byte_data(0x68, 0x37, 0x02)
i2c.write_byte_data(0x0c, 0x0a, 0x16)

# set frequence for accelerator
i2c.write_byte_data(0x68, 29, 9)


# enable fifo and dmp
# i2c.write_byte_data(0x68 , 106 , 32+64);

# ====== intial done ======



def mpu9250_data_get_and_write():
# global t_a_g

# keep AKM pointer on continue measuring
i2c.write_byte_data(0x0c, 0x0a, 0x16)
# get MPU9250 smbus block data
# xyz_g_offset = i2c.read_i2c_block_data(addr, 0x13, 6)
xyz_a_out = i2c.read_i2c_block_data(addr, 0x3B, 6)
print("xyz_a_out" + str(list2word(xyz_a_out, calc_accelerator_value)))
# print("xyz_a_out_org#:"+str(xyz_a_out))

xyz_g_out = i2c.read_i2c_block_data(addr, 0x43, 6)
print("xyz_g_out" + str(list2word(xyz_g_out, calc_gyro_value)))
# xyz_a_offset = i2c.read_i2c_block_data(addr, 0x77, 6)

# get AK8963 smb#us data (by pass-through way)
xyz_mag = i2c.read_i2c_block_data(0x0c, 0x03, 6)
# print("xyz_mag"+str(list2word(xyz_mag)))
xyz_mag_adj = i2c.read_i2c_block_data(0x0c, 0x10, 3)


def list2word(data_list=[], callback=''):
data = data_list[:]
if not len(data):
return [];

result = []
for i in range(3):
high_byte = data.pop(0)
low_byte = data.pop(0)
result.append(callback(float(ctypes.c_int16(((high_byte << 8) | low_byte)).value)))

return result


def calc_accelerator_value(value):
return round(value / 16.4)


def calc_gyro_value(value):
return round(value / 131)


def clear_i2c_and_close_file():
i2c.write_byte_data(addr, 0x6A, 0x07)


# solution 1: while true
def while_true_method():
# max_count = raw_input("Enter how many count you want.")
max_count = 100;
if max_count < 1: max_count = 1000
print "Data Counts: " + str(max_count)

max_count = int(max_count)
count = 1

print ""
print "MPU9250 9axis DATA Recording..."
while True:
# if count <= max_count:
mpu9250_data_get_and_write()
count += 1
time.sleep(0.5)
# else:
pass
# break;


while_true_method();

転載先:https://www.cnblogs.com/raffeale/p/5571711.html