2019年5月13日 星期一

ESP8285 兩軸伺服馬達雲台運動控制學習套件{2 of 4}MPU6050 的偏移值校正(offset calibration)

網頁最後修改時間:2019/05/13

這篇是 ESP8285 兩軸伺服馬達雲台運動控制學習套件中的第二個部分:MPU6050 的偏移值校正。

套件所包含的學習部分可由下面這張圖看出。

其中,本篇網頁主要說明的是圖中 MPU6050 校正 (左下,紫色線和框)的部分:
說明如何以 ESP8285 進行 MPU6050 的偏移值校正。

*********************************************************************************
學習套件可至下面網址購買:
*********************************************************************************

【接線圖與燒錄說明】

關於學習套件的接線與燒錄在前一篇網頁已做過詳細的說明,請自行跳轉至該網頁閱覽,這裡不再贅述!

【參考文件】

下面是幾篇關於 MPU6050 參考文件,對於不清楚程式的一些設定時可以打開看看:

【MPU6050 偏移值校正】

MPU6050 的偏移值校正,在網路上搜尋可以找到很多相關的程式碼,例如下面兩個做為參考的網站:
當然只是做為參考,實際上並沒有用到那幾個程式,但是論壇主題裡面所討論的卻是非常有價值,對於想了解 MPU6050 偏移值的校正有很大的幫助,有興趣可以看看!

沒有用上面的程式最主要的原因是:很理想的想像 MPU6050 輸出非常穩定且可以收斂到設定的範圍。也就是說,當設定一個完美的偏移值(Offset)校正後,除了加速度計 Z 軸之外的值輸出都會是 0,當然,我也想這樣。

實際上在論壇上可以看到,很多人都提到計算無法收斂的問題(或許通電半小時後,再重置做計算也還太短、或是最近有地震導致...);即便成功的收斂,不過輸出的結果卻不對,反正 balah...balah...balah 的,最後還是用回函式庫的範例程式,不想要越搞越複雜!
它以一個值作為開始,分別載入高和低兩個值到 MPU6050 作為各軸的偏移量設定,然後連續取多筆的輸出數據計算平均值,比較得出兩者之間較小的計算後,往此數值再做計算,直到輸出最終的結果。
** 題外話:MPU6050 加速度計與陀螺儀的校正,可以參考無人機的韌體程式,動作很快又能達到目的,不一定要以本文的方式這樣搞;不過為了要使用 DMP 的功能,偏移值是一定要先得到的 !

雖然校正的動作對於使用 MPU6050 很重要,但一直困擾我的不是校正程式,而是校正時的靈敏度範圍設定!

仔細上網翻一翻,絕大部分校正所使用的靈敏度範圍,都是採預設值設定(加速度計 ±2G;陀螺儀 ±250dps):
  • 那麼怎麼修改校正時用的靈敏度設定呢?
  • 修改了靈敏度的設定之後,偏移值是否也要同步的進行倍數的變大或變小再輸入呢?

其實,不知道這兩個問題的答案,並不影響計算之後的結果,畢竟我們有程式嘛!但,這就失去了學習套件的 "學習" 的用意,我就用套件就好,幹嘛用學習套件,不是嗎?

所以這兩個問題,就是接下來此篇網頁主要要探討的部分,答案會在下文中慢慢浮現出來。

/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*
有購買商品的使用者,需要的文件資料和程式碼都整理放在雲端硬碟,請用裡面的資料對照這裡的說明。
其他的使用者,程式碼請自行依照網頁中的說明自行修改再做使用。
/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* MPU6050 函式庫(for ESP8266):

** 函式庫可以用在 ESP8266 的,就同樣可用於 ESP8285 **

學習套件用的是下面這個 MPU6050 函式庫(關於安裝與使用方法都在網址中,請自行參閱):

有雲端硬碟的看倌,直接安裝好 學習套件 / Libraries 裡面所有的壓縮檔就行;不懂如何安裝的話,看 Arduino IDE 官網裡的說明。

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 偏移值校正程式碼修改:

校正程式來自於修改函式庫裡的範例程式碼 IMU_Zero,藉由這個程式碼的幫助,可以幫各軸取得一個很好的偏移值,使其輸出接近目標值。

*********************************************************************************
[ 校正目標值 ]
如果 MPU6050 經過適當的暖機、重力加速度為 1G 的情況之下,輸入各軸最好的偏移值後,就能使得 MPU6050 在靜止平放的情況之下,輸出的 Ax=Ay=Gx=Gy=Gz=0,Az=16384(@ ±2G),這就是校正的目標值。
*********************************************************************************

用 Arduino IDE 打開它之後,照著接下來的說明來做修改。

** 輸出校正偏移值之後的加速度計與陀螺儀數據:

原程式在校正完成之後,只會輸出計算的結果之後就結束,所以無法得知校正之後的輸出數據。為了在校正完成之後直接輸出數據,可以加入下面的程式碼在原程式的全局變數和 loop() 處。
ESPIMU_AERO.ino, 全局變數, 新增
int16_t ax, ay, az;
int16_t gx, gy, gz;

ESPIMU_ZERO.ino, loop(), 1 of 2
   accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
   // 每間隔 5ms 取值一次
   delay(5); 
   Serial.print(ax); Serial.print("\t");
   Serial.print(ay); Serial.print("\t");
   Serial.print(az); Serial.print("\t");
   Serial.print(gx); Serial.print("\t");
   Serial.print(gy); Serial.print("\t");
   Serial.print(gz); Serial.println("\t");

** 停止輸出數據:

要停止正在輸出的 MPU6050 數據,再加入下面的程式碼在 loop() 函式中。
ESPIMU_ZERO.ino, loop(), 2 of 2
   if( Serial.available() ) {
      switch( Serial.read() ) {
         case 'x':
         case 'X':
            while(1) yield();
            break;
      }
   }

** 修改 UART 通訊速率:

此處依個人喜好而定,可改可不改。
ESPIMU_ZERO.ino, Initialize(), 修改
    Serial.begin(115200);

** 修改 I2C 使用的接腳:

依據電路圖中的 I2C 接腳設定,下面這一行程式碼需要做修改
ESPIMU_ZERO.ino, Initialize(), 修改
        Wire.begin(10, 9);

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 校正前的注意事項:

設置好 MPU6050 後,開電讓它自己跑一段時間(等待大概 15 - 30 分鐘或更長都沒關係),開啟 UART 視窗並輸入 x 停止輸出。重置(非關電重開)ESP8285,3 秒鐘後不要再去動任何東西,然後靜待校正的偏移值計算完成,直到開始輸出數據後,再一次輸入 x 停止輸出。

** 我比較過開機後馬上做校正和過一段時間再做,其實結果差異不大,看倌們可以重複測試幾次,再比較輸出數據的變化,看看我有沒說錯?但實際上,還是要依上面的步驟來做,否則下一個單元若出錯,就要重新取值!

此時移動 UART 輸出視窗到 -------------- done -------------- 這個地方,上面那一行就是我們要的校正偏移值。

XAccel      YAccel        ZAccel      XGyro     YGyro     ZGyro
[-3615,-3614] --> [-5,11]  [-1359,-1358] --> [-3,14] [565,566] --> [16373,16390] [191,192] --> [0,3] [-56,-55] --> [0,2] [-37,-36] --> [0,4]

ESPIMU_ZERO 校正偏移值輸出
每一個偏移值對應四個數字,例如 [-3615,-3614] --> [-5,11] 代表載入前面兩組低高偏移值後,所取得的最低和最高 X 軸加速度平均輸出值。

偏移值校正完成之後的輸出是載入低偏移值,但往後網頁中的例子將使用高偏移值。但不管用哪一個,只要能夠讓雲台穩定輸出即可。

要想在計算完畢之後輸出程式使用的偏移值,插入下面的程式碼在 setup() 函式的 PullBracketsIn() 程式碼下面
ESPIMU_ZERO.ino, Initialize(), 新增
/** print offsets of accels and gyro */
   Serial.println( "OFFSET: Xa\t\tYa\t\tZa\t\tGx\t\tGy\t\tGz" );
   Serial.print( accelgyro.getXAccelOffset() ); Serial.print( "\t\t" );
   Serial.print( accelgyro.getYAccelOffset() ); Serial.print( "\t\t" );
   Serial.print( accelgyro.getZAccelOffset() ); Serial.print( "\t\t" );
   Serial.print( accelgyro.getXGyroOffset() ); Serial.print( "\t\t" );
   Serial.print( accelgyro.getYGyroOffset() ); Serial.print( "\t\t" );
   Serial.println( accelgyro.getZGyroOffset() );

重新編譯執行後,就會看到類似下面的輸出,同時可以看到,數據輸出所使用的是低偏移值。

** 這裡的程式是網頁撰寫時再加入的,由於使用別組 MPU6050,所以校正後的偏移值會與前面的例子不一樣!

多了輸出校正之後使用的偏移值的程式碼,點擊放大看原圖
【靈敏度範圍】

MPU6050 加速度計與陀螺儀的滿刻度靈敏度範圍調整,可參考下表。

MPU6050 加速度計與陀螺儀滿刻度範圍與靈敏度刻度因子
不管是 MPU6050 或是函式庫所使用的靈敏度的預設值,前面已經說過:加速度計 ±2G;陀螺儀 ±250dps。而在這裡要做就是,討論上一節開頭所提出來的問題:靈敏度的設定。

在進入主題之前,先來想一個問題:不同的靈敏度範圍,是否可適用同一組校正之後的偏移值?或是說,是否要跟著它的範圍做倍數的放大或縮小?

打開參考文件 App Note,翻到 page 5 看到 6.2 裡的說明
The Gyro registers at boot up will have a default value of 0. The value of the bias inputted needs to be in ±1000dps sensitivity range. This means each 1 dps = 32.8 LSB
再翻到 page 7 看到 7.2 裡第 1 和 2 個項目的說明
  1. Initial values contain the OTP values of the Accel factory trim. Therefore at bootup there will be a non-zero value in these registers. Users will need to first read the register and apply the biases to that value.
  2. Format is in ±8G in which 1g = 4,096 LSB

經由上面的解釋可以知道,不管 MPU6050 的靈敏度如何設定,偏移值都是在既定的條件下輸入;反過來說,同樣的條件之下,不管靈敏度如何設定,校正出來的偏移值也會是相近的。

所以問題的結論是:
不管其 Full-Scale Range 如何設定,都可用同一組的偏移值、且不需要放大或縮小!
/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 結論是驗證出來的:

上面結論不是看文件中的說明就做出來的,而是實際跑程式出來才做的結論!

為了驗證不同靈敏度是否會在校正後得出不同的偏移值,修改原程式定加入 MWC V2.4 飛控的加速度計(±8G)與陀螺儀(±2000dps)的設定條件重新做校正,可得到下面的校正輸出

[-3620,-3619] --> [0,2]  [-1359,-1358] --> [0,3] [567,567] --> [4096,4097] [192,193] --> [0,1] [-56,-56] --> [0,1] [-35,-35] --> [0,1]

改變靈敏度之後的校正輸出
比較兩個程式輸出的第一行以及校正之後的結果,就能發現問題的答案。

不同靈敏度校正之後的輸出比較,點擊放大看原圖
** 靈敏度設定:

如果有真正動手改過函式庫使用的靈敏度,或許有遇到過修改不成功的情況。解決這問題很簡單,靈敏度要在 accelgyro.initialize() 指令之後做修改,否則輸出就不會改變。

【結論】

這一篇簡單的說明,如何修改 MPU6050 函式庫的範例程式進行校正,輸出計算和取得的偏移值,文中也同時討論了修改靈敏度對於校正的影響。

如果還在尋找一個合適的 MPU6050 的偏移值校正程式,不妨先試試網頁的這個,照著文中的修改方式,先給自己一個口袋程式。有了這一個口袋程式之後,若不滿意它的表現或是想尋找更好的,不是也有一個對照、參考的依據嗎?

接下來,利用本文所得到的加速度計與陀螺儀的偏移值,可以開始 DMP 囉!


<< 部落格相關文章 >>



沒有留言:

張貼留言

留言請勿屬名或是為 "Unknown",大多這樣的留言都會直接被刪除掉,不會得到任何回覆!

發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?

不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !