學習目標 : 認識faya 3軸加速度計模組的功能及使用方式
學習時間 : 60 mins
示範模組 : (1) faya brickNano
(2) faya 3軸加速度計
工具 : (1) 樂高積木 (相容)
====================功能介紹====================
faya 3軸加速度計模組透過I2C的接線,從Arduino的函式庫下指令,很簡單的就能讀到X軸、Y軸、Z軸共3組數值資料,並透過這3組數值了解模組移動的方向,本段僅解釋範例中用到的指令,更多的函示庫指令用法可參考官方說明。
介紹指令前,先看一下faya 3軸加速計計模組的外觀,它的左邊有六個埠,分別是SCL、SDA、SDO、CS、INT1、INT2,與Arduion的通訊方式和電子羅盤模組一樣,使用I2C通訊協定。模組的右下角有一個用來指示移動方向的圖案,分別標示X、Y、Z 共3個方向軸,其中Z軸需要發揮一點想像力,因為Z軸的方向是與模組平面向上垂直的方向。
把左邊圖片中的模組想像成一個方塊如右邊圖片,紅色箭頭標示的方向就為Z軸,藍色箭頭為X軸,綠色則為Y軸。
上面圖片為Arduino UNO中的I2C的腳位。左、右兩邊的SDA與SCL各別互相導通,因此從右邊接線或者左邊接線都可以使用。
接下來介紹所使用的指令
上面圖片為Arduino UNO中的I2C的腳位。左、右兩邊的SDA與SCL各別互相導通,因此從右邊接線或者左邊接線都可以使用。
接下來介紹所使用的指令
- #include <Adafruit_ADXL345_U.h>
引入3軸加速度計的函示庫。
- #include <Wire.h>
引入I2C介面,讓Arduino打開I2C的通訊界面。
- #include <Adafruit_Sensor.h>
這是Adafruit官方將多種體感型感測器的單位換算整合成這個函示庫,我們可以引入這個函示庫,用來換算3軸加速度計的單位。
- Adafruit_ADXL345_Unified物件名稱= Adafruit_ADXL345_Unified();
此指令將3軸加速度計的函示庫名稱,宣告成自己的物件名稱。
- 物件名稱.begin()
初始化3軸加速度模組。
- 物件名稱.setRange(ADXL345_RANGE_16_G);
- 設定模組重力加速度的顯示範圍為16G,總共有4個範圍:2G、4G、8G、16G可供選擇。
- 類別名稱.getEvent(&event);
更新模組中的重力加速度數值。
- event.acceleration.方向軸
- 取得模組中對應方向的加速度數值,方向軸的意思是3個不同方向的代號,即為x、y、z。
====================原理知識====================
以下解釋提供給有需要知道背後原理的人:
重力加速度是根據地球引力所牽引的物理現象,其表示符號為:g (這裡的g並不是重力單位的公克)。1g等於每平方秒9.8公尺,也就是說當沒有空氣阻力時,物體在地球表面上自由落下的加速度為9.8 m/s²。
3軸加速度計是使用電容偵測的方式來感測加速度,如下圖由兩片電極片之間裝入一片可移動的物體。當模組沿著動作方向移動時,中間可移動的物體會改變兩片電極片之間的電容值,計算出電容的差值後,就可得到移動物體的重心位移和移動的方向。
====================範例實作(一)====================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
(1)使用Serial Monitor,查看3軸加速度計模組位移的資料變化目標:
(2)請分別測試前到後、左到右、上到下...等3個動作,查看X、Y、Z軸的數值變化
接線:
Arduino_A5 ===> 電子羅盤模組_SCL
範例程式:
(上傳程式前請記得下載[ADXL345]函示庫,解壓縮並複製整個資料夾到Arduino的Libraries資料夾)
備註:
- L19 / L42 / L61 : 一點程式小技巧,讓每次讀取資料的時間點固定,L19設定了每10ms讀取一次感測值,但是由於Arduino讀取和秀出感測值時 (L45 ~ L58) 會花一些時間,因此我們L42先記錄起始時間,然後在L61中的 (millis() - timer) 算出總共花了多少時間,假設花了2ms,最後只要delay (10ms-2ms) = 8ms 就會得到我們希望的每10ms讀取一次感測值。
範例結果:
討論:
程式下載到Arduino後,打開Serial Monitor,先將模組平放在你的桌子上,這時候會看到X軸跟Y軸的數值都趨近為0,只有Z軸的數值為8 m/s²,換算成g (除以9.8):大約等於1g。
這裡解釋一下為什麼模組還沒有任何動作而且平放在桌面上時,Z軸的數值卻不是為0。根據前面介紹的3軸加速度計模組偵測的原理與上面資料手冊的使用圖片,模組在平放的時候,Z軸與桌面呈現垂直,因此Z軸的偵測結構正處於穩定向下的狀態,所以現在看到Z軸的數值約為8 m/s² (快到1g)。
接著我們試著將模組朝不同方向的擺放,查看X軸、Y軸、Z軸的數值變化,如下圖將模組站立起來使模組上的圖案Y軸箭頭朝向上方,查看Serial Monitor的數值就會發現,Z軸趨近為0,而Y軸約為9.8 m/s² (約為1g)。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2019/02/13 | |
// Faya-Nugget 範例程式 (accelerometer_1.ino) | |
// 單元: 模組介紹-faya3軸加速度計模組 | |
// 網址:https://fayalab.blogspot.com/2019/02/accelerometer.html | |
// 目標: (1)使用Serial Monitor,查看3軸加速度計模組位移的資料變化 | |
// (2)請分別測試前到後、左到右、上到下...等3個動作,查看X、Y、Z軸的數值變化 | |
// | |
// 接線: Arduino ==> faya模組 | |
// A4 ==> SDA (3軸加速度計模組) | |
// A5 ==> SCL (3軸加速度計模組) | |
// | |
#include <Wire.h> | |
#include <Adafruit_Sensor.h> | |
#include <Adafruit_ADXL345_U.h> | |
//定義自己的物件名稱 | |
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(); | |
void setup(void) | |
{ | |
//宣告UART的Board rate為9600 | |
Serial.begin(9600); | |
//3軸加速度計模組的初始設定 | |
if(!accel.begin()) | |
{ | |
//如果Arduino沒有偵測到模組,則會顯示以下訊息,請重新確認模組電源與I2C接線 | |
Serial.println("Ooops, no ADXL345 detected ... Check your wiring!"); | |
while(1); | |
} | |
// 設定3軸加速度計模組,加速度偵測最大值 | |
accel.setRange(ADXL345_RANGE_16_G); | |
} | |
void loop(void) | |
{ | |
//更新3軸加速度計模組的資料 | |
sensors_event_t event; | |
accel.getEvent(&event); | |
//顯示 X、Y、Z各別的數值(單位為:平方公尺/秒) | |
Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print(" "); | |
Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print(" "); | |
Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print(" "); | |
Serial.println("m/s^2 "); | |
delay(200); | |
} |
- L19 / L42 / L61 : 一點程式小技巧,讓每次讀取資料的時間點固定,L19設定了每10ms讀取一次感測值,但是由於Arduino讀取和秀出感測值時 (L45 ~ L58) 會花一些時間,因此我們L42先記錄起始時間,然後在L61中的 (millis() - timer) 算出總共花了多少時間,假設花了2ms,最後只要delay (10ms-2ms) = 8ms 就會得到我們希望的每10ms讀取一次感測值。
範例結果:
程式下載到Arduino後,打開Serial Monitor,先將模組平放在你的桌子上,這時候會看到X軸跟Y軸的數值都趨近為0,只有Z軸的數值為8 m/s²,換算成g (除以9.8):大約等於1g。
接著我們試著將模組朝不同方向的擺放,查看X軸、Y軸、Z軸的數值變化,如下圖將模組站立起來使模組上的圖案Y軸箭頭朝向上方,查看Serial Monitor的數值就會發現,Z軸趨近為0,而Y軸約為9.8 m/s² (約為1g)。
模組圖案上的Y軸箭頭朝向下方的話,在Serial Monitor中Y軸的數值則會變成 -10.1 m/s²(約為-1g)以此類推,剩下的X軸跟Y軸可以透過這個動作,查看實驗變化。
也歡迎大家在底下留言或到我們的粉絲團留言喔!
沒有留言:
張貼留言