MPU6050传感器在单芯片上具有许多功能。它由一个MEMS加速度计、一个MEMS陀螺仪和温度传感器组成。该模块在将模拟值转换为数字时非常准确,因为它的每个通道都有一个 16 位模数转换器硬件。该模块能够同时捕获 x、y 和 z 通道。它具有与主机控制器通信的 I2C 接口。该MPU6050模块是一个紧凑的芯片,具有加速度计和陀螺仪。对于无人机、机器人、运动传感器等许多应用来说,这是一个非常有用的设备。它也被称为陀螺仪或三轴加速度计。
今天在本文中,我们将将此MPU6050与Raspberry Pi连接,并显示16x2 LCD上的值。
所需组件:
MPU-6050
10K 锅
跳线
面包板
MPU6050 陀螺仪传感器:
MPU-6050是一款 8 针 6 轴陀螺仪和加速度计,集成在单芯片中。默认情况下,该模块在I2C串行通信上工作,但可以通过配置寄存器来配置为SPI接口。对于I2C,它有SDA和SCL线。几乎所有引脚都是多功能的,但这里我们只继续使用I2C模式引脚。
引脚配置:
Vcc:-此引脚用于相对于地为 MPU6050 模块供电
接地:-这是一个接地引脚
SDA:-SDA 引脚用于控制器和 MPU6050 模块之间的数据
标准及校正实验所:-SCL 引脚用于时钟输入
XDA:-这是传感器 I2C SDA 数据线,用于配置和读取外部传感器((可选)在本例中未使用)
XCL:-这是传感器 I2C SCL 时钟线,用于配置和读取外部传感器((可选)在本例中未使用)
ADO:-I2C 从地址 LSB(不适用于本例)
国际:-中断引脚,用于指示数据就绪。
描述:
在本文中,我们将使用带有树莓派的MPU6050在LCD上显示温度,陀螺仪和加速度计读数。如果您是树莓派的新手,请浏览我们的树莓派教程部分,学习树莓派入门。
在这个项目中,我们首先在LCD上显示温度值,一段时间后我们显示陀螺仪值,然后在一段时间后我们得到加速度计读数,如下图所示:
威廉希尔官方网站 图及说明:
用于将MPU6050与Raspberry Pi接口的威廉希尔官方网站 图非常简单,在这里我们使用LCD和MPU6050。10k电位器用于控制LCD的亮度。关于MPU6050,我们已经完成了4个连接,其中我们将MPU3.3的6050v电源和接地连接到Raspberry Pi的3.3v和接地。MPU6050的SCL和SDA引脚与Raspberry的物理引脚3(GPIO2)和引脚5(GPIO3)连接。LCD的RS,RW和EN直接连接到GPIO18和Raspberry Pi的23。数据引脚直接连接到数字引脚编号 GPIO24、GPIO25、GPIO8 和 GPIO7。
为 MPU6050 陀螺仪传感器配置树莓派:
在开始编程之前,我们需要使用给定的方法启用树莓派的 i2c:
步骤 1:启用 I2C 通信
在安装 Adafruit SSD1306 库之前,我们需要在树莓派中启用 I2C 通信。
要在树莓派控制台中执行此操作:
sudo raspi-config
然后会出现蓝屏。现在选择接口选项
在此之后,我们需要选择I2C
在此之后,我们需要选择是并按回车键,然后确定
在此之后,我们需要通过发出以下命令重新启动树莓派:
sodo reboot
第 2 步:安装 python-pip 和 GPIO 库
sudo apt-get install build-essential python-dev python-pip
在此之后,我们需要安装树莓派 GPIO 库
sudo pip installs RPi.GPIO
步骤 3:安装smbus库
最后,我们需要使用给定的命令在树莓派中安装 smbus 库:
sudo apt-get install python-smbus
步骤 4:安装库 MPU6050
在此之后,我们需要使用给定的命令安装 MPU6050 库
sudo pip install mpu6050
现在我们可以在示例中找到示例代码。用户可以通过直接上传到树莓派或根据需要对其进行自定义来测试该代码。在这里,我们在16x2 LCD上显示了MPU6050的X,Y和Z轴值。您可以在本教程末尾找到完整的 Python 代码。
编程说明:
完整的Python代码在最后给出,在这里我们解释了代码的几个重要部分。
在 Python 程序中,我们导入了一些必需的库,如 time、smbus 和 GPIO。
import smbus
import time
import RPi.GPIO as gpio
在此之后,我们需要一些寄存器地址来配置 MPU6050 并从中获取值。我们还采用了一些变量来校准和初始化 I2C 总线。
PWR_M = 0x6B
DIV = 0x19
CONFIG = 0x1A
GYRO_CONFIG = 0x1B
INT_EN = 0x38
ACCEL_X = 0x3B
ACCEL_Y = 0x3D
ACCEL_Z = 0x3F
GYRO_X = 0x43
GYRO_Y = 0x45
GYRO_Z = 0x47
TEMP = 0x41
bus = smbus.SMBus(1)
Device_Address = 0x68 # device address
AxCal=0
AyCal=0
AzCal=0
GxCal=0
GyCal=0
GzCal=0
然后我们编写了一些用于驱动16x2LCD的函数,如def begin(),def cmd(ch),def write(ch),def Print(str),def clear()等。您可以进一步检查LCD与树莓派的接口。
之后,我们需要初始化MPU6050模块
def InitMPU():
bus.write_byte_data(Device_Address, DIV, 7)
bus.write_byte_data(Device_Address, PWR_M, 1)
bus.write_byte_data(Device_Address, CONFIG, 0)
bus.write_byte_data(Device_Address, GYRO_CONFIG, 24)
bus.write_byte_data(Device_Address, INT_EN, 1)
time.sleep(1)
在此之后,我们需要编写一些函数来从MPU6050读取值并将其显示到LCD。给定函数用于从MPU6050读取数据
def readMPU(addr):
high = bus.read_byte_data(Device_Address, addr)
low = bus.read_byte_data(Device_Address, addr+1)
value = ((high << 8) | low)
if(value > 32768):
value = value - 65536
return value
给定函数用于读取加速度计和陀螺仪数据
def accel():
x = readMPU(ACCEL_X)
y = readMPU(ACCEL_Y)
z = readMPU(ACCEL_Z)
Ax = (x/16384.0-AxCal)
Ay = (y/16384.0-AyCal)
Az = (z/16384.0-AzCal)
#print "X="+str(Ax)
display(Ax,Ay,Az)
time.sleep(.01)
def gyro():
global GxCal
global GyCal
global GzCal
x = readMPU(GYRO_X)
y = readMPU(GYRO_Y)
z = readMPU(GYRO_Z)
Gx = x/131.0 - GxCal
Gy = y/131.0 - GyCal
Gz = z/131.0 - GzCal
#print "X="+str(Gx)
display(Gx,Gy,Gz)
time.sleep(.01)
在此之后,我们编写了一个温度读取函数
def temp():
tempRow=readMPU(TEMP)
tempC=(tempRow / 340.0) + 36.53
tempC="%.2f" %tempC
print tempC
setCursor(0,0)
Print("Temp: ")
Print(str(tempC))
time.sleep(.2)
def calibrate() 函数用于校准 MPU6050,def display() 函数用于在 LCD 上显示值。在下面给出的完整代码中检查这些函数。
在此之后,我们开始LCD,初始化和校准MPU6050,然后在while循环中,我们调用了MPU-温度,加速度计和陀螺仪的所有三组值,并通过LCD显示它们。
begin();
Print("MPU6050 Interface")
setCursor(0,1)
Print("Circuit Digest")
time.sleep(2)
InitMPU()
calibrate()
while 1:
InitMPU()
clear()
for i in range(20):
temp()
clear()
Print("Accel")
time.sleep(1)
for i in range(30):
accel()
clear()
Print("Gyro")
time.sleep(1)
for i in range(30):
gyro()
MPU6050陀螺仪和加速度计都用于检测任何设备的位置和方向。陀螺仪使用地球重力来确定 x、y 和 z 轴位置,加速度计根据运动变化率进行检测。
import smbus
import time
import RPi.GPIO as gpio
PWR_M = 0x6B
DIV = 0x19
CONFIG = 0x1A
GYRO_CONFIG = 0x1B
INT_EN = 0x38
ACCEL_X = 0x3B
ACCEL_Y = 0x3D
ACCEL_Z = 0x3F
GYRO_X = 0x43
GYRO_Y = 0x45
GYRO_Z = 0x47
TEMP = 0x41
bus = smbus.SMBus(1)
Device_Address = 0x68 # device address
AxCal=0
AyCal=0
AzCal=0
GxCal=0
GyCal=0
GzCal=0
RS =18
EN =23
D4 =24
D5 =25
D6 =8
D7 =7
gpio.setwarnings(False)
gpio.setmode(gpio.BCM)
gpio.setup(RS, gpio.OUT)
gpio.setup(EN, gpio.OUT)
gpio.setup(D4, gpio.OUT)
gpio.setup(D5, gpio.OUT)
gpio.setup(D6, gpio.OUT)
gpio.setup(D7, gpio.OUT)
def begin():
cmd(0x33)
cmd(0x32)
cmd(0x06)
cmd(0x0C)
cmd(0x28)
cmd(0x01)
time.sleep(0.0005)
def cmd(ch):
gpio.output(RS, 0)
gpio.output(D4, 0)
gpio.output(D5, 0)
gpio.output(D6, 0)
gpio.output(D7, 0)
if ch&0x10==0x10:
gpio.output(D4, 1)
if ch&0x20==0x20:
gpio.output(D5, 1)
if ch&0x40==0x40:
gpio.output(D6, 1)
if ch&0x80==0x80:
gpio.output(D7, 1)
gpio.output(EN, 1)
time.sleep(0.005)
gpio.output(EN, 0)
# Low bits
gpio.output(D4, 0)
gpio.output(D5, 0)
gpio.output(D6, 0)
gpio.output(D7, 0)
if ch&0x01==0x01:
gpio.output(D4, 1)
if ch&0x02==0x02:
gpio.output(D5, 1)
if ch&0x04==0x04:
gpio.output(D6, 1)
if ch&0x08==0x08:
gpio.output(D7, 1)
gpio.output(EN, 1)
time.sleep(0.005)
gpio.output(EN, 0)
def write(ch):
gpio.output(RS, 1)
gpio.output(D4, 0)
gpio.output(D5, 0)
gpio.output(D6, 0)
gpio.output(D7, 0)
if ch&0x10==0x10:
gpio.output(D4, 1)
if ch&0x20==0x20:
gpio.output(D5, 1)
if ch&0x40==0x40:
gpio.output(D6, 1)
if ch&0x80==0x80:
gpio.output(D7, 1)
gpio.output(EN, 1)
time.sleep(0.005)
gpio.output(EN, 0)
# Low bits
gpio.output(D4, 0)
gpio.output(D5, 0)
gpio.output(D6, 0)
gpio.output(D7, 0)
if ch&0x01==0x01:
gpio.output(D4, 1)
if ch&0x02==0x02:
gpio.output(D5, 1)
if ch&0x04==0x04:
gpio.output(D6, 1)
if ch&0x08==0x08:
gpio.output(D7, 1)
gpio.output(EN, 1)
time.sleep(0.005)
gpio.output(EN, 0)
def clear():
cmd(0x01)
def Print(Str):
l=0;
l=len(Str)
for i in range(l):
write(ord(Str[i]))
def setCursor(x,y):
if y == 0:
n=128+x
elif y == 1:
n=192+x
cmd(n)
def InitMPU():
bus.write_byte_data(Device_Address, DIV, 7)
bus.write_byte_data(Device_Address, PWR_M, 1)
bus.write_byte_data(Device_Address, CONFIG, 0)
bus.write_byte_data(Device_Address, GYRO_CONFIG, 24)
bus.write_byte_data(Device_Address, INT_EN, 1)
time.sleep(1)
def display(x,y,z):
x=x*100
y=y*100
z=z*100
x= "%d" %x
y= "%d" %y
z= "%d" %z
setCursor(0,0)
Print("X Y Z")
setCursor(0,1)
Print(str(x))
Print(" ")
setCursor(6,1)
Print(str(y))
Print(" ")
setCursor(12,1)
Print(str(z))
Print(" ")
print x
print y
print z
def readMPU(addr):
high = bus.read_byte_data(Device_Address, addr)
low = bus.read_byte_data(Device_Address, addr+1)
value = ((high << 8) | low)
if(value > 32768):
value = value - 65536
return value
def accel():
x = readMPU(ACCEL_X)
y = readMPU(ACCEL_Y)
z = readMPU(ACCEL_Z)
Ax = (x/16384.0-AxCal)
Ay = (y/16384.0-AyCal)
Az = (z/16384.0-AzCal)
#print "X="+str(Ax)
display(Ax,Ay,Az)
time.sleep(.01)
def gyro():
global GxCal
global GyCal
global GzCal
x = readMPU(GYRO_X)
y = readMPU(GYRO_Y)
z = readMPU(GYRO_Z)
Gx = x/131.0 - GxCal
Gy = y/131.0 - GyCal
Gz = z/131.0 - GzCal
#print "X="+str(Gx)
display(Gx,Gy,Gz)
time.sleep(.01)
def temp():
tempRow=readMPU(TEMP)
tempC=(tempRow / 340.0) + 36.53
tempC="%.2f" %tempC
print tempC
setCursor(0,0)
Print("Temp: ")
Print(str(tempC))
time.sleep(.2)
def calibrate():
clear()
Print("Calibrate....")
global AxCal
global AyCal
global AzCal
x=0
y=0
z=0
for i in range(50):
x = x + readMPU(ACCEL_X)
y = y + readMPU(ACCEL_Y)
z = z + readMPU(ACCEL_Z)
x= x/50
y= y/50
z= z/50
AxCal = x/16384.0
AyCal = y/16384.0
AzCal = z/16384.0
print AxCal
print AyCal
print AzCal
global GxCal
global GyCal
global GzCal
x=0
y=0
z=0
for i in range(50):
x = x + readMPU(GYRO_X)
y = y + readMPU(GYRO_Y)
z = z + readMPU(GYRO_Z)
x= x/50
y= y/50
z= z/50
GxCal = x/131.0
GyCal = y/131.0
GzCal = z/131.0
print GxCal
print GyCal
print GzCal
begin();
Print("MPU6050 Interface")
setCursor(0,1)
Print("Circuit Digest")
time.sleep(2)
InitMPU()
calibrate()
while 1:
InitMPU()
clear()
for i in range(20):
temp()
clear()
Print("Accel")
time.sleep(1)
for i in range(30):
accel()
clear()
Print("Gyro")
time.sleep(1)
for i in range(30):
gyro()
-
lcd
+关注
关注
34文章
4426浏览量
167462 -
MPU6050
+关注
关注
39文章
307浏览量
71391
发布评论请先 登录
相关推荐
评论