(二)树莓派进阶:MPU6050(加速度计+陀螺仪)与Raspberry Pi连接

释放双眼,带上耳机,听听看~!

介绍

  • MPU6050传感器模块是一个集成的6轴运动跟踪设备。
  • 它有一个3轴陀螺仪,3轴加速度计,数字运动处理器和温度传感器,所有这些都集成在一个IC中。
  • 它可以使用其辅助I2C总线接受来自其他传感器的输入,如3轴磁力计或压力传感器。
  • 如果连接外部3轴磁力计,它可以提供完整的9轴运动融合输出。
  • 微控制器可以使用I2C通信协议与该模块通信。通过使用I2C通信从某些寄存器的地址读取值,可以找到各种参数。
  • 沿X,Y和Z轴读取的陀螺仪和加速度计有2种补码形式。
  • 陀螺仪读数以度/秒(dps)为单位; 加速度计读数以g为单位。

要使用Raspberry Pi连接MPU6050,我们应该确保Raspberry Pi上的I2C协议已打开。因此,在使用树莓派连接MPU6050之前,我们需要在Raspberry Pi上进行一些I2C配置,您可以参考本教程基础部分的I2C设置教程

在Raspberry Pi上配置I2C后,让我们将Raspberry Pi与MPU6050连接起来。

电路连接图

(二)树莓派进阶:MPU6050(加速度计+陀螺仪)与Raspberry Pi连接

MPU6050与Raspberry Pi连接

在这里,我们将使用Raspberry Pi连接MPU6050模块,以读取陀螺仪和加速度计值并打印它们。

我们可以使用Python和C语言将MPU6050模块与Raspberry Pi连接起来。我们将在终端上显示从MPU6050模块读取的加速度计和陀螺仪的值。

对于Raspberry Pi上经常使用的基于Python的I2C函数,您可以为Raspberry Pi引用基于Python的I2C函数。

Python程序

'''
    Read Gyro and Accelerometer by Interfacing Raspberry Pi with MPU6050 using Python
	https://www.qutaojiao.com
'''
import smbus			#import SMBus module of I2C
from time import sleep          #import

#some MPU6050 Registers and their Address
PWR_MGMT_1   = 0x6B
SMPLRT_DIV   = 0x19
CONFIG       = 0x1A
GYRO_CONFIG  = 0x1B
INT_ENABLE   = 0x38
ACCEL_XOUT_H = 0x3B
ACCEL_YOUT_H = 0x3D
ACCEL_ZOUT_H = 0x3F
GYRO_XOUT_H  = 0x43
GYRO_YOUT_H  = 0x45
GYRO_ZOUT_H  = 0x47


def MPU_Init():
	#write to sample rate register
	bus.write_byte_data(Device_Address, SMPLRT_DIV, 7)
	
	#Write to power management register
	bus.write_byte_data(Device_Address, PWR_MGMT_1, 1)
	
	#Write to Configuration register
	bus.write_byte_data(Device_Address, CONFIG, 0)
	
	#Write to Gyro configuration register
	bus.write_byte_data(Device_Address, GYRO_CONFIG, 24)
	
	#Write to interrupt enable register
	bus.write_byte_data(Device_Address, INT_ENABLE, 1)

def read_raw_data(addr):
	#Accelero and Gyro value are 16-bit
        high = bus.read_byte_data(Device_Address, addr)
        low = bus.read_byte_data(Device_Address, addr+1)#concatenate higher and lower value
        value = ((high << 8) | low)#to get signed value from mpu6050if(value > 32768):
                value = value - 65536return value


bus = smbus.SMBus(1) 	# or bus = smbus.SMBus(0) for older version boards
Device_Address = 0x68   # MPU6050 device address

MPU_Init()

print (" Reading Data of Gyroscope and Accelerometer")

while True:
	
	#Read Accelerometer raw value
	acc_x = read_raw_data(ACCEL_XOUT_H)
	acc_y = read_raw_data(ACCEL_YOUT_H)
	acc_z = read_raw_data(ACCEL_ZOUT_H)
	
	#Read Gyroscope raw value
	gyro_x = read_raw_data(GYRO_XOUT_H)
	gyro_y = read_raw_data(GYRO_YOUT_H)
	gyro_z = read_raw_data(GYRO_ZOUT_H)
	
	#Full scale range +/- 250 degree/C as per sensitivity scale factor
	Ax = acc_x/16384.0
	Ay = acc_y/16384.0
	Az = acc_z/16384.0
	
	Gx = gyro_x/131.0
	Gy = gyro_y/131.0
	Gz = gyro_z/131.0

余下程序(直接拼接到上面程序下面即可):

C程序

在这里,我们使用WiringPi C库从MPU6050模块读取数据。

/*
	MPU6050 Interfacing with Raspberry Pi
	https://www.qutaojiao.com
*/

#include 
#include 
#include 
#include 

#define Device_Address 0x68	/*Device Address/Identifier for MPU6050*/

#define PWR_MGMT_1   0x6B
#define SMPLRT_DIV   0x19
#define CONFIG       0x1A
#define GYRO_CONFIG  0x1B
#define INT_ENABLE   0x38
#define ACCEL_XOUT_H 0x3B
#define ACCEL_YOUT_H 0x3D
#define ACCEL_ZOUT_H 0x3F
#define GYRO_XOUT_H  0x43
#define GYRO_YOUT_H  0x45
#define GYRO_ZOUT_H  0x47

int fd;

void MPU6050_Init(){
	
	wiringPiI2CWriteReg8 (fd, SMPLRT_DIV, 0x07);	/* Write to sample rate register */
	wiringPiI2CWriteReg8 (fd, PWR_MGMT_1, 0x01);	/* Write to power management register */
	wiringPiI2CWriteReg8 (fd, CONFIG, 0);		/* Write to Configuration register */
	wiringPiI2CWriteReg8 (fd, GYRO_CONFIG, 24);	/* Write to Gyro Configuration register */
	wiringPiI2CWriteReg8 (fd, INT_ENABLE, 0x01);	/*Write to interrupt enable register */

	} 
short read_raw_data(int addr){
	short high_byte,low_byte,value;
	high_byte = wiringPiI2CReadReg8(fd, addr);
	low_byte = wiringPiI2CReadReg8(fd, addr+1);
	value = (high_byte << 8) | low_byte;
	return value;
}

void ms_delay(int val){
	int i,j;
	for(i=0;i<=val;i++)
		for(j=0;j<1200;j++);
}

int main(){
	
	float Acc_x,Acc_y,Acc_z;
	float Gyro_x,Gyro_y,Gyro_z;
	float Ax=0, Ay=0, Az=0;
	float Gx=0, Gy=0, Gz=0;
	fd = wiringPiI2CSetup(Device_Address);   /*Initializes I2C with device Address*/
	MPU6050_Init();		                 /* Initializes MPU6050 */
	
	while(1)
	{
		/*Read raw value of Accelerometer and gyroscope from MPU6050*/
		Acc_x = read_raw_data(ACCEL_XOUT_H);
		Acc_y = read_raw_data(ACCEL_YOUT_H);
		Acc_z = read_raw_data(ACCEL_ZOUT_H);
		
		Gyro_x = read_raw_data(GYRO_XOUT_H);
		Gyro_y = read_raw_data(GYRO_YOUT_H);
		Gyro_z = read_raw_data(GYRO_ZOUT_H);
		
		/* Divide raw value by sensitivity scale factor */
		Ax = Acc_x/16384.0;
		Ay = Acc_y/16384.0;
		Az = Acc_z/16384.0;

余下程序(直接拼接到上面程序下面即可):

MPU6050输出

输出窗口将显示下面提到的所有值

Gx =陀螺X轴数据,单位为度/秒

Gy =陀螺仪Y轴数据,单位为度/秒

Gz =陀螺Z轴数据,单位为度/秒

Ax =加速度计X轴数据,单位为g

Ay =加速度计Y轴数据,单位为g

Az =加速度计Z轴数据,单位为g

(二)树莓派进阶:MPU6050(加速度计+陀螺仪)与Raspberry Pi连接

MPU6050数据的输出窗口

给TA打赏
共{{data.count}}人
人已打赏
python树莓派-进阶

(一)树莓派进阶:GPS模块与Raspberry Pi连接

2019-4-17 23:04:12

python树莓派-进阶

(三)树莓派进阶:三轴电子数字罗盘HMC5883L与Raspberry Pi连接

2019-4-17 23:37:31

2 条回复 A文章作者 M管理员
  1. shawn

    感谢楼主 正在研究mpu6050相关的

  2. piccolo

    感谢分享

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
'); })();