树莓派python编程读取电压_在树莓派上通过Python读取MPU-6050的数据

在前一篇文章:MPU6050如何与树莓派进行连接 中,我们讨论了如何将加速计和陀螺传感器连接到树莓派,在这篇文章中,我们继续探讨通过一些简单的Python代码来读取传感器MPU6050输出的数据。

前期代码验证

要通过Python从I2C总线上读取相应数据,首先需要在树莓派上安装 smbus 模块,安装代码如下:

sudo apt-get install python-smbus

现在我们可以通过以下代码来进行测试了,这只是一些简单的测试代码,目的是测试传感器是否正常工作:

#!/usr/bin/python

import smbus

import math

# Power management registers

power_mgmt_1 = 0x6b

power_mgmt_2 = 0x6c

def read_byte(adr):

return bus.read_byte_data(address, adr)

def read_word(adr):

high = bus.read_byte_data(address, adr)

low = bus.read_byte_data(address, adr+1)

val = (high << 8) + low return val def read_word_2c(adr): val = read_word(adr) if (val >= 0x8000):

return -((65535 - val) + 1)

else:

return val

def dist(a,b):

return math.sqrt((a*a)+(b*b))

def get_y_rotation(x,y,z):

radians = math.atan2(x, dist(y,z))

return -math.degrees(radians)

def get_x_rotation(x,y,z):

radians = math.atan2(y, dist(x,z))

return math.degrees(radians)

bus = smbus.SMBus(0) # or bus = smbus.SMBus(1) for Revision 2 boards

address = 0x68 # This is the address value read via the i2cdetect command

# Now wake the 6050 up as it starts in sleep mode

bus.write_byte_data(address, power_mgmt_1, 0)

print "gyro data"

print "---------"

gyro_xout = read_word_2c(0x43)

gyro_yout = read_word_2c(0x45)

gyro_zout = read_word_2c(0x47)

print "gyro_xout: ", gyro_xout, " scaled: ", (gyro_xout / 131)

print "gyro_yout: ", gyro_yout, " scaled: ", (gyro_yout / 131)

print "gyro_zout: ", gyro_zout, " scaled: ", (gyro_zout / 131)

print

print "accelerometer data"

print "------------------"

accel_xout = read_word_2c(0x3b)

accel_yout = read_word_2c(0x3d)

accel_zout = read_word_2c(0x3f)

accel_xout_scaled = accel_xout / 16384.0

accel_yout_scaled = accel_yout / 16384.0

accel_zout_scaled = accel_zout / 16384.0

print "accel_xout: ", accel_xout, " scaled: ", accel_xout_scaled

print "accel_yout: ", accel_yout, " scaled: ", accel_yout_scaled

print "accel_zout: ", accel_zout, " scaled: ", accel_zout_scaled

print "x rotation: " , get_x_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)

print "y rotation: " , get_y_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)

运行代码后,我们将看到类似下表的输出结果:

gyro data

---------

gyro_xout: -92 scaled: -1

gyro_yout: 294 scaled: 2

gyro_zout: -104 scaled: -1

accelerometer data

------------------

accel_xout: -3772 scaled: -0.230224609375

accel_yout: -52 scaled: -0.003173828125

accel_zout: 15408 scaled: 0.9404296875

x rotation: -13.7558411667

y rotation: -0.187818934829

解析加速度计的数据

让我们更详细地了解一下测试代码,

accel_xout = read_word_2c(0x3b)

accel_yout = read_word_2c(0x3d)

accel_zout = read_word_2c(0x3f)

这三行代码用于读取X,Y,Z的加速度计数值,每个参数调用的是存放在传感器寄存器中的数据。MPU6050传感器有许多寄存器,它们具有不同的功能,详见MPU6050的datasheet。用于加速数据的寄存器是0x3b、0x3d、0x3f,这些寄存器以16bit二进制补码的格式保存原始数据。

下面的代码从一个给定的寄存器中读取一个单字(16bits)并将其转换为二进制补码:

def read_word_2c(adr):

val = read_word(adr)

if (val >= 0x8000):

return -((65535 - val) + 1)

else:

return val

一旦我们获取了原始数据,我们就需要对它进行转换,然后把它转换成类似于旋转角度的数据。从MPU6050的datasheet数据表中我们可以看到,我们需要应用到原始加速度计值的默认转换值是16384,

所以我们用这个值除以原始数据值。

accel_xout_scaled = accel_xout / 16384.0

accel_yout_scaled = accel_yout / 16384.0

accel_zout_scaled = accel_zout / 16384.0

现在我们得到了每个三维空间中重力对传感器施加的值,通过这个值我们可以计算出X轴和Y轴的旋转值。

def dist(a,b):

return math.sqrt((a*a)+(b*b))

def get_x_rotation(x,y,z):

radians = math.atan(x / dist(y,z))

return math.degrees(radians)

def get_y_rotation(x,y,z):

radians = math.atan(y / dist(x,z))

return math.degrees(radians)

这里我们计算出了X轴和Y轴的旋转角度,输出如下:

x rotation: -13.755841166

y rotation: -0.187818934829

这里可以看到,传感器的X轴旋转了-13.756度,Y轴旋转了-0.188度。

解析陀螺仪的数据

通过类似的方法,我们可以从MPU6050传感器的陀螺仪上读取数据。此功能通过以下代码来完成:

gyro_xout = read_word_2c(0x43)

gyro_yout = read_word_2c(0x45)

gyro_zout = read_word_2c(0x47)

print "gyro_xout: ", gyro_xout, " scaled: ", (gyro_xout / 131)

print "gyro_yout: ", gyro_yout, " scaled: ", (gyro_yout / 131)

print "gyro_zout: ", gyro_zout, " scaled: ", (gyro_zout / 131)

首先读取寄存器0x43、0x45&0x47的值,同样的我们可以从MPU6050的datasheet中看到,这些寄存器保存着原始的陀螺仪的数据。为了转化获取的原始数据,这里需要除以131,可以得到每秒的旋转度数。

输出如下:

gyro_xout: -92 scaled: -1

gyro_yout: 294 scaled: 2

gyro_zout: -104 scaled: -1

结语

上述代码相对基础,你可以根据实际需要添加错误处理或配置不同的灵敏度。为了帮助我们更好地学习,还可以编写了一些简单的OpenGL代码来进行三维空间的图形化展示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值