概述
ADXL345是一款低功耗,三軸MEMS加速度計模塊,具有I2C和SPI接口。這些模塊的Adafruit Breakout板載板載3.3v電壓調節和電平轉換功能,使其易于與Arduino等5v微控制器接口。
ADXL345具有4個靈敏度范圍,從+/- 2G到+/- 16G。它支持10Hz到3200Hz的輸出數據速率。
工作原理:
MEMS-微型機電系統傳感器由硅晶片上的微機械結構組成。該結構由多晶硅彈簧懸掛,當在X,Y和/或Z軸上受到加速度時,它可以在任何方向上平滑偏轉。撓曲會導致固定板和連接到懸掛結構的板之間的電容發生變化。每個軸上的電容變化都會轉換為與該軸上的加速度成比例的輸出電壓。
組裝和接線
該板隨附所有預焊接的表面貼裝組件。隨附的接頭板可以焊接,以便在面包板上或帶有0.1英寸連接器的情況下方便使用。但是,對于承受極高加速度,沖擊或振動的應用,建議使用鎖定連接器或直接焊接。
組裝:
放置標頭:如有必要,將標頭切成適當大小,然后插入標頭-
添加分組討論:對齊分組討論板并將其放在面包板上的排針上。
然后焊接!請務必焊接所有引腳以確保良好的電氣接觸。
I2C接線: ADXL345分支的I2C地址為0x53。只要每個設備具有唯一的地址,它就可以與其他I2C設備共享I2C總線。 I2C通信僅需要4個連接:
GND-》 GND
VIN-》 + 5v
SCL-》 SCL(“經典Arduinos”上的模擬5)
Adafruit分支具有電平轉換和調節電路因此您可以從3-5V供電,并為i2c使用3V或5V邏輯電平
編程和校準
:下載并安裝ADXL345庫。如果尚未安裝Adafruit Sensor庫,您還將需要它。
本指南將幫助您完成安裝過程。
測試:點擊“文件-》示例-》 Adafruit_ADXL345-》 sensortest”以從庫中加載示例草圖。
然后單擊編譯/上傳按鈕進行編譯并將草圖上傳到Arduino。您應該看到類似于以下的輸出。觀察移動木板時值的變化。
校準: ADXL芯片在出廠時已校準精度足以滿足大多數用途。對于要求更高精確度的關鍵應用,您可能希望自己重新校準傳感器。
校準不會改變傳感器的輸出。但是它告訴您在每個軸上的兩個方向上,已知的穩定參考力所對應的傳感器輸出。知道這一點后,您可以根據傳感器讀數計算出校正后的輸出。
重力作為校準參考加速度可以以重力或“ G”為單位進行測量,其中1G表示在地球表面的重力。重力是一個相對穩定的力,可以為地面住宅的接地提供方便和可靠的校準參考。
校準方法:要將傳感器校準為重力參考,需要確定每個軸與重力拉力軸精確對齊時的傳感器輸出。實驗室質量校準使用精密定位夾具。這里描述的方法很簡單,僅用一塊木頭就能獲得令人驚訝的良好結果。
安裝傳感器:首先將傳感器牢固地安裝到模塊或盒子上。只要所有側面成直角,大小都不重要。只要是相當堅硬的材料就不重要。
加載校準草圖:加載并運行下面的校準草圖。打開串行監視器,等待提示。
將模塊定位:
將模塊放置在堅固的平面上,例如堅固的桌子上。在串行監視器中鍵入一個字符,然后按回車鍵。草圖將對該軸進行測量并打印結果。
重新放置塊:旋轉塊,使桌子的另一側平坦,然后鍵入另一個鍵來測量該軸。
重復: 對塊的所有六個側面重復以測量每個軸的正向和負向。
(提示:) 用于被分線板和/或電線遮擋的側面,將方塊按在桌子底部,同時
校準結果:一旦對所有六個面都進行了采樣,串行監視器中打印的值將代表每個軸上+/- 1G力的實際測量值。這些值可用于重新縮放讀數以提高準確性。
校準草圖:
下載:文件
復制代碼
#include
#include
#include
/* Assign a unique ID to this sensor at the same time */
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
float AccelMinX = 0;
float AccelMaxX = 0;
float AccelMinY = 0;
float AccelMaxY = 0;
float AccelMinZ = 0;
float AccelMaxZ = 0;
void setup(void)
{
Serial.begin(9600);
Serial.println(“ADXL345 Accelerometer Calibration”);
Serial.println(“”);
/* Initialise the sensor */
if(!accel.begin())
{
/* There was a problem detecting the ADXL345 。。. check your connections */
Serial.println(“Ooops, no ADXL345 detected 。。. Check your wiring!”);
while(1);
}
}
void loop(void)
{
Serial.println(“Type key when ready.。。”);
while (!Serial.available()){} // wait for a character
/* Get a new sensor event */
sensors_event_t accelEvent;
accel.getEvent(&accelEvent);
if (accelEvent.acceleration.x 《 AccelMinX) AccelMinX = accelEvent.acceleration.x;
if (accelEvent.acceleration.x 》 AccelMaxX) AccelMaxX = accelEvent.acceleration.x;
if (accelEvent.acceleration.y 《 AccelMinY) AccelMinY = accelEvent.acceleration.y;
if (accelEvent.acceleration.y 》 AccelMaxY) AccelMaxY = accelEvent.acceleration.y;
if (accelEvent.acceleration.z 《 AccelMinZ) AccelMinZ = accelEvent.acceleration.z;
if (accelEvent.acceleration.z 》 AccelMaxZ) AccelMaxZ = accelEvent.acceleration.z;
Serial.print(“Accel Minimums: ”); Serial.print(AccelMinX); Serial.print(“ ”);Serial.print(AccelMinY); Serial.print(“ ”); Serial.print(AccelMinZ); Serial.println();
Serial.print(“Accel Maximums: ”); Serial.print(AccelMaxX); Serial.print(“ ”);Serial.print(AccelMaxY); Serial.print(“ ”); Serial.print(AccelMaxZ); Serial.println();
while (Serial.available())
{
Serial.read(); // clear the input buffer
}
} #include
#include
#include
/* Assign a unique ID to this sensor at the same time */
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
float AccelMinX = 0;
float AccelMaxX = 0;
float AccelMinY = 0;
float AccelMaxY = 0;
float AccelMinZ = 0;
float AccelMaxZ = 0;
void setup(void)
{
Serial.begin(9600);
Serial.println(“ADXL345 Accelerometer Calibration”);
Serial.println(“”);
/* Initialise the sensor */
if(!accel.begin())
{
/* There was a problem detecting the ADXL345 。。. check your connections */
Serial.println(“Ooops, no ADXL345 detected 。。. Check your wiring!”);
while(1);
}
}
void loop(void)
{
Serial.println(“Type key when ready.。。”);
while (!Serial.available()){} // wait for a character
/* Get a new sensor event */
sensors_event_t accelEvent;
accel.getEvent(&accelEvent);
if (accelEvent.acceleration.x 《 AccelMinX) AccelMinX = accelEvent.acceleration.x;
if (accelEvent.acceleration.x 》 AccelMaxX) AccelMaxX = accelEvent.acceleration.x;
if (accelEvent.acceleration.y 《 AccelMinY) AccelMinY = accelEvent.acceleration.y;
if (accelEvent.acceleration.y 》 AccelMaxY) AccelMaxY = accelEvent.acceleration.y;
if (accelEvent.acceleration.z 《 AccelMinZ) AccelMinZ = accelEvent.acceleration.z;
if (accelEvent.acceleration.z 》 AccelMaxZ) AccelMaxZ = accelEvent.acceleration.z;
Serial.print(“Accel Minimums: ”); Serial.print(AccelMinX); Serial.print(“ ”);Serial.print(AccelMinY); Serial.print(“ ”); Serial.print(AccelMinZ); Serial.println();
Serial.print(“Accel Maximums: ”); Serial.print(AccelMaxX); Serial.print(“ ”);Serial.print(AccelMaxY); Serial.print(“ ”); Serial.print(AccelMaxZ); Serial.println();
while (Serial.available())
{
Serial.read(); // clear the input buffer
}
}
典型校準輸出:
下載:文件
復制代碼
ADXL345 Accelerometer Calibration
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 -0.24
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 -0.24
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: 0.00 -1.22 -0.27
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: 0.00 -1.22 -0.27
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: -1.18 -1.22 -0.27
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
ADXL345 Accelerometer Calibration
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 -0.24
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 -0.24
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: 0.00 -1.22 -0.27
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: 0.00 -1.22 -0.27
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: -1.18 -1.22 -0.27
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
校準草圖的結果可用于進行兩點校準,如下所述:兩點校準
庫參考
構造函數: Adafruit_ADXL345(int32_t sensorID = -1)
構造ADXL345設備驅動程序對象的實例。 “ sensorID”是設備標識符。每次調用getEvent()時,它將在sensor_event中返回它。 sensorID對驅動程序或設備的操作沒有影響,但是在管理具有多個傳感器的系統中的傳感器事件時很有用。
Initialization() bool begin(void )
begin()函數初始化與設備的通信。如果成功連接到ADXL345,則返回值為‘true’。
傳感器詳細信息: void getSensor(sensor_t *);
getSensor()函數返回有關傳感器的基本信息。有關sensor_t結構的詳細信息,請參閱Adafruit Sensor Library的自述文件。
獲取并設置操作范圍: void setRange(range_t range)
setRange()函數設置傳感器的工作范圍。較高的值將具有較寬的測量范圍。較低的值將具有更高的靈敏度。
有效范圍常數為:
ADXL345_RANGE_16_G
ADXL345_RANGE_8_G
ADXL345_RANGE_4_G
ADXL345_RANGE_2_G (默認值)
range_t getRange(void);
getRange()函數返回由setRange()設置的當前工作范圍
獲取和設置數據速率: void setDataRate(dataRate_t dataRate);
setDataRate()函數設置傳感器輸出更新的速率。高于100 Hz的速率將顯示增加的噪聲。低于6.25 Hz的速率將對溫度變化更加敏感。有關詳細信息,請參見數據表。
有效數據速率常數為:
ADXL345_DATARATE_3200_HZ
ADXL345_DATARATE_1600_HZ
ADXL345_DATARATE_800_HZ
ADXL345_DATARATE_400_HZ
ADXL345_DATARATE_200_HZ
ADXL345_DATARATE_100_HZ
ADXL345_DATARATE_50_HZ
ADXL345_DATARATE_25_HZ
ADXL345_DATARATE_12_5_HZ
ADXL345_DATARATE_6_25HZ
ADXL345_DATARATE_3_13_HZ
ADXL345_DATARATE_1_56_HZ
ADXL345_DATARATE_0_78_HZ
ADXL345_DATARATE_0_39_HZ
ADXL345_DATARATE_0_20_HZ
ADXL345_DATARATE_0_10_HZ (默認值)
dataRate_t getDataRate(void);
getDataRate ()函數返回由setDataRate()設置的當前數據速率。
讀取傳感器事件: void getEvent(sensors_event_t *);
getEvent()函數以sensor_event的形式返回下一個可用的讀數。 sensor_event包含傳遞給構造函數的sensor_id以及來自加速度計的X,Y和Z軸讀數。有關sensor_events的更多信息,請參見Adafruit Sensor Library的自述文件。
Python和CircuitPython
很容易將ADXL343或ADXL345與Python和CircuitPython以及Adafruit CircuitPython ADXL34x模塊結合使用。此模塊使您可以輕松編寫Python代碼,以讀取中斷中的加速度,敲擊,運動等信息。
您可以將此傳感器與任何CircuitPython微控制器板或具有GPIO和Python的計算機配合使用,謝謝。到我們的CircuitPython-for-Python兼容性庫Adafruit_Blinka。
ADXL343和ADXL345略有不同,但是芯片基本相同。此頁面包括每個接線圖的不同接線圖。除了初始化適當的芯片外,兩者的代碼都相同!
CircuitPython微控制器接線
首先,完全按照上一頁中的說明接線。以下是將ADXL343連接到Feather M0的示例:
將羽毛上的 SCL 連接到ADXL343
上的 SCL
將羽毛上的 SDA 連接到ADXL343上的 SDA
將羽毛上的 GND 連接到 ADXL343上的GND
將羽毛上的 3.3V 連接到ADXL343
上的 VIN div》
下面是將ADXL345連接到羽毛M0的示例:
上的 VIN
將羽毛上的 SCL 連接到 ADXL345上的SCL
Connect SDA 羽毛上的ong》到ADXL345中的 SDA
將羽毛上的 GND 連接到ADXL345上的 GND
將羽毛上的 3.3V 連接到ADXL345
Python計算機接線
您可以使用的數十款Linux計算機/主板,我們將顯示Raspberry Pi的接線。對于其他平臺,請訪問Linux上的CircuitPython指南,以了解您的平臺是否受支持。
下圖顯示了連接到ADXL343的Raspberry Pi:
Connect SCL 在ADXL343上將RPi鏈接到 SCL
在RXL上將RPi鏈接到 SDA
將Rpi上的 GND 連接到ADXL343上的 GND
將Rpi上的 3.3V 連接到 ADXL343上的VIN
下圖顯示了連接到ADXL345的Raspberry Pi:
連接 SCL 到ADXL345上的 SCL
將RPi上的 SDA 連接到 SDA 將RPi上的ADXL345
連接 GND 中的音頻連接到ADXL345
Connect 3.3V 中的 GND 》在RPi上為 VIN 在ADXL345上
庫安裝
您需要在CircuitPython板上安裝Adafruit CircuitPython ADXL34x庫。
首先請確保您的電路板正在運行最新版本的Adafruit CircuitPython。
接下來,您需要安裝必要的庫以使用硬件-仔細按照以下步驟查找并安裝這些庫來自Adafruit的CircuitPython庫捆綁包。我們的CircuitPython入門指南上有一個很棒的頁面,說明如何安裝庫捆綁包。
對于諸如Trinket M0或Gemma M0的非表達板,您需要從捆綁包中手動安裝必要的庫:
adafruit_adxl34x.mpy
adafruit_bus_device
在繼續之前,請確保您的板的lib文件夾或根文件系統已復制 adafruit_adxl34x.mpy 和 adafruit_bus_device 文件和文件夾。 p》
下一步連接到開發板的串行REPL,因此您在CircuitPython 》》》 提示符下。
ADXL34x庫的Python安裝
您需要安裝 Adafruit_Blinka 庫在Python中提供CircuitPython支持。這可能還需要在您的平臺上啟用I2C并驗證您正在運行Python3。由于每個平臺都有所不同,并且Linux經常更改,請訪問Linux上的CircuitPython指南以準備好您的計算機!
完成后,從命令行運行以下命令:
sudo pip3 install adafruit-circuitpython-adxl34x
如果您的默認Python是版本3,則可能需要改為運行“ pip”。只要確保您不嘗試在Python 2.x上使用CircuitPython,就不支持它!
CircuitPython和Python的用法
為演示突破的用法,我們將對其進行初始化,并從開發板的Python REPL中讀取加速度以及更多信息。
運行以下代碼以導入必要的模塊并創建I2C對象:
下載:文件
復制代碼
import time
import board
import busio
import adafruit_adxl34x
i2c = busio.I2C(board.SCL, board.SDA) import time
import board
import busio
import adafruit_adxl34x
i2c = busio.I2C(board.SCL, board.SDA)
如果您使用的是 ADXL343 ,運行以下命令以使用中斷初始化I2C連接:
下載:文件
復制代碼
accelerometer = adafruit_adxl34x.ADXL343(i2c) accelerometer = adafruit_adxl34x.ADXL343(i2c)
如果您使用的是 ADXL345 ,請運行以下使用中斷初始化I2C連接:
下載:文件
復制代碼
accelerometer = adafruit_adxl34x.ADXL345(i2c) accelerometer = adafruit_adxl34x.ADXL345(i2c)
現在,您可以使用以下任意一種方法從突破中讀取值并啟用突破功能:
加速-x,y和z軸上的加速度值
enable_motion_detection -啟用運動檢測。允許設置閾值。閾值默認為18。
enable_tap_detection -啟用點擊檢測。允許單次或兩次點擊檢測。
enable_freefall_detection -啟用自由落體檢測。允許設置閾值和時間。閾值默認為10,時間默認為25。
事件-用于在啟用運動檢測,敲擊檢測和自由落體檢測時讀取事件。需要指定要嘗試讀取的事件。
要打印加速度值:
下載:文件
復制代碼
while True:
print(accelerometer.acceleration)
time.sleep(0.2) while True:
print(accelerometer.acceleration)
time.sleep(0.2)
這就是使用CircuitPython從ADXL343和ADXL345讀取加速度值的全部內容!
完整示例代碼
下載:Project Zip 或 adxl34x_simpletest.py | 在Github上查看
復制代碼
import time
import board
import busio
import adafruit_adxl34x
i2c = busio.I2C(board.SCL, board.SDA)
# For ADXL343
accelerometer = adafruit_adxl34x.ADXL343(i2c)
# For ADXL345
# accelerometer = adafruit_adxl34x.ADXL345(i2c)
while True:
print(“%f %f %f” % accelerometer.acceleration)
time.sleep(0.2)
import time
import board
import busio
import adafruit_adxl34x
i2c = busio.I2C(board.SCL, board.SDA)
# For ADXL343
accelerometer = adafruit_adxl34x.ADXL343(i2c)
# For ADXL345
# accelerometer = adafruit_adxl34x.ADXL345(i2c)
while True:
print(“%f %f %f” % accelerometer.acceleration)
time.sleep(0.2)
運動,輕擊和自由落落
有一些啟用和使用運動,輕擊和自由落落的示例在GitHub上:
在ADXL343和ADXL345上進行運動檢測
在ADXL343和ADXL345上進行抽頭檢測
在ADXL343和ADXL345上進行自由落體檢測
將任何文件另存為CircuitPython板上的 code.py ,或從Python運行在您的Linux計算機上進行REPL,以進行嘗試。
下載
文件
ADXL345數據表
Adafruit Fritzing庫中的Fritzing對象
GitHub上的EagleCAD PCB文件
示意圖和構造打印
責任編輯:wv
-
加速度計
+關注
關注
6文章
704瀏覽量
46002 -
ADXL345
+關注
關注
14文章
73瀏覽量
34008
發布評論請先 登錄
相關推薦
評論