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();

  

附:寄存器地址

#define SMPLRT_DIV                 0X19 //陀螺仪采样率典型值为0X07 1000/(1+7)=125HZ

#define CONFIG                         0X1A //低通滤波器  典型值0x06 5hz

#define GYRO_CONFIG                0X1B //陀螺仪测量范围 0X18 正负2000度

#define ACCEL_CONFIG            0X1C //加速度计测量范围 0X18 正负16g

#define ACCEL_CONFIG2           0X1D //加速度计低通滤波器 0x06 5hz

#define PWR_MGMT_1                  0X6B//电源管理1 典型值为0x00

#define PWR_MGMT_2                 0X6C //电源管理2 典型值为0X00

 

#define WHO_AM_I                    0X75 //器件ID MPU9250默认ID为0X71

#define USER_CTRL                   0X6A //用户配置当为0X10时使用SPI模式

 

#define MPU9250_CS        PDout(3) //MPU9250片选信号

#define I2C_ADDR                    0X68  //i2c的地址   

#define ACCEL_XOUT_H            0X3B  //加速度计输出数据

#define ACCEL_XOUT_L            0X3C

#define ACCEL_YOUT_H            0X3D

#define ACCEL_YOUT_L            0X3E

#define ACCEL_ZOUT_H            0X3F

#define ACCEL_ZOUT_L            0X40

 

#define TEMP_OUT_H               0X41  //温度计输出数据

#define TEMP_OUT_L               0X42

 

#define GYRO_XOUT_H              0X43  //陀螺仪输出数据

#define GYRO_XOUT_L              0X44

#define GYRO_YOUT_H              0X45

#define GYRO_YOUT_L              0X46

#define GYRO_ZOUT_H              0X47

#define GYRO_ZOUT_L                 0X48

当然以上的都是把数据手册的地址进行定义

  

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

  1. MPU9250九轴陀螺仪--连接MPU9250

    树莓派连接MPU9250九轴加速度传感器1,配线方法 树莓派侧 MPU9250侧 3.3V VCC (SDA)GPIO2 SDA (SCL)GPIO3 SCL GND GND 2,I2C有效在树莓派里 ...

  2. Beaglebone Black – 连接 GY-91 MPU9250+BMP280 九轴传感器(1)

    本篇内容为,通过 I2C 配置 GY-91 MPU9250+BMP280 里面的 MPU9250 连接 AK8963 磁感应.两个办法,1)MPU9250 设置 Master Mode 通过 AUX ...

  3. SLAM+语音机器人DIY系列:(三)感知与大脑——2.带自校准九轴数据融合IMU惯性传感器

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...

  4. Beaglebone Black – 连接 GY-91 MPU9250+BMP280 九轴传感器(2)

    这次用 SPI.BBB 有两套 SPI 接口可用,两套都是默认 disable,需要用 overlay 方式启用,即: echo BB-SPIDEV0 > /sys/devices/bone_c ...

  5. Google Cardboard的九轴融合算法——基于李群的扩展卡尔曼滤波

    Google Cardboard的九轴融合算法 --基于李群的扩展卡尔曼滤波 极品巧克力 前言 九轴融合算法是指通过融合IMU中的加速度计(三轴).陀螺仪(三轴).磁场计(三轴),来获取物体姿态的方法 ...

  6. 使用JSON Schema来验证接口数据

    最近在做一些关于JSON Schema的基建,JSON Schema可以描述一个JSON结构,那么反过来他也可以来验证一个JSON是否符合期望的格式. 如果之前看我写的<使用joi来验证数据模型 ...

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

    基于事件触发方式的串行通信接口数据接收案例 广东职业技术学院  欧浩源 一.案例背景 之前写过一篇<基于多线程方式的串行通信接口数据接收案例>的博文,讨论了采用轮询方式接收串口数据的情况. ...

  8. node.js爬取ajax接口数据

    爬取页面数据与爬取接口数据,我还是觉得爬取接口数据更加简单一点,主要爬取一些分页的数据. 爬取步骤: 1.明确目标接口地址,举个例子 : https://www.vcg.com/api/common/ ...

  9. 三轴陀螺仪与加速度计如何辅助 iPhone 定位的

    在所有之前解释一下陀螺仪 根据Wiki的定义:「陀螺仪是用于测量角度或维持方向的设备,基于角动量守恒原理.」 这句话的要点是测量角度或维持方向,这是 iPhone 4 为何搭载此类设备的原因.机械陀螺 ...

随机推荐

  1. 更强大的python正则表达式模块 -- regex

    python内置的正则表达库re比较弱,而且似乎在好几年里都没太大的变化. 这里介绍这个python模块regex,实现了更多方便好用的功能. 比如:\p{han} 可以匹配汉字, \p{Latin} ...

  2. goroutine和channel

    近期在学习golang的goroutine和channel时候有一些疑惑: 带缓冲的channel和不带缓冲的channel有什么区别? goroutine和主进程的有哪些影响和关系? 多个gorou ...

  3. dos4章

    批处理中的变量,我把他分为两类,分别为"系统变量"和"自定义变量" 我们现在来详解这两个变量! 一.系统变量 他们的值由系统将其根据事先定义的条件自动赋值,也就 ...

  4. Application对象及常用方法

    Application对象: 服务器启动后,就产生了这个application对象.当一个客户访问服务器上的一个JSP页面时,JSP引擎为该客户分配这个 application对象,当客户在所访问的网 ...

  5. IIs实验,中间件漏洞

    实验一.IIS实验 1.修改端口   开始→管理工具→Internet 信息服务(IIS)管理器,属性,将端口改为 8080 如图: 2.    IP 地址绑定 前面步骤同第一题一样,将 Ip 改为本 ...

  6. 2018-软工机试-D-定西

    单点时限: 1.0 sec 内存限制: 256 MB 这么多年你一个人一直在走 方向和天气的节奏会让你忧愁 你说你遇见了一大堆奇怪的人 他们看上去好像都比你开心 ——李志<定西> 这首歌的 ...

  7. jQuery-3.事件篇---键盘事件

    jQuery键盘事件之keydown()与keyup()事件 鼠标有mousedown,mouseup之类的事件,这是根据人的手势动作分解的2个触发行为.相对应的键盘也有这类事件,将用户行为分解成2个 ...

  8. Spring MVC 上下文(ApplicationContext)初始化入口

    Spring 常用上下文容器有哪些 ApplicationContext ClassPathXmlApplicationContext ApplicationContext context = new ...

  9. Sqlite 参数化 模糊查询 解决方案

    转自:https://codedefault.com/2018/does-dapper-support-the-like-operator-in-csharp-application 问题描述 如题, ...

  10. C语言权威指南和书单 - 中等级别

    注:点击标题免费下载电子书 1. Object-oriented Programming with ANSI-C 2. C Interfaces and Implementations 3. 21st ...