python脚本读取MPU6050数据

# -  *  - 编码: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)
            打破
                

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值