MPU6050傳感器在單芯片上具有許多功能。它由一個(gè)MEMS加速度計(jì)、一個(gè)MEMS陀螺儀和溫度傳感器組成。該模塊在將模擬值轉(zhuǎn)換為數(shù)字時(shí)非常準(zhǔn)確,因?yàn)樗拿總€(gè)通道都有一個(gè) 16 位模數(shù)轉(zhuǎn)換器硬件。該模塊能夠同時(shí)捕獲 x、y 和 z 通道。它具有與主機(jī)控制器通信的 I2C 接口。該MPU6050模塊是一個(gè)緊湊的芯片,具有加速度計(jì)和陀螺儀。對(duì)于無人機(jī)、機(jī)器人、運(yùn)動(dòng)傳感器等許多應(yīng)用來說,這是一個(gè)非常有用的設(shè)備。它也被稱為陀螺儀或三軸加速度計(jì)。
今天在本文中,我們將將此MPU6050與Raspberry Pi連接,并顯示16x2 LCD上的值。
所需組件:
MPU-6050
10K 鍋
跳線
面包板
MPU6050 陀螺儀傳感器:
MPU-6050是一款 8 針 6 軸陀螺儀和加速度計(jì),集成在單芯片中。默認(rèn)情況下,該模塊在I2C串行通信上工作,但可以通過配置寄存器來配置為SPI接口。對(duì)于I2C,它有SDA和SCL線。幾乎所有引腳都是多功能的,但這里我們只繼續(xù)使用I2C模式引腳。
引腳配置:
Vcc:-此引腳用于相對(duì)于地為 MPU6050 模塊供電
接地:-這是一個(gè)接地引腳
SDA:-SDA 引腳用于控制器和 MPU6050 模塊之間的數(shù)據(jù)
標(biāo)準(zhǔn)及校正實(shí)驗(yàn)所:-SCL 引腳用于時(shí)鐘輸入
XDA:-這是傳感器 I2C SDA 數(shù)據(jù)線,用于配置和讀取外部傳感器((可選)在本例中未使用)
XCL:-這是傳感器 I2C SCL 時(shí)鐘線,用于配置和讀取外部傳感器((可選)在本例中未使用)
ADO:-I2C 從地址 LSB(不適用于本例)
國際:-中斷引腳,用于指示數(shù)據(jù)就緒。
描述:
在本文中,我們將使用帶有樹莓派的MPU6050在LCD上顯示溫度,陀螺儀和加速度計(jì)讀數(shù)。如果您是樹莓派的新手,請(qǐng)瀏覽我們的樹莓派教程部分,學(xué)習(xí)樹莓派入門。
在這個(gè)項(xiàng)目中,我們首先在LCD上顯示溫度值,一段時(shí)間后我們顯示陀螺儀值,然后在一段時(shí)間后我們得到加速度計(jì)讀數(shù),如下圖所示:
電路圖及說明:
用于將MPU6050與Raspberry Pi接口的電路圖非常簡單,在這里我們使用LCD和MPU6050。10k電位器用于控制LCD的亮度。關(guān)于MPU6050,我們已經(jīng)完成了4個(gè)連接,其中我們將MPU3.3的6050v電源和接地連接到Raspberry Pi的3.3v和接地。MPU6050的SCL和SDA引腳與Raspberry的物理引腳3(GPIO2)和引腳5(GPIO3)連接。LCD的RS,RW和EN直接連接到GPIO18和Raspberry Pi的23。數(shù)據(jù)引腳直接連接到數(shù)字引腳編號(hào) GPIO24、GPIO25、GPIO8 和 GPIO7。
為 MPU6050 陀螺儀傳感器配置樹莓派:
在開始編程之前,我們需要使用給定的方法啟用樹莓派的 i2c:
步驟 1:啟用 I2C 通信
在安裝 Adafruit SSD1306 庫之前,我們需要在樹莓派中啟用 I2C 通信。
要在樹莓派控制臺(tái)中執(zhí)行此操作:
sudo raspi-config
然后會(huì)出現(xiàn)藍(lán)屏。現(xiàn)在選擇接口選項(xiàng)
在此之后,我們需要選擇I2C
在此之后,我們需要選擇是并按回車鍵,然后確定
在此之后,我們需要通過發(fā)出以下命令重新啟動(dòng)樹莓派:
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
現(xiàn)在我們可以在示例中找到示例代碼。用戶可以通過直接上傳到樹莓派或根據(jù)需要對(duì)其進(jìn)行自定義來測(cè)試該代碼。在這里,我們?cè)?6x2 LCD上顯示了MPU6050的X,Y和Z軸值。您可以在本教程末尾找到完整的 Python 代碼。
編程說明:
完整的Python代碼在最后給出,在這里我們解釋了代碼的幾個(gè)重要部分。
在 Python 程序中,我們導(dǎo)入了一些必需的庫,如 time、smbus 和 GPIO。
import smbus
import time
import RPi.GPIO as gpio
在此之后,我們需要一些寄存器地址來配置 MPU6050 并從中獲取值。我們還采用了一些變量來校準(zhǔn)和初始化 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
然后我們編寫了一些用于驅(qū)動(dòng)16x2LCD的函數(shù),如def begin(),def cmd(ch),def write(ch),def Print(str),def clear()等。您可以進(jìn)一步檢查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)
在此之后,我們需要編寫一些函數(shù)來從MPU6050讀取值并將其顯示到LCD。給定函數(shù)用于從MPU6050讀取數(shù)據(jù)
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
給定函數(shù)用于讀取加速度計(jì)和陀螺儀數(shù)據(jù)
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)
在此之后,我們編寫了一個(gè)溫度讀取函數(shù)
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() 函數(shù)用于校準(zhǔn) MPU6050,def display() 函數(shù)用于在 LCD 上顯示值。在下面給出的完整代碼中檢查這些函數(shù)。
在此之后,我們開始LCD,初始化和校準(zhǔn)MPU6050,然后在while循環(huán)中,我們調(diào)用了MPU-溫度,加速度計(jì)和陀螺儀的所有三組值,并通過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陀螺儀和加速度計(jì)都用于檢測(cè)任何設(shè)備的位置和方向。陀螺儀使用地球重力來確定 x、y 和 z 軸位置,加速度計(jì)根據(jù)運(yùn)動(dòng)變化率進(jìn)行檢測(cè)。
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
+關(guān)注
關(guān)注
34文章
4424瀏覽量
167410 -
MPU6050
+關(guān)注
關(guān)注
39文章
307瀏覽量
71366
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論