SerialPlot(序列埠繪圖家)工具軟體(一):讀取MPU-6050加速度計與電子陀螺儀角度的MicroPython程式

Arduino IDE有內建用線條圖呈現序列資料的「序列繪圖家」,但是功能稍嫌陽春;支援MicroPython的程式開發工具,如:ThonnyMu,則沒有內建序列資料繪圖功能。

SerialChartSerialPlot是兩個知名的開放原始碼序列繪圖工具軟體,可以跟任何序列埠通訊程式搭配使用,例如:Arduino和MicroPython。SerialPlot的功能比較強大,這是它的運作畫面:

SerialPlot操作畫面

SerialPlot的重點功能包括:

  • 可將序列埠輸入資料用動態線條圖呈現。
  • 可調整資料輸入格式。Arduino IDE的「序列繪圖家」規定各項資料之間要用逗號分隔,SerialPort支援自訂資料分隔字元。
  • 可設定資料的顯示名稱和線條顏色。有時我們難以在Arduino的「序列繪圖家」分辨不同資料的線條,SerialPlot就不會有這種問題。
  • 可將序列埠輸入資料存成檔案,方便日後分析資料。

本文採用SerialPlot示範呈現MicroPython讀取「MPU6050模組加速度電子陀螺儀角度感測器」的X, Y, Z軸資料線條。

使用MicroPython讀取MPU6050加速度與電子陀螺儀角度

下圖是一款常見的,採用InvenSense公司生產的MPU-6050晶片的陀螺儀和加速度計模組,連接開發板的介面是I2C。

MPU-6050模組

陀螺儀和加速度計可偵測沿X, Y, Z軸方向滾動的動作:

3軸滾動

MPU-6050模組的工作電壓可接3.3V或5V電源,連接ESP8266或ESP32開發板時,請接3.3V。模組的I2C介面已接上拉電阻,I2C位址預設是0x68,若有需要,可透過模組的ADO腳改成0x69。

  • AD0接地:位址是0x68
  • AD0接高電位:位址是0x69

INT(中斷輸出)腳用於通知控制板有新的數據可以向感測器提取,本文的程式碼用不到。XDA和XCL腳用於連接「磁力計」晶片,本文也用不到。

本文假設ESP8266已事先燒錄好MicroPython韌體(燒錄韌體的說明請參閱這一篇貼文)。連接MPU-6050與ESP8266(D1 Mini板)的示範麵包板電路如下:

連接MPU-6050與ESP8266(D1 Mini板)的麵包板電路

下載與上傳MicroPython的MPU-6050模組程式庫

本文使用Adam Ježek編寫的MPU6050-ESP8266-MicroPython模組,請先下載它:

MicroPython的MPU-6050模組程式庫

解壓縮下載的MPU6050-ESP8266-MicroPython-master.zip檔,取得mpu6050.py檔,此即操控MPU-6050模組的MicroPython程式庫,我們將使用Thonny Python IDE(相關操作說明請參閱這一篇貼文)將mpu6050.py檔上傳到ESP8266(D1 Mini)開發板。

把ESP8266(D1 mini板)接上電腦,再開啟Thonny。你可能需要調整Thonny的設定,讓它連上ESP8266開發板(相關操作說明請參閱這一篇貼文)。

連接ESP8266之後,在Thonny中開啟mpu6050.py檔,然後選擇主功能表的「檔案→另存新檔」,螢幕上將出現如下的對話方塊,請點擊「MicroPython設備」選項:

「MicroPython設備」選項

然後輸入檔名“mpu6050.py”:

輸入檔名“mpu6050.py”

按下「確認」之後,這個mpu6050.py檔就被寫入到ESP8266的快閃記憶體裡面了:

寫入開發板的MicroPython程式檔

測試讀取MPU-6050模組的X, Y, Z軸旋轉角度資料

在Thonny的互動環境(Shell輸入或貼上這個測試程式:

import mpu6050
i2c = I2C(scl=Pin(5), sda=Pin(4))
imu = mpu6050.accel(i2c)  # 建立mpu6050物件
imu.get_values()          # 取得MPU-6050的感測資料

如果ESP8266(D1 mini板)與MPU-6050模組的接線無誤,它將傳回字典格式的X, Y, Z軸角度(GyX, GyY, GyZ)、加速度(AcX, AcY, AcZ)以及晶片的攝氏溫度值(’Tmp’)。

Thonny的互動環境(Shell)

底下程式將每隔200ms讀取MPU-6050模組的X, Y和Z軸數據,組成以逗號分隔、新行字元(\n)結尾的字串輸出到序列埠:

from machine import I2C, Pin
import mpu6050
import time

i2c = I2C(scl=Pin(5), sda=Pin(4))
imu = mpu6050.accel(i2c)

def start():
    while True:
        # 取得MPU-6050模組的數據
        d = imu.get_values()
        # 把X, Y和Z軸角度組成逗號分隔、新行結尾格式字串。
        output = '{},{},{}\n'.format(d['GyX'], d['GyY'], d['GyZ'])

        print(output)
        time.sleep_ms(200)

if __name__ == "__main__":
    sw = Pin(13, Pin.IN, Pin.PULL_UP)

    if sw.value() == 1:  # 若13腳接高電位,則:
        start()
    else:
        print("hello!")

請把這個程式命名成main.py,存入EP8266的快閃記憶體,如此,每當ESP8266開機或重新啟動,就會自動執行這個程式檔,進而持續從序列埠輸出逗號分隔的三軸角度資料。

如果在ESP8266板開機或重置之前,把13腳(D7)接地,它將只會向序列埠輸出一個“hello!”字串。這麼做可以避免重新上傳程式(如:修改後的main.py檔)到ESP8266板時,序列埠被MPU-6050數據輸出佔用而出錯。

延伸閱讀

Posts created 470

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top