文章

顯示包含「Accelerometer」標籤的文章

分析 Keyes 自動平衡車的原理

圖片
        將 Keyes 平衡車套件組裝起來後,系統的核心控制器是 Arduino 的核心晶片,搭配三軸加速度感測器以及馬達驅動模組,組合成一套自動平衡車的系統。首先,三軸感測器負責偵測出車子動態的情況,當偵測到車子有前傾或後仰的情況時,立刻輸出馬達驅動讓輪子往前進或往後退來達到車子的動態平衡。         系統在尋求動態平衡的過程中,採用 PID (Proportional Integral Derivative) 機制,將一個偏差的比例透過積分與微分的線性組合構成一個控制量,用這一控制量對被控制的對象進行控制。以平衡車的系統,透過 "傾斜的角度" 與 "角速度" 的變化量來控制馬達驅動。底下開始分析每個細節與操作。 MPU6050         平衡車上面有一顆三軸加速度感測元件 MPU6050,用於偵測 X, Y, Z 三軸的角速度與角度的變化,它們之間的關係如下圖一所示。圖一中的右手邊代表車子前進的方向,也就是 Y 軸的方向,車子朝上方就是 Z 軸方向,而我們眼睛正視車輪的輪軸就是 X 軸的方向。從 MPU6050 感測器可以讀取到每一軸的角速度,以及每一軸的重力加速度數值,參考前面文章的說明 https://han-ya.blogspot.com/2015/12/gyro-accelerometer.html 。我們從 Y 與 Z 軸的重力加速度 g 值,可以計算出傾斜的角度,如下圖二所示。 圖一:三軸感測器的角速度與角度之關係         假設車子往前傾斜了, Z 軸往 Y 軸順時針旋轉了一個角度後,依據物理分量的觀念,重力加速度可看成具有  gy  和  g z 的分量,而這兩個分量分別可從晶片量測而得到。再根據三角函數的定義,我們可以計算出旋轉的角度,如下圖二所示,因此角度等於 atan( gy / gz)。 圖二:傾斜角度的計算 Kalman濾波器         前段我們從 MPU6050 感測器計算出角度與角速度之後,這裡需要加上一個 Kalman 濾波器,用來消除雜訊的干擾,並根據過去的動態來預估未來的...

[模組] ADXL335 三軸加速計的 USB 體感搖桿

圖片
[1]  三軸陀螺儀與加速規 Gyro & Accelerometer [2]  三軸重力加速計 Accelerometer (GY-61 ADXL335 模組) STM32F1 系統         在之前的文章中[1][2]曾研究過三軸加速計的控制,當時使用的控制器是 NXP LPC11 系列,這回我使用 STM32F103 做為控制器,開發一個 USB 介面的操控搖桿,系統的架構則如圖一所示。         GY-61 模組上面是 ADXL335 晶片的三軸加速計,將它的 XYZ 軸的訊號線接到 STM32 開發板上的 ADC 接腳。另外,板子上的 DMA 功能要開啟,利用 DMA 搬運 ADC 的取樣資料。每次搬運完成後,產生中斷通知 CPU。根據 XY 軸的資料,計算出游標數值,透過 USB 介面再傳送給電腦。整個操作的過程,請參考底下的影片。 圖一:系統架構圖 STM32F103 + ADXL335 影片: [模組] GY-61 ADXL335 as USB joystick on STM32F103         此外,用 STM32F103C8 最小開發板設計開發一個搖桿的功能,同時具有方向鍵,如同電玩的搖桿一樣,請參考影片連結  https://youtu.be/pO3MB5SFBMg

[模組] 三軸陀螺儀與加速規 Gyro & Accelerometer

圖片
#  ADXL335 三軸加速計的 USB 體感搖桿 #  三軸重力加速計 Accelerometer (GY-61 ADXL335) 前言         前一篇 " 三軸重力加速計 " 介紹 ADXL335 晶片的重力加速計 (也稱加速規),主要能偵測出三軸的重力變化,便能得知物體轉動方向方位。有一個特殊情況可解釋陀螺儀的作用,當加速規放置水平時,此時轉動轉動 Z 軸,我們會發現 X/Y 軸的重力值變化量其實並不大,請參考底下的實驗影片。這樣的變化量可能被誤以為是雜訊,不容易判斷物體是否方向方位在改變。如果能再多計算每一軸轉動的速度,由轉動的角速度輔助,便能計算物體位移量。於是,陀螺儀正是用來計算角速度的,配合重力計一起使用。因此,若加速規再輔以陀螺儀的功能,這樣能更精準算出物體的移動與轉動方向 (我覺得這是很複雜的數學)。 設計流程         Arduino 官方網站 中提供好多種重力加速計與陀螺儀的模組,我便找了一顆 MPU6050 晶片來測試。這顆晶片不只具有三軸重力加速計,還有陀螺儀的功能,對外的通訊介面為 I2C 方式。首先,實驗過程我採用恩智浦的 LPC1114 控制器來比較一下 MPU6050 與 ADXL335 的重力數值,如圖一所示。圖一的 LCM 第一行顯示的是 MPU6050 X, Y, Z 軸的重力值,第二行顯示的是 ADXL335 的三軸重力值,我已經把兩塊模組的 X/Y 軸方向調整為一致了 (兩塊模組的三軸定義方向其實不太一樣,用軟體方式調整),如圖右下角所示。圖中,X 軸的重力值約為 -0.023g 和 -0.018g,Y 軸的重力值約為 -0.016g 和 0.018g,Z 軸的重力值約為 0.964g 和 1.112g。兩者數值的誤差,我的解釋是實驗過程並沒有做校正的動作,因此兩者模組存在一些誤差。撇開誤差,如果我們的實驗對精準度沒有要求太高的話,倒是很快取得三軸重力數值並計算出大概方位。 圖一:MPU6050 與 ADXL335的加速規數值 (單位 mg) 規格分析         下圖二是 MPU6050 晶片的陀螺儀規格,這顆可提供四種精度,...

[模組] 三軸重力加速計 Accelerometer (GY-61 ADXL335)

圖片
#  ADXL335 三軸加速計的 USB 體感搖桿 #  三軸陀螺儀與加速規 Gyro & Accelerometer 模組介紹         三軸重力加速計是一種重力感測器,也稱為加速規或加速計。三軸指的是 X, Y, Z 軸,重力加速度就是我們高中理化曾學過的地心引力 (g)。由於這個重力加速度是地球的天然資源 (就像磁力線的指南針),所以當我們身體傾斜或翻轉時,透過地心引力的影響讓身體內部機構可感受到其傾斜或翻轉。於是,將此概念應用到科技工業上,像電玩的 體感遊戲 (Wii, Kinect...) 、 飛行器 、 懸臂旋轉 、 震動感測 ...等都使用到相關元件,本文針對三軸重力加速計的晶片做測試研究,希望能獲得更多的應用靈感。首先,找一顆晶片試試吧!Arduino 開發套件常見的三軸加速計,使用的是 ADI ADXL335/345 晶片,因此我買了一個來測試玩玩看,並用 NXP LPC1114 晶片來設計系統。         三軸重力加速計晶片是 MEMS 設計工藝,能將這種感測技術設計到小晶片裡面,不得不佩服這群工程人員。由於地表的重力加速度有方向性,晶片又根據該重力為基準來測量三軸的變化,所以晶片與三軸的方向座標必須先定義好,如下面圖一所示,晶片面朝上為 Z軸。以圖一為例,晶片放置水平,量測到的重力數值為 X 軸 0g, Y 軸 0g, Z軸 1g。然後,該晶片內部再將這三軸的物理量轉換成電壓值輸出。實驗中,我手上拿到的是 ADXL335,它是輸出三軸的電壓值,所以設計系統時需要選用具有 ADC 功能的 MCU ,才能將這三個電壓值轉換回重力值。此外,ADI 還開發另一顆 ADXL345 晶片,與 ADXL335 晶片有些不一樣的地方,前者內部已有包含 ADC 功能,能將重力值直接轉換成數位值,並使用 I2C / SPI 介面和外部通訊,提供使用者不同的選擇。 圖一:晶片的三軸方向座標 規格分析         三軸重力加速計晶片在使用前先要找到 0g 的電壓值,這也是校正歸零的步驟。雖然每顆晶片出廠前都經過測試,但是每顆晶片之間的物理特性還是存在一點點差距,這種差距...