九轴陀螺仪--读接口数据

1.使用i2c链接到树莓派的scl , sda 接口vcc给3v引脚,gnd接树莓派gnd就ok。

2.要操作mpu必须使用mpu的寄存器实现对参数的设定以及读取,取官方下载资料看了一下,在github上找了一个python代码,运行不了bug太多了,然后精简了一下。终于能读出数据了,读出来的数据都是6个字节的,后来发现这哥们用python 读取mpu没有做字节合并,重写了一下,后来发现数据都是整数,不管我怎么旋转数字都是正的,看了网上的一片文章说寄存器度出来的是一个无符号整数。后来想了半天,用手机下了一个陀螺仪app发现会出现负数的情况,只要向相对轴相反方向做运动就会出现负数,于是想了ctypes,强制转换成int这回数据看起来是有正数和负数了,不过在陀螺仪平放着的时候读书优点太大了都达到3000以上了,明显不是,貌似是这个数字需要转换一下才能使用,我找了N多的资料,终于找到有个人mpu6050的代码里,有一个固定的常亮,他使用acc_x乘以这个固定的常数,然后我测试了一下,确实可行,只要将加速计的值乘以16.4就可以得到正确的值!

陀螺仪读数要乘以13.我搜索了半天也没有找到为什么要乘以16.4 ,不找了,如果有人看到这篇文章知道为啥乘以16.4请留言,谢谢

使用如下代码需要安装smbus库,在树莓派直接 sudo apt-get install py-smbus就ok了

3.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/onekey/p/10553711.html

时间: 2024-08-27 06:07:09

九轴陀螺仪--读接口数据的相关文章

陀螺仪以及三轴陀螺仪和六轴陀螺仪的区别_六轴陀螺仪和九轴陀螺仪的区别

来源:电子发烧友 链接:http://www.elecfans.com/article/88/142/2017/20171201590857.html 陀螺仪,是一种用来感测与维持方向的装置,基於角动量不灭的理论设计出来的.陀螺仪主要是由一个位於轴心可以旋转的轮子构成. 陀螺仪一旦开始旋转,由於轮子的角动量,陀螺仪有抗拒方向改变的趋向.陀螺仪多用於导航.定位等系统. 1850年法国的物理学家福柯(J.Foucault)为了研究地球自转,首先发现高速转动中的转子(rotor),由于惯性作用它的旋转

Beaglebone Black &ndash; 连接 GY-91 MPU9250+BMP280 九轴传感器(1)

最初看到淘宝上面有卖 GY91 MPU9250+BMP280 时候,它写着九轴,是九个轴.地球上原来除了 X Y Z 之外,难道还有四五维空间里面的 6 个轴,看清楚后,原来所谓的九轴,是陀螺仪三轴,加速度三轴,磁感应三轴(指南针),才叫做九轴.MPU9250 是 InvenSense 出品,它本身就是一个模块集成了三个东西,还有个自身的温度计(芯片温度),FIFO,Digital Motion Processor(DMP,就是姿势识别,计步器那些),Interrupt(可惜 INT 脚在 GY

Beaglebone Black &ndash; 连接 GY-91 MPU9250+BMP280 九轴传感器(2)

这次用 SPI.BBB 有两套 SPI 接口可用,两套都是默认 disable,需要用 overlay 方式启用,即: echo BB-SPIDEV0 > /sys/devices/bone_capemgr.9/slots 我的 BBB 当前配置当前配置 /opt/source/Userspace-Arduino/overlay/BB-SPI0-01-00A0.dts /dts-v1/; /plugin/; / {     compatible = "ti,beaglebone"

QT开发(四十九)——数据库用户接口层

QT开发(四十九)--数据库用户接口层 用户接口层主要包括Qt SQL模块中的QSqlQueryModel.QSqlTableModel.QSqlRelationalTableModel.用户接口层的类实现了将数据库中的数据链接到窗口部件上,是使用模型/视图框架实现的,是更高层次的抽象,即便不熟悉SQL也可以操作数据库.需要注意的是,在使用用户接口层的类之前必须先实例化QCoreApplication对象. QT中使用了自己的机制来避免使用SQL语句,提供了更简单的数据库操作及数据显示模型,分别

chart.js的X轴步长和X轴Labels旋转角度接口

一. 当初为什么选择chart.js 当初项目使用库是Zepto,Zepto能支持的chart处理库太少.也是为了使得项目比较轻量化,所以选择了chart.js. 但是最后的显示结果实在太差,放弃了char.js,还是使用jquery+highstock来完成chart需求. 总而言之,项目的chart需求较低,项目要求较轻量,可以使用chart.js. 这里列出几个chart.js缺少的接口. 二. chart.js缺少的接口 1. x轴步长. bug:数值很多,x轴显示的labels重合在一

【ALB学习笔记】基于事件触发方式的串行通信接口数据接收案例

基于事件触发方式的串行通信接口数据接收案例 广东职业技术学院  欧浩源 1.案例背景 之前写过一篇<基于多线程方式的串行通信接口数据接收案例>的博文,讨论了采用轮询方式接收串口数据的情况.经过使用了多线程来处理,而然轮询的办法比较还是比较笨拙的.我们在实际的项目开发中,更加常用的是基于事件触发的方式,这个方式不但好用,而且灵活,只是使用起来需要更多的一点专业知识.在本博文中,就"传感器模块每隔1秒钟向上位机传送4字节的电压数据帧"的项目,对该方法的设计进行详细的讲述.  

ngrep环回接口数据抓取方法,使用-d lo参数

ngrep环回接口数据抓取方法,使用-d lo参数,注意顺序: ngrep -W byline -d lo port 80

读&lt;&lt;大数据时代&gt;&gt;的一些感想

第一次听说<<大数据时代>>这本书,是在网上看到的央视搞的一个2013中国好书评选活动推荐的25本"中国好书"的榜单中看到的.然后迅速上豆瓣上查看了一下对该书的评价,一看非常高,再加上央视的推荐是从2013在中国出版的40册图书中选出25本,可以说是精华了.果断定了一本,花了三天时间读完了.   大数据这个名词或者说概念从被提出开始,经过短短几年的发展,已经传的沸沸扬扬了,经常见诸媒体上.好像哪家媒体的科技板块每天不弄一些这样的新闻条,它就显得不够档次一样.这是

288-基于XC7K325T的3U VPX FMC接口数据收发预处理平台

基于XC7K325T的3U VPX FMC接口数据收发预处理平台 一.板卡概述       标准VPX 3U板卡, 基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8.64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持各种接口输入,软件支持windows,Linux驱动.,可应用于高性能计算,频域算法,如与FFT的加速等:配合AD,DA FMC子卡,实现高速数据采集,回放.