2021年11月14日 星期日

MPU 6500 六軸感測器

目前使用的板子為MPU9250,九軸。呼叫函式庫為 MPU6050。

包含三軸偵測重力加速度,可用來辨識傾斜角度。故水平旋轉無法辨識。

三軸偵測轉速,停止時轉速為零,故無法用來偵測停止轉角為何。

MPU6500使用IIC傳輸,接到Arduino上的SCL和SDA。

圖 MPU6500 接腳,只需接 VCC (3V~5V), GND, SCL, SDA

圖 Arduino 接腳,SCL, SDA可接A4, A5,或右上角AREF上方的兩個插孔

圖 D1 mini接腳,SCL, SDA接D1, D2



以下為Arduino 程式碼,可在Arduino UNO 及 D1 mini 執行

=====================

  1. #include <I2Cdev.h>
  2. #include <MPU6050.h>
  3. #include "Wire.h"

  4. MPU6050 flagMPU6050;
  5. int16_t ax, ay, az, gx, gy, gz;  // 16位元帶號數
  6. int Ax, Ay, Az, Gx, Gy, Gz;

  7. // setup() 會先被執行且只會執行一次
  8. void setup() {
  9.   flagMPU6050.initialize();     // 初始化

  10.   Serial.begin(9600);
  11.   pinMode(D4, OUTPUT);
  12.   Wire.begin();
  13. }

  14. void loop() {

  15.   flagMPU6050.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);   // 取得六軸資料
  16. //  flagMPU6050.getAcceleration(&ax, &ay, &az);           // 取得三軸加速度
  17. //  flagMPU6050.getRotation(&gx, &gy, &gz);           // 取得三軸轉速
  18. //  flagMPU6050.getAccelerationX();               // 僅取得 x軸加速度
  19. //  flagMPU6050.getRotationX();                   // 僅取得 x軸轉速

  20.   Ax = int(ax * 2.0 / 32.768);    // 把16位元的資料,轉換為2G m/s^2
  21.   Ay = int(ay * 2.0 / 32.768);    // 把16位元的資料,轉換為2G m/s^2
  22.   Az = int(az * 2.0 / 32.768);    // 把16位元的資料,轉換為2G m/s^2
  23.   Gx = int(gx * 2.0 / 250);    // 把16位元的資料,轉換為轉速
  24.   Gy = int(gy * 2.0 / 250);    // 把16位元的資料,轉換為轉速
  25.   Gz = int(gz * 2.0 / 250);    // 把16位元的資料,轉換為轉速
  26.   
  27.   Serial.print(String(u8"  ax: ") +String(Ax));
  28.   Serial.print(String(u8",  ay: ") +String(Ay));
  29.   Serial.print(String(u8",  az: ") +String(Az));
  30. //  Serial.print(String(u8",  gx: ") +String(Gx));
  31. //  Serial.print(String(u8",  gy: ") +String(Gy));  // 目前測試無輸出
  32. //  Serial.print(String(u8",  gz: ") +String(Gz));  // 目前測試無輸出
  33.   Serial.println(" ");
  34.   
  35.   delay(100);   // 取得資料間隔
  36. }