概述
ADXL345是一款低功耗,三軸MEMS加速度計(jì)模塊,具有I2C和SPI接口。這些模塊的Adafruit Breakout板載板載3.3v電壓調(diào)節(jié)和電平轉(zhuǎn)換功能,使其易于與Arduino等5v微控制器接口。
ADXL345具有4個(gè)靈敏度范圍,從+/- 2G到+/- 16G。它支持10Hz到3200Hz的輸出數(shù)據(jù)速率。
工作原理:
MEMS-微型機(jī)電系統(tǒng)傳感器由硅晶片上的微機(jī)械結(jié)構(gòu)組成。該結(jié)構(gòu)由多晶硅彈簧懸掛,當(dāng)在X,Y和/或Z軸上受到加速度時(shí),它可以在任何方向上平滑偏轉(zhuǎn)。撓曲會導(dǎo)致固定板和連接到懸掛結(jié)構(gòu)的板之間的電容發(fā)生變化。每個(gè)軸上的電容變化都會轉(zhuǎn)換為與該軸上的加速度成比例的輸出電壓。
組裝和接線
該板隨附所有預(yù)焊接的表面貼裝組件。隨附的接頭板可以焊接,以便在面包板上或帶有0.1英寸連接器的情況下方便使用。但是,對于承受極高加速度,沖擊或振動的應(yīng)用,建議使用鎖定連接器或直接焊接。
組裝:
放置標(biāo)頭:如有必要,將標(biāo)頭切成適當(dāng)大小,然后插入標(biāo)頭-
添加分組討論:對齊分組討論板并將其放在面包板上的排針上。
然后焊接!請務(wù)必焊接所有引腳以確保良好的電氣接觸。
I2C接線: ADXL345分支的I2C地址為0x53。只要每個(gè)設(shè)備具有唯一的地址,它就可以與其他I2C設(shè)備共享I2C總線。 I2C通信僅需要4個(gè)連接:
GND-》 GND
VIN-》 + 5v
SDA-》 SDA(“經(jīng)典Arduino”上的模擬4)
SCL-》 SCL(“經(jīng)典Arduinos”上的模擬5)
Adafruit分支具有電平轉(zhuǎn)換和調(diào)節(jié)電路因此您可以從3-5V供電,并為i2c使用3V或5V邏輯電平
編程和校準(zhǔn)
:下載并安裝ADXL345庫。如果尚未安裝Adafruit Sensor庫,您還將需要它。
本指南將幫助您完成安裝過程。
測試:點(diǎn)擊“文件-》示例-》 Adafruit_ADXL345-》 sensortest”以從庫中加載示例草圖。
然后單擊編譯/上傳按鈕進(jìn)行編譯并將草圖上傳到Arduino。您應(yīng)該看到類似于以下的輸出。觀察移動木板時(shí)值的變化。
校準(zhǔn): ADXL芯片在出廠時(shí)已校準(zhǔn)精度足以滿足大多數(shù)用途。對于要求更高精確度的關(guān)鍵應(yīng)用,您可能希望自己重新校準(zhǔn)傳感器。
校準(zhǔn)不會改變傳感器的輸出。但是它告訴您在每個(gè)軸上的兩個(gè)方向上,已知的穩(wěn)定參考力所對應(yīng)的傳感器輸出。知道這一點(diǎn)后,您可以根據(jù)傳感器讀數(shù)計(jì)算出校正后的輸出。
重力作為校準(zhǔn)參考加速度可以以重力或“ G”為單位進(jìn)行測量,其中1G表示在地球表面的重力。重力是一個(gè)相對穩(wěn)定的力,可以為地面住宅的接地提供方便和可靠的校準(zhǔn)參考。
校準(zhǔn)方法:要將傳感器校準(zhǔn)為重力參考,需要確定每個(gè)軸與重力拉力軸精確對齊時(shí)的傳感器輸出。實(shí)驗(yàn)室質(zhì)量校準(zhǔn)使用精密定位夾具。這里描述的方法很簡單,僅用一塊木頭就能獲得令人驚訝的良好結(jié)果。
安裝傳感器:首先將傳感器牢固地安裝到模塊或盒子上。只要所有側(cè)面成直角,大小都不重要。只要是相當(dāng)堅(jiān)硬的材料就不重要。
加載校準(zhǔn)草圖:加載并運(yùn)行下面的校準(zhǔn)草圖。打開串行監(jiān)視器,等待提示。
將模塊定位:
將模塊放置在堅(jiān)固的平面上,例如堅(jiān)固的桌子上。在串行監(jiān)視器中鍵入一個(gè)字符,然后按回車鍵。草圖將對該軸進(jìn)行測量并打印結(jié)果。
重新放置塊:旋轉(zhuǎn)塊,使桌子的另一側(cè)平坦,然后鍵入另一個(gè)鍵來測量該軸。
重復(fù): 對塊的所有六個(gè)側(cè)面重復(fù)以測量每個(gè)軸的正向和負(fù)向。
(提示:) 用于被分線板和/或電線遮擋的側(cè)面,將方塊按在桌子底部,同時(shí)
校準(zhǔn)結(jié)果:一旦對所有六個(gè)面都進(jìn)行了采樣,串行監(jiān)視器中打印的值將代表每個(gè)軸上+/- 1G力的實(shí)際測量值。這些值可用于重新縮放讀數(shù)以提高準(zhǔn)確性。
校準(zhǔn)草圖:
下載:文件
復(fù)制代碼
#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
}
}
典型校準(zhǔn)輸出:
下載:文件
復(fù)制代碼
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.。。
校準(zhǔn)草圖的結(jié)果可用于進(jìn)行兩點(diǎn)校準(zhǔn),如下所述:兩點(diǎn)校準(zhǔn)
庫參考
構(gòu)造函數(shù): Adafruit_ADXL345(int32_t sensorID = -1)
構(gòu)造ADXL345設(shè)備驅(qū)動程序?qū)ο蟮膶?shí)例。 “ sensorID”是設(shè)備標(biāo)識符。每次調(diào)用getEvent()時(shí),它將在sensor_event中返回它。 sensorID對驅(qū)動程序或設(shè)備的操作沒有影響,但是在管理具有多個(gè)傳感器的系統(tǒng)中的傳感器事件時(shí)很有用。
Initialization() bool begin(void )
begin()函數(shù)初始化與設(shè)備的通信。如果成功連接到ADXL345,則返回值為‘true’。
傳感器詳細(xì)信息: void getSensor(sensor_t *);
getSensor()函數(shù)返回有關(guān)傳感器的基本信息。有關(guān)sensor_t結(jié)構(gòu)的詳細(xì)信息,請參閱Adafruit Sensor Library的自述文件。
獲取并設(shè)置操作范圍: void setRange(range_t range)
setRange()函數(shù)設(shè)置傳感器的工作范圍。較高的值將具有較寬的測量范圍。較低的值將具有更高的靈敏度。
有效范圍常數(shù)為:
ADXL345_RANGE_16_G
ADXL345_RANGE_8_G
ADXL345_RANGE_4_G
ADXL345_RANGE_2_G (默認(rèn)值)
range_t getRange(void);
getRange()函數(shù)返回由setRange()設(shè)置的當(dāng)前工作范圍
獲取和設(shè)置數(shù)據(jù)速率: void setDataRate(dataRate_t dataRate);
setDataRate()函數(shù)設(shè)置傳感器輸出更新的速率。高于100 Hz的速率將顯示增加的噪聲。低于6.25 Hz的速率將對溫度變化更加敏感。有關(guān)詳細(xì)信息,請參見數(shù)據(jù)表。
有效數(shù)據(jù)速率常數(shù)為:
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 (默認(rèn)值)
dataRate_t getDataRate(void);
getDataRate ()函數(shù)返回由setDataRate()設(shè)置的當(dāng)前數(shù)據(jù)速率。
讀取傳感器事件: void getEvent(sensors_event_t *);
getEvent()函數(shù)以sensor_event的形式返回下一個(gè)可用的讀數(shù)。 sensor_event包含傳遞給構(gòu)造函數(shù)的sensor_id以及來自加速度計(jì)的X,Y和Z軸讀數(shù)。有關(guān)sensor_events的更多信息,請參見Adafruit Sensor Library的自述文件。
Python和CircuitPython
很容易將ADXL343或ADXL345與Python和CircuitPython以及Adafruit CircuitPython ADXL34x模塊結(jié)合使用。此模塊使您可以輕松編寫Python代碼,以讀取中斷中的加速度,敲擊,運(yùn)動等信息。
您可以將此傳感器與任何CircuitPython微控制器板或具有GPIO和Python的計(jì)算機(jī)配合使用,謝謝。到我們的CircuitPython-for-Python兼容性庫Adafruit_Blinka。
ADXL343和ADXL345略有不同,但是芯片基本相同。此頁面包括每個(gè)接線圖的不同接線圖。除了初始化適當(dāng)?shù)男酒猓瑑烧叩拇a都相同!
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計(jì)算機(jī)接線
您可以使用的數(shù)十款Linux計(jì)算機(jī)/主板,我們將顯示Raspberry Pi的接線。對于其他平臺,請?jiān)L問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庫。
首先請確保您的電路板正在運(yùn)行最新版本的Adafruit CircuitPython。
接下來,您需要安裝必要的庫以使用硬件-仔細(xì)按照以下步驟查找并安裝這些庫來自Adafruit的CircuitPython庫捆綁包。我們的CircuitPython入門指南上有一個(gè)很棒的頁面,說明如何安裝庫捆綁包。
對于諸如Trinket M0或Gemma M0的非表達(dá)板,您需要從捆綁包中手動安裝必要的庫:
adafruit_adxl34x.mpy
adafruit_bus_device
在繼續(xù)之前,請確保您的板的lib文件夾或根文件系統(tǒng)已復(fù)制 adafruit_adxl34x.mpy 和 adafruit_bus_device 文件和文件夾。 p》
下一步連接到開發(fā)板的串行REPL,因此您在CircuitPython 》》》 提示符下。
ADXL34x庫的Python安裝
您需要安裝 Adafruit_Blinka 庫在Python中提供CircuitPython支持。這可能還需要在您的平臺上啟用I2C并驗(yàn)證您正在運(yùn)行Python3。由于每個(gè)平臺都有所不同,并且Linux經(jīng)常更改,請?jiān)L問Linux上的CircuitPython指南以準(zhǔn)備好您的計(jì)算機(jī)!
完成后,從命令行運(yùn)行以下命令:
sudo pip3 install adafruit-circuitpython-adxl34x
如果您的默認(rèn)Python是版本3,則可能需要改為運(yùn)行“ pip”。只要確保您不嘗試在Python 2.x上使用CircuitPython,就不支持它!
CircuitPython和Python的用法
為演示突破的用法,我們將對其進(jìn)行初始化,并從開發(fā)板的Python REPL中讀取加速度以及更多信息。
運(yùn)行以下代碼以導(dǎo)入必要的模塊并創(chuàng)建I2C對象:
下載:文件
復(fù)制代碼
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 ,運(yùn)行以下命令以使用中斷初始化I2C連接:
下載:文件
復(fù)制代碼
accelerometer = adafruit_adxl34x.ADXL343(i2c) accelerometer = adafruit_adxl34x.ADXL343(i2c)
如果您使用的是 ADXL345 ,請運(yùn)行以下使用中斷初始化I2C連接:
下載:文件
復(fù)制代碼
accelerometer = adafruit_adxl34x.ADXL345(i2c) accelerometer = adafruit_adxl34x.ADXL345(i2c)
現(xiàn)在,您可以使用以下任意一種方法從突破中讀取值并啟用突破功能:
加速-x,y和z軸上的加速度值
enable_motion_detection -啟用運(yùn)動檢測。允許設(shè)置閾值。閾值默認(rèn)為18。
enable_tap_detection -啟用點(diǎn)擊檢測。允許單次或兩次點(diǎn)擊檢測。
enable_freefall_detection -啟用自由落體檢測。允許設(shè)置閾值和時(shí)間。閾值默認(rèn)為10,時(shí)間默認(rèn)為25。
事件-用于在啟用運(yùn)動檢測,敲擊檢測和自由落體檢測時(shí)讀取事件。需要指定要嘗試讀取的事件。
要打印加速度值:
下載:文件
復(fù)制代碼
while True:
print(accelerometer.acceleration)
time.sleep(0.2) while True:
print(accelerometer.acceleration)
time.sleep(0.2)
這就是使用CircuitPython從ADXL343和ADXL345讀取加速度值的全部內(nèi)容!
完整示例代碼
下載:Project Zip 或 adxl34x_simpletest.py | 在Github上查看
復(fù)制代碼
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)
運(yùn)動,輕擊和自由落落
有一些啟用和使用運(yùn)動,輕擊和自由落落的示例在GitHub上:
在ADXL343和ADXL345上進(jìn)行運(yùn)動檢測
在ADXL343和ADXL345上進(jìn)行抽頭檢測
在ADXL343和ADXL345上進(jìn)行自由落體檢測
將任何文件另存為CircuitPython板上的 code.py ,或從Python運(yùn)行在您的Linux計(jì)算機(jī)上進(jìn)行REPL,以進(jìn)行嘗試。
下載
文件
ADXL345數(shù)據(jù)表
Adafruit Fritzing庫中的Fritzing對象
GitHub上的EagleCAD PCB文件
示意圖和構(gòu)造打印
責(zé)任編輯:wv
-
加速度計(jì)
+關(guān)注
關(guān)注
6文章
702瀏覽量
45897 -
ADXL345
+關(guān)注
關(guān)注
14文章
71瀏覽量
33911
發(fā)布評論請先 登錄
相關(guān)推薦
評論