# - * - 编码:UTF-8 - * -
导入smbus
导入串行
进口pynmea2
进口时间
类mpu6050:
#全局变量
GRAVITIY_MS2 = 9.80665
地址=无
巴士=无
#缩放修饰符
ACCEL_SCALE_MODIFIER_2G = 16384.0#加速灵敏度
ACCEL_SCALE_MODIFIER_4G = 8192.0
ACCEL_SCALE_MODIFIER_8G = 4096.0
ACCEL_SCALE_MODIFIER_16G = 2048.0
GYRO_SCALE_MODIFIER_250DEG = 131.0#陀螺灵敏度
GYRO_SCALE_MODIFIER_500DEG = 65.5
GYRO_SCALE_MODIFIER_1000DEG = 32.8
GYRO_SCALE_MODIFIER_2000DEG = 16.4
#预先定义的范围
ACCEL_RANGE_2G = 0x00
ACCEL_RANGE_4G = 0x08
ACCEL_RANGE_8G = 0x10
ACCEL_RANGE_16G = 0x18
GYRO_RANGE_250DEG = 0x00
GYRO_RANGE_500DEG = 0x08
GYRO_RANGE_1000DEG = 0x10
GYRO_RANGE_2000DEG = 0x18
#MPU-6050寄存器
PWR_MGMT_1 = 0x6B
PWR_MGMT_2 = 0x6C
ACCEL_XOUT0 = 0x3B
ACCEL_YOUT0 = 0x3D
ACCEL_ZOUT0 = 0x3F
TEMP_OUT0 = 0x41
GYRO_XOUT0 = 0x43
GYRO_YOUT0 = 0x45
GYRO_ZOUT0 = 0x47
ACCEL_CONFIG = 0x1C
GYRO_CONFIG = 0x1B
def __init __(self,address,bus = 1):
self.address =地址
self.bus = smbus.SMBus(巴士)
#从睡眠模式启动后唤醒MPU-6050
self.bus.write_byte_data(self.address,self.PWR_MGMT_1,0x00)
#I2C通信方法
def read_i2c_word(self,register):#MPU6050采用的是16位带符号数作为测量数据输出
msgstr“”“读取两个i2c寄存器并将它们合并。#参考http://www.bspilot.com/?p=145
寄存器 - 第一个读取寄存器。
返回组合的读取结果。
“””
#从寄存器读取数据
high = self.bus.read_byte_data(self.address,register)
low = self.bus.read_byte_data(self.address,register + 1)
值=(高<< 8)+低
if(value> = 0x8000):
返回 - ((65535 - 值)+ 1)
其他:
返回值
#MPU-6050方法
def get_temp(self):
“”“从MPU-6050的板载温度传感器读取温度。
以摄氏度为单位返回温度。
“””
raw_temp = self.read_i2c_word(self.TEMP_OUT0)
#使用表中给出的表格获取实际温度
#MPU-6050寄存器映射和描述修订4.2,第30页
actual_temp =(raw_temp / 340.0)+ 36.53
返回actual_temp
def set_accel_range(self,accel_range):
“”“将加速度计的范围设置为范围。
accel_range - 设置加速度计的范围。用一个
建议预先定义的范围。
“””
#首先将它改为0x00,以确保我们稍后写入正确的值
self.bus.write_byte_data(self.address,self.ACCEL_CONFIG,0x00)
#将新的范围写入ACCEL_CONFIG寄存器
self.bus.write_byte_data(self.address,self.ACCEL_CONFIG,accel_range)
def read_accel_range(self,raw = False):
“”“读取加速度计设置的范围。
如果raw为True,它将从ACCEL_CONFIG返回原始值
寄存器
如果raw为False,它将返回一个整数:-1,2,4,8或16.当它
返回-1出错了。
“””
raw_data = self.bus.read_byte_data(self.address,self.ACCEL_CONFIG)
如果raw为真:
返回raw_data
elif raw is False:
如果raw_data == self.ACCEL_RANGE_2G:
返回2
elif raw_data == self.ACCEL_RANGE_4G:
返回4
elif raw_data == self.ACCEL_RANGE_8G:
返回8
elif raw_data == self.ACCEL_RANGE_16G:
返回16
其他:
返回-1
def get_accel_data(self,g = False):
“”“获取并返回加速度计的X,Y和Z值。
如果g为真,它将返回g中的数据
如果g为假,它将以m / s ^ 2返回数据
返回包含测量结果的字典。
“””
x = self.read_i2c_word(self.ACCEL_XOUT0)
y = self.read_i2c_word(self.ACCEL_YOUT0)
z = self.read_i2c_word(self.ACCEL_ZOUT0)
accel_scale_modifier =无
accel_range = self.read_accel_range(True)
如果accel_range == self.ACCEL_RANGE_2G:
accel_scale_modifier = self.ACCEL_SCALE_MODIFIER_2G
elif accel_range == self.ACCEL_RANGE_4G:
accel_scale_modifier = self.ACCEL_SCALE_MODIFIER_4G
elif accel_range == self.ACCEL_RANGE_8G:
accel_scale_modifier = self.ACCEL_SCALE_MODIFIER_8G
elif accel_range == self.ACCEL_RANGE_16G:
accel_scale_modifier = self.ACCEL_SCALE_MODIFIER_16G
其他:
打印(“未知范围 - accel_scale_modifier设置为self.ACCEL_SCALE_MODIFIER_2G”)
accel_scale_modifier = self.ACCEL_SCALE_MODIFIER_2G
x = x / accel_scale_modifier
y = y / accel_scale_modifier
z = z / accel_scale_modifier
如果g为真:
return {'x':x,'y':y,'z':z}
elif g is False:
x = x * self.GRAVITIY_MS2
y = y * self.GRAVITIY_MS2
z = z * self.GRAVITIY_MS2
return {'x':x,'y':y,'z':z}
def set_gyro_range(self,gyro_range):
“”“将陀螺仪的范围设置为范围。
陀螺仪范围 - 设置陀螺仪的范围。使用预定义的
建议范围。
“””
#首先将它改为0x00,以确保我们稍后写入正确的值
self.bus.write_byte_data(self.address,self.GYRO_CONFIG,0x00)
#将新的范围写入ACCEL_CONFIG寄存器
self.bus.write_byte_data(self.address,self.GYRO_CONFIG,gyro_range)
def read_gyro_range(self,raw = False):
“”“读取陀螺仪设置的范围。
如果raw为True,它将从GYRO_CONFIG返回原始值
寄存器。
如果raw为False,它将返回250,500,1000,2000或-1。如果
返回的值等于-1出错了。
“””
raw_data = self.bus.read_byte_data(self.address,self.GYRO_CONFIG)
如果raw为真:
返回raw_data
elif raw is False:
如果raw_data == self.GYRO_RANGE_250DEG:
返回250
elif raw_data == self.GYRO_RANGE_500DEG:
回报500
elif raw_data == self.GYRO_RANGE_1000DEG:
返回1000
elif raw_data == self.GYRO_RANGE_2000DEG:
返回2000年
其他:
返回-1
def get_gyro_data(self):
“”“获取并返回陀螺仪的X,Y和Z值。
返回字典中的读取值。
“””
x = self.read_i2c_word(self.GYRO_XOUT0)
y = self.read_i2c_word(self.GYRO_YOUT0)
z = self.read_i2c_word(self.GYRO_ZOUT0)
gyro_scale_modifier =无
gyro_range = self.read_gyro_range(True)
如果gyro_range == self.GYRO_RANGE_250DEG:
gyro_scale_modifier = self.GYRO_SCALE_MODIFIER_250DEG
elif gyro_range == self.GYRO_RANGE_500DEG:
gyro_scale_modifier = self.GYRO_SCALE_MODIFIER_500DEG
elif gyro_range == self.GYRO_RANGE_1000DEG:
gyro_scale_modifier = self.GYRO_SCALE_MODIFIER_1000DEG
elif gyro_range == self.GYRO_RANGE_2000DEG:
gyro_scale_modifier = self.GYRO_SCALE_MODIFIER_2000DEG
其他:
打印(“未知范围 - gyro_scale_modifier设置为self.GYRO_SCALE_MODIFIER_250DEG”)
gyro_scale_modifier = self.GYRO_SCALE_MODIFIER_250DEG
x = x / gyro_scale_modifier
y = y / gyro_scale_modifier
z = z / gyro_scale_modifier
return {'x':x,'y':y,'z':z}
def get_all_data(self):
“”“读取并返回所有可用数据。”“”
temp = self.get_temp()
accel = self.get_accel_data()
陀螺仪= self.get_gyro_data()
返回[加速度,陀螺仪,温度]
如果__name __ ==“__ main__”:
MPU = mpu6050(0x68)中
TEMP_DATA = mpu.get_temp()
accel_data = mpu.get_accel_data()
gyro_data = mpu.get_gyro_data()
SER = serial.Serial( “的/ dev / ttyAMA0”,9600)
而真:
行= ser.readline()
如果line.startswith('$ GPRMC'):
RMC = pynmea2.parse(线)
rmc.lat = STR(浮动(rmc.lat)/ 100)
rmc.lon = STR(浮动(rmc.lon)/ 100)
打开('/ home / pi / Desktop / test.txt','a')为f:
'''f.write(STR(TEMP_DATA))
f.write(STR(accel_data [ 'X']))
f.write(STR(accel_data [ 'Y'))
f.write(STR(accel_data [ 'Z'))
f.write(STR(gyro_data [ 'X']))
f.write(STR(gyro_data [ 'Y'))
f.write(STR(gyro_data [ 'Z')) ''”
f.write(rmc.lat)
f.write(rmc.lon)
打破
python脚本读取MPU6050数据
最新推荐文章于 2025-02-20 16:01:47 发布