MPU6050慣性單元是一個3軸加速度計和一個3軸陀螺儀組合的單元。它還包含溫度傳感器和DCM,可執行復雜的任務。 MPU6050通常用於制作無人機和其他遠程控制機器人,如自平衡機器人。在本篇文章中,我們將使用MPU6050和Arduino開發板制作一款數字量角器。本文使用伺服電機在量角器上顯示角度。伺服電機軸安裝有指針,該指針可以在量角器上旋轉,以指示角度,同時該角度值也顯示在1602液晶顯示屏上。在開始制作之前,讓我們先了解陀螺儀傳感器。
什么是加速度計和陀螺儀傳感器?
加速度計用於測量加速度。它實際上可以感知到靜態和動態加速度。例如,移動電話使用加速計傳感器來感知移動設備處於橫向模式或縱向模式。
陀螺儀用於測量角速度,該角速度使用地球的重力來確定運動中物體的方向。角速度是旋轉體的角位置的變化率。
例如,今天的手機使用陀螺儀傳感器根據手機的方向來玩手機游戲。此外,VR耳機使用陀螺儀傳感器以360度方向觀看。
因此,雖然加速度計可以測量線性加速度,但陀螺儀可以幫助找到旋轉加速度。當將兩個傳感器用作單獨的模塊時,很難找到方向、位置和速度。但是通過組合這兩個傳感器,它可以作為慣性測量單元(IMU)。因此,在MPU6050模塊中,加速度計和陀螺儀存在於單個PCB上,以找到方向、位置和速度。
常見的應用:
◾ 用於無人機的方向控制
◾ 自平衡機器人
◾ 機器人手臂控制
◾ 傾斜傳感器
◾ 用於手機、視頻游戲機
◾ 人形機器人
◾ 用於飛機、汽車等
MPU6050加速度計和陀螺儀傳感器模塊
MPU6050是一種微電子機械系統(MEMS),由3軸加速度計和3軸陀螺儀組成。它還有溫度傳感器。
它可以測量:
◾ 加速度
◾ 速度
◾ 方向
◾ 移位
◾ 溫度
該模塊內部還有一個(DMP)數字運動處理器,功能強大,可以執行復雜的計算,從而騰出微控制器的工作空間。
該模塊還有兩個輔助引腳,可用於連接外部IIC模塊,如磁力計。由於模塊的IIC地址是可配置的,因此可以使用AD0引腳將多個MPU6050傳感器連接到微控制器。
功能和規格:
◾ 電源:3-5V
◾ 通信:I2C協議
◾ 內置16位ADC提供高精度
◾ 內置DMP提供高計算能力
◾ 可用於與磁力計等其他IIC設備連接
◾ 可配置的IIC地址
◾ 內置溫度傳感器
MPU6050的引腳說明:
引腳編號
|
引腳名稱
|
引腳說明
|
1 | Vcc | 為模塊供電,可以+3V至+5V。通常使用+5V |
2 | Ground | 連接到系統的接地 |
3 | Serial Clock (SCL) | 用於為I2C通信提供時鍾脈沖 |
4 | Serial Data (SDA) | 用於通過I2C通信傳輸數據 |
5 | Auxiliary Serial Data (XDA) | 可用於將其他I2C模塊與MPU6050連接。可選。 |
6 | Auxiliary Serial Clock (XCL) | 可用於將其他I2C模塊與MPU6050連接。可選。 |
7 | AD0 | 如果MCU使用多個MPU6050,該引腳可用於更改地址 |
8 | Interrupt (INT) | 中斷引腳,指示數據可供MCU讀取。 |
所需的組件
● Arduino UNO
● MPU6050陀螺儀模塊
● LCD顯示屏1602
● SG90-伺服電機
● 量角器圖片
電路原理圖
這款自制的Arduino量角器的電路圖如下:
Arduino UNO和MPU6050之間的電路連接如下:
MPU6050
|
Arduino UNO
|
VCC
|
+ 5V
|
GND
|
GND
|
SCL
|
A5
|
SDA
|
A4
|
Arduino UNO和伺服電機之間的電路連接如下:
伺服電機
|
Arduino UNO
|
紅色線(VCC)
|
+ 5V
|
橙色線(PWM)
|
9
|
棕色線(GND)
|
GND
|
編程說明
本文末尾給出了完整的代碼。這里伺服電機與Arduino連接,其軸投影在量角器圖片上,表示傾斜的MPU6050的角度。本文的編程很簡單。讓我們詳細看一下。
首先包括所有必需的庫 - Servo庫用於伺服電機,LiquidCrystal庫用於LCD顯示和wire庫用於I2C通信。MPU6050使用I2C通信,因此必須連接到Arduino的I2C引腳。因此,Wire.h庫用於建立Arduino UNO和MPU6050之間的通信。
#include <Servo.h> #include <LiquidCrystal.h> #include <Wire.h>
接下來定義連接到Arduino UNO的LCD顯示引腳RS、E、D4、D5、D6、D7。
LiquidCrystal lcd(2,3,4,5,6,7);
定義MPU6050的I2C地址。
1 const int MPU_addr=0x68;
然后使用Servo類初始化myservo對象,以及定義三個變量來存儲X軸、Y軸和Z軸的值。
1 Servo myservo; 2 int16_t axis_X,axis_Y,axis_Z;
將最小值和最大值設置為265和402,用於測量從0到360的角度。
1 int minVal=265; 2 int maxVal=402;
在void setup()函數中,首先啟動I2C通信,並使用地址為0x68的MPU6050開始傳輸。
1 Wire.begin(); 2 Wire.beginTransmission(MPU_addr);
通過寫入0x6B將MPU6050置於休眠模式,然后通過寫0喚醒它
1 Wire.write(0x6B); 2 Wire.write(0);
使MPU6050激活后,結束傳輸
1 Wire.endTransmission(true);
伺服電機的PWM引腳與Arduino UNO引腳9連接。
1 myservo.attach(9);
電路通電后,LCD就會顯示一條歡迎信息,然后在3秒后清除
1 lcd.begin(16,2); //Sets LCD in 16X2 Mode 2 lcd.print("CIRCUIT DIGEST"); 3 delay(1000); 4 lcd.clear(); 5 lcd.setCursor(0,0); 6 lcd.print("Arduino"); 7 lcd.setCursor(0,1); 8 lcd.print("MPU6050"); 9 delay(3000); 10 lcd.clear();
在void loop()函數中 ,同樣,首先MPU6050開始I2C通信。
1 Wire.beginTransmission(MPU_addr);
然后從寄存器0x3B(ACCEL_XOUT_H)開始
1 Wire.write(0x3B);
現在,通過以false設置結束傳輸將重新進程,但連接處於活動狀態。
1 Wire.endTransmission(false);
之后,請求來自14個寄存器的數據。
1 Wire.requestFrom(MPU_addr,14,true);
現在獲得了軸寄存器值(x、y、z)並將其存儲在變量axis_X、axis_Y、axis_Z中。
1 axis_X=Wire.read()<<8|Wire.read(); 2 axis_Y=Wire.read()<<8|Wire.read(); 3 axis_Z=Wire.read()<<8|Wire.read();
然后將這些值從265到402映射為-90到90。
1 int xAng = map(axis_X,minVal,maxVal,-90,90); 2 int yAng = map(axis_Y,minVal,maxVal,-90,90); 3 int zAng = map(axis_Z,minVal,maxVal,-90,90);
下面給出以度(0到360)計算x值的公式。這里我們僅轉換x,因為伺服電機旋轉基於x值運動。
1 x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI);
X角度值,從0到360度,被轉換為0到180。
1 int pos = map(x,0,180,0,180);
然后寫入角度值以旋轉伺服電機指向量角器卡片上的位置,並在1602 LCD顯示屏上打印這些值。
1 myservo.write(pos); 2 lcd.setCursor(0,0); 3 lcd.print("Angle"); 4 lcd.setCursor(0,1); 5 lcd.print(x); 6 delay(500); 7 lcd.clear();
以上就是使用Arduino開發板和MPU6050測量角度的方法。