讓我們解構複雜的 ADXL345 三軸加速規吧!(第一彈)

自幹 SPI 從認識 ADXL345 開始!

林高遠
Maker Cup
Published in
4 min readJan 7, 2016

--

你用過哪些三軸加速規呢?

過去筆者曾經使用MMA7361(類比輸出三軸加速規)搭配MG82FL564(增強型8051)完成下樓梯辨識的期末專題。由於最近想要重啟這個實驗,卻發現MMA7361壞了。而市場上容易取得的三軸加速規都是ADXL345。

ADXL345的方塊圖

如果改用ADXL345,原本的類比介面就不能用,要改用SPI或IIC(I²C)這種數位通訊介面(沒錯,ADXL345有2種通訊協定任選),除了向sensor擷取與轉換資料的程式要重寫,還得弄懂這些通訊協定,可謂工程浩大。

為什麼要弄懂?沒有現成的直接用嗎?網路上能抓到的ADXL345 function都是IIC,IIC一方面較慢、另一方面要pull up電阻導致電路更複雜,所以我就不太想用在人體動作偵測上。

不過原本就想弄懂的SPI拖了好久,都還不懂,所以就趁此機會來自幹一個for ADXL345的SPI函式庫,以實踐過程來好好搞懂它!

塞翁失馬,焉知非福

弄懂規格後,發現從MMA7361改用ADXL345好處還真不少

  • ADXL345量測範圍高達 ±16g, MMA7361只有±6g。
  • 輸出資料解析度高達13bit。一般MCU內建的ADC頂多12bit,但LSB通常因雜訊而捨去,就只剩下11bit可用;ADXL345已經內建filter,所以13bit完全可用,等於解析度高了4倍((13bit–11bit)^2=4)
  • 內建offset register,所以校正值會跟著sensor走,不需要因為校正值變動修改MCU程式碼。

ADXL345雖然只不過是一顆三軸加速規,不過datasheet卻高達40頁!而且有29個address的register table,幾乎像是low pin conut MCU一樣複雜!

經過三天的 「鍛鍊」後,大致熟悉datasheet,也成功在MG82FL564上寫出以GPIO實作的SPI libary for ADXL345。

這29個registers其實不需要每個都搞懂,後面會為大家介紹幾個重點要知道的就好,待熟悉後再視需求去探索其他register。

一次自幹,終生受用

雖然MG82FL564有內建SPI硬體,不過自幹SPI的目的除了弄懂通訊協定外,也為了日後的可移植性考量。後來也的確成功移植到Intel Edison上,在Intel原廠提供的Linux下complier出可以讀取ADXL345的程式(以mraa的GPIO API實作)

要是當初直接使用硬體SPI,那就會相依於特定MCU的架構,到別的平台上得整個砍掉重練。

要特別注意的是,市面上許多ADXL345的模組其實是故障品,在Z軸會有極大的嚴重偏差,偏差到內建的offset register都不足以修正,災情慘重。

筆者在光華商場買了3顆型號為GY-291(如下圖)的ADXL345模組都有此情形,無奈這也是最方便買到的型號。

筆者在光華商場所買的GY-291(ADXL345模組),買了3個全部都是Z軸有不同程度的重大瑕疵。

雖然是瑕疵品,不過還是具有這些價值:

  • 只用X與Y這2軸。
  • 練習SPI通訊。

要注意的一點是,雖然這幾年因為Arduino的流行,很多sensor品名都會冠上Arduino(如上圖),標榜與Arduino相容。但事實是:與某種MCU相容/不相容都是假議題。因為MCU是非常底層(直接控制電位)又靈活(通常沒有OS,怎麼寫就怎麼跑)的元件,這種低速又普及的通訊協定都可以用程式碼實作。只要通訊協定對了,和什麼都可以相容。

這就像很多藥局會在門口用大大的顯眼布條寫上 「 處方箋免費領藥處」一樣的好笑。

--

--

林高遠
Maker Cup

曾在臺灣從事軟體開發工作2年,先在快樂小公司體驗過絕望低薪、後在有錢大公司經歷過惡劣職場文化,於是決定到陸企從事演算法與軟體開發工作。現旅居中國大陸。