Arduino連接MPU6050六軸姿態角度感測器
來自專欄 數字極客
因為準備DIY一個載人平衡車,其中最核心的感測器就是車身的姿態角度感測器(MPU6050),用於對車身傾斜角度、傾斜趨勢等做測量,所以準備先用簡單的電路連接MPU6050,並寫代碼來獲取感測器數據。
MPU6050晶元被廣泛的應用到各類工業產品中,現在通過Arduino可以很方便的連接6050,並製作如平衡車、無人機等產品。
https://www.zhihu.com/video/974036731196108800我用了一款JY-61P的模塊,核心晶元還是MPU6050,模塊除了能讀取原始數據外,還可以通過積分演算法獲取當前的角位置,並且角位置經過卡爾曼濾波,可以很平穩的輸出,先來看下感測器的各項參數。
JY-61P模塊參數
- 電壓: 3.3V – 5V
- 電流:< 40mA
- 尺寸:51.3mm × 36mm × 15mm
- 焊盤間距:上下10mil(2.54mm),左右600mil(15.24mm)
- 測量維度:加速度3維,角速度3維,角度3維
- 量程:加速度±16g,角速度±2000°/s,角度±180°
- 解析度:加速度6.1e-5g,角速度7.6e-3°/s
- 穩定性:加速度0.01g,角速度0.05°/s
- 測量誤差:0.01°
- 輸出內容:時間、加速度、角速度、角度、埠狀態,數據輸出頻率0.1Hz-200Hz
- 數據介面:串口(TTL電平,波特率支持2400、4800、9600、19200、38400、57600、115200、230400、460800、921600)、IIC(最大支持高速率400K)
- 擴展口功能:模擬輸入(0~VCC)、數字輸入、數字輸出、PWM輸出(周期1us~65535us,解析度1us)
JY-61P模塊
我選用了一款帶外殼的模塊,如下圖:
其內部就是這樣的一個晶元:
之所以選用帶外殼的JY-61P,是因為一方面接線更容易,另外還具備一定的防塵作用,功能上是完全一樣的。
JY-61P的介面有4個引腳,分別是VCC、GND、TX、RX,如果希望使用IIC來讀取數據,可以直接使用無外殼版本,因為IIC模式可以讀取底層數據,但無法讀取通過積分演算法得到的角度值,所以這裡就以串口通信的方式來說明如何連接和使用JY-61P模塊。
軸向說明
如上圖所示,模塊的軸向外殼上標示出來,藍色軸為X軸,紅色軸為Y軸,垂直與 模塊向外為Z軸。旋轉的方向按右手法則定義,即右手大拇指指向軸向,四指彎曲的方向即為繞該軸旋轉的方向。X 軸角度即為繞 X 軸旋轉方向的角度,Y軸角度即為繞Y軸旋轉方向的角度,Z軸角度即為繞Z軸旋轉方向的角度。
硬體連接
連線非常簡單,VCC接Arduino的3.3V電源口,GND接GND,TX口接Arduino的RX口,JY61的RX口空置,這裡的Arduino可以是UNO、NANO或其他兼容的板子,連接後,JY61就可以通過串口向Arduino傳送數據了。下面通過代碼來實現位置狀態數據的列印。
Arduino代碼
#include <Wire.h>#include <JY901.h>void setup() { Serial.begin(115200);}void loop() { //加速度 Serial.print("Acc:");Serial.print((float)JY901.stcAcc.a[0]/32768*16);Serial.print(" ");Serial.print((float)JY901.stcAcc.a[1]/32768*16);Serial.print(" ");Serial.println((float)JY901.stcAcc.a[2]/32768*16); //角加速度 Serial.print("Gyro:");Serial.print((float)JY901.stcGyro.w[0]/32768*2000);Serial.print(" ");Serial.print((float)JY901.stcGyro.w[1]/32768*2000);Serial.print(" ");Serial.println((float)JY901.stcGyro.w[2]/32768*2000); //角度 Serial.print("Angle:");Serial.print((float)JY901.stcAngle.Angle[0]/32768*180);Serial.print(" ");Serial.print((float)JY901.stcAngle.Angle[1]/32768*180);Serial.print(" ");Serial.println((float)JY901.stcAngle.Angle[2]/32768*180); Serial.println(""); delay(500);}void serialEvent() { while (Serial.available()) { JY901.CopeSerialData(Serial.read()); //Call JY901 data cope function }}
上述代碼會列印出晶元當前的三軸方向的加速度、三軸的角加速度及三軸的角度,JY61P已經對角度做了卡爾曼濾波,所以能平穩的輸出,如果你的晶元沒有內置濾波,則需要通過代碼實現。
完整的代碼及庫文件我傳到了百度雲盤,這裡是地址:https://pan.baidu.com/s/12KP2By4c55cSUyj2xo0Q_Q
數字極客-學知識,做最酷的事!
推薦閱讀: