0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

将MPU6050与Raspberry Pi连接并显示16x2 LCD值的步骤

科技观察员 来源:circuitdigest 作者:萨达姆 2022-11-17 16:42 次阅读

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模式引脚。

pYYBAGN18_iAZ-c9AACWoluieDM651.jpg

引脚配置:

Vcc:-此引脚用于相对于地为 MPU6050 模块供电

接地:-这是一个接地引脚

SDA:-SDA 引脚用于控制器和 MPU6050 模块之间的数据

标准及校正实验所:-SCL 引脚用于时钟输入

XDA:-这是传感器 I2C SDA 数据线,用于配置和读取外部传感器((可选)在本例中未使用)

XCL:-这是传感器 I2C SCL 时钟线,用于配置和读取外部传感器((可选)在本例中未使用)

ADO:-I2C 从地址 LSB(不适用于本例)

国际:-中断引脚,用于指示数据就绪。

描述:

在本文中,我们将使用带有树莓派的MPU6050在LCD上显示温度,陀螺仪和加速度计读数。如果您是树莓派的新手,请浏览我们的树莓派教程部分,学习树莓派入门。

在这个项目中,我们首先在LCD上显示温度值,一段时间后我们显示陀螺仪值,然后在一段时间后我们得到加速度计读数,如下图所示:

pYYBAGN18_uAZ6rNAAD7sT-CYQA791.jpg

pYYBAGN18_yASRLzAADmDQkGUgk114.jpg

电路图及说明:

用于将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。

pYYBAGN18_6APoRvAADFpSZnl-w895.png

为 MPU6050 陀螺仪传感器配置树莓派:

在开始编程之前,我们需要使用给定的方法启用树莓派的 i2c:

步骤 1:启用 I2C 通信

在安装 Adafruit SSD1306 库之前,我们需要在树莓派中启用 I2C 通信。

要在树莓派控制台中执行此操作:

sudo raspi-config

然后会出现蓝屏。现在选择接口选项

pYYBAGN19ACALKrQAABaCu_MXus557.png

在此之后,我们需要选择I2C

poYBAGN19AGAMqAoAABgdvt9pKQ964.png

在此之后,我们需要选择是并按回车键,然后确定

pYYBAGN19AKAQ7cvAAAldGEUqF8222.png

在此之后,我们需要通过发出以下命令重新启动树莓派:

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

pYYBAGN19AOAeSPlAAAblVH7djA733.png

步骤 4:安装库 MPU6050

在此之后,我们需要使用给定的命令安装 MPU6050 库

poYBAGN19ASAIs1oAABIgRpMdq4426.png

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()

pYYBAGN19AWAFDEzAABW6QLGUHg184.jpg

pYYBAGN19AaAQBi2AABVuu_I5do877.jpg

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
    lcd
    +关注

    关注

    34

    文章

    4424

    浏览量

    167404
  • MPU6050
    +关注

    关注

    39

    文章

    307

    浏览量

    71365
收藏 人收藏

    评论

    相关推荐

    16x2 LCD与ARM7-LPC2148连接显示文字

    在本教程中,我们将了解如何 16x2 LCD 与 ARM7-LPC2148 微控制器连接显示
    的头像 发表于 10-28 17:12 1953次阅读
    <b class='flag-5'>将</b><b class='flag-5'>16x2</b> <b class='flag-5'>LCD</b>与ARM7-LPC2148<b class='flag-5'>连接</b><b class='flag-5'>并</b><b class='flag-5'>显示</b>文字

    如何16x2 LCD与Atmega16 AVR连接显示简单的欢迎消息

    在本教程中,我们将了解如何 16x2 LCD 与 Atmega16 AVR 微控制器连接
    的头像 发表于 11-11 17:29 3156次阅读
    如何<b class='flag-5'>将</b><b class='flag-5'>16x2</b> <b class='flag-5'>LCD</b>与Atmega<b class='flag-5'>16</b> AVR<b class='flag-5'>连接</b><b class='flag-5'>并</b><b class='flag-5'>显示</b>简单的欢迎消息

    如何DHT11与树莓派连接16x2 LCD屏幕上显示温度和湿度的

    在本教程中,我们学习如何流行的DHT11传感器与Raspberry Pi连接,并在16x2
    的头像 发表于 11-14 16:53 4267次阅读
    如何<b class='flag-5'>将</b>DHT11与树莓派<b class='flag-5'>连接</b>在<b class='flag-5'>16x2</b> <b class='flag-5'>LCD</b>屏幕上<b class='flag-5'>显示</b>温度和湿度的<b class='flag-5'>值</b>

    在树莓派上装LCD 16x2显示

    16x2 液晶显示屏,它有16个数据引脚,但是我们只用6个就可以了。市面上的LCD 16x2 液晶显示
    发表于 01-15 10:53

    【IntoRobot Neutron试用体验】MPU6050测试

    使用 SDA--D8SCL--D9MPU6050 mpu6050;//我连接是D1--D2//加速度计的x y z的
    发表于 06-12 23:19

    MPU6050的使用步骤

    文章目录前言一、MPU6050是什么?二、使用步骤1.引入库2.读入数据总结前言一、MPU6050是什么?MPU6050是一款性价比很高的陀
    发表于 02-10 07:22

    MPU6050(硬件IIC)

    MPU6050(硬件IIC)MPU6050(硬件IIC)
    发表于 04-02 16:29 79次下载

    mpu6050测试程序

     InvenSense公司的三轴陀螺仪MPU6050测试程序。IIC接口,51单片机驱动,LCD1602同步显示
    发表于 11-07 14:01 6122次阅读
    <b class='flag-5'>mpu6050</b>测试程序

    mpu6050怎么与单片机连接

    本文开始介绍了mpu6050的定义和mpu6050的感测范围,其次阐述了mpu6050特征,最后介绍了mpu6050与单片机的连接方法。
    发表于 03-09 08:42 2.7w次阅读

    MPU6050简介

    MPU6050简介什么是MPU6050MPU6050的特点MPU6050框图MPU6050初始化MPU6050—DMP使用介绍
    发表于 12-06 11:51 76次下载
    <b class='flag-5'>MPU6050</b>简介

    stm32使用MPU6050读取温度验证I2C

    stm32使用MPU6050读取温度验证I2C
    发表于 12-06 12:06 5次下载
    stm32使用<b class='flag-5'>MPU6050</b>读取温度<b class='flag-5'>值</b>验证I<b class='flag-5'>2</b>C

    STM32使用MPU6050在TFT_LCD显示数据

    续上一篇,实现非填充模式显示数值的目的是在显示屏上显示MPU6050的数值,方便后面做调试,这一篇是记录使用MPU6050的一些过程。所需材
    发表于 12-06 13:21 10次下载
    STM32使用<b class='flag-5'>MPU6050</b>在TFT_<b class='flag-5'>LCD</b>上<b class='flag-5'>显示</b>数据

    如何连接和使用16x2 I2C LCD的教程

    电子发烧友网站提供《如何连接和使用16x2 I2C LCD的教程.zip》资料免费下载
    发表于 11-22 14:36 0次下载
    如何<b class='flag-5'>连接</b>和使用<b class='flag-5'>16x2</b> I<b class='flag-5'>2</b>C <b class='flag-5'>LCD</b>的教程

    如何16x2 LCDRaspberry pi4连接

    电子发烧友网站提供《如何16x2 LCDRaspberry pi4连接.zip》资料免费下载
    发表于 06-19 11:45 0次下载
    如何<b class='flag-5'>将</b><b class='flag-5'>16x2</b> <b class='flag-5'>LCD</b>与<b class='flag-5'>Raspberry</b> <b class='flag-5'>pi</b>4<b class='flag-5'>连接</b>

    如何连接16x2 LCD显示

    电子发烧友网站提供《如何连接16x2 LCD显示器.zip》资料免费下载
    发表于 07-12 09:21 0次下载
    如何<b class='flag-5'>连接</b><b class='flag-5'>16x2</b> <b class='flag-5'>LCD</b><b class='flag-5'>显示</b>器