Prispevki
Modul pospeškomer tri osni ADXL345
Splošno
Pospeškomer je elektronski senzor, ki meri pospešek – spremembo hitrosti v času – na eni ali več osi. Pospeškomeri se pogosto uporabljajo v različnih aplikacijah, kot so avtomobilska elektronika, letalstvo, robotika, igralne konzole, pametni telefoni, športna oprema in še več. Merijo linearni pospešek, ki ga povzročajo zunanje sile (kot je gravitacija), in vibracije ali gibanje same naprave.
Obstajajo različne vrste pospeškomerov, med najpogostejše spadajo:
Piezoelektrični pospeškomeri: Delujejo na osnovi piezoelektričnega efekta, kjer se mehanski pritisk (npr. pospešek) pretvori v električni naboj. Piezoelektrični pospeškomeri so občutljivi in lahko merijo širok razpon pospeškov, vendar so bolj primerni za merjenje dinamičnih pospeškov (npr. vibracij) kot statičnih pospeškov (npr. gravitacije).
Kapacitivni pospeškomeri: Delujejo na principu spremembe kapacitivnosti, ki nastane, ko se premikajoče se mase v senzorju zaradi pospeška premaknejo glede na fiksne elektrode. Kapacitivni pospeškomeri so zelo občutljivi in lahko merijo tako statične kot dinamične pospeške, kar jih naredi primernih za široko paleto aplikacij.
Piezorezistivni pospeškomeri: Uporabljajo piezorezistivne elemente, ki spremenijo svojo električno upornost, ko so podvrženi mehanskemu naprezanju zaradi pospeška. Piezorezistivni pospeškomeri so manj občutljivi kot kapacitivni ali piezoelektrični pospeškomeri, vendar so pogosto bolj robustni in zanesljivi.
Pospeškomeri za hobby uporabo so pogosto na voljo kot moduli, ki so enostavni za uporabo z mikrokontrolerji, kot so Arduino, Raspberry Pi in drugimi razvojnimi ploščami. Ti moduli lahko vključujejo tudi dodatne senzorje, kot so žiroskopi in magnetometri, ki skupaj tvorijo IMU (Inertial Measurement Unit) za merjenje orientacije, gibanja in položaja naprave.
Uvod
ADXL345 je majhen, tanek, nizkoenergijski MEMS pospeškometer treh osi z visoko ločljivostjo (merjenje z 13 biti) pri do +-16 g. Digitalni izhodni podatki so oblikovani kot 16-bitni dvokomplementni in so dostopni preko digitalnega vmesnika SPI (3- ali 4-žični) ali I2C.
ADXL345 je dobro prilagojen za merjenje statičnega pospeška zaradi gravitacije v aplikacijah za zaznavanje nagiba, pa tudi dinamičnega pospeška, ki nastane zaradi gibanja ali udarcev. Zaradi visoke ločljivosti (4 mg/LSB) je mogoče meriti spremembe nagiba manj kot 1,0 stopinje.
Specifikacije
Napetost napajanja: 2,0-3,6 VDC
Izjemno nizka poraba energije: 40 uA v načinu merjenja, 0,1 uA v stanju pripravljenosti pri 2,5 V
Zaznavanje tapkanja/dvojnega tapkanja
Zaznavanje prostega pada
Vmesnika SPI in I2C
Programska koda
Priklop vezja je naslednji:
VCC: 5V
GND: GND
SCL: A5 na UNO
SDA: A4 na UNO
#include
// Registers for ADXL345
#define ADXL345_ADDRESS (0xA6 >> 1) // address for device is 8 bit but shift to the
// right by 1 bit to make it 7 bit because the
// wire library only takes in 7 bit addresses
#define ADXL345_REGISTER_XLSB (0x32)
int accelerometer_data[3];
// void because this only tells the cip to send data to its output register
// writes data to the slave's buffer
void i2c_write(int address, byte reg, byte data) {
// Send output register address
Wire.beginTransmission(address);
// Connect to device
Wire.write(reg);
// Send data
Wire.write(data); //low byte
Wire.endTransmission();
}
// void because using pointers
// microcontroller reads data from the sensor's input register
void i2c_read(int address, byte reg, int count, byte* data) {
// Used to read the number of data received
int i = 0;
// Send input register address
Wire.beginTransmission(address);
// Connect to device
Wire.write(reg);
Wire.endTransmission();
// Connect to device
Wire.beginTransmission(address);
// Request data from slave
// Count stands for number of bytes to request
Wire.requestFrom(address, count);
while(Wire.available()) // slave may send less than requested
{
char c = Wire.read(); // receive a byte as character
data[i] = c;
i++;
}
Wire.endTransmission();
}
void init_adxl345() {
byte data = 0;
i2c_write(ADXL345_ADDRESS, 0x31, 0x0B); // 13-bit mode +_ 16g
i2c_write(ADXL345_ADDRESS, 0x2D, 0x08); // Power register
i2c_write(ADXL345_ADDRESS, 0x1E, 0x00); // x
i2c_write(ADXL345_ADDRESS, 0x1F, 0x00); // Y
i2c_write(ADXL345_ADDRESS, 0x20, 0x05); // Z
// Check to see if it worked!
i2c_read(ADXL345_ADDRESS, 0X00, 1, &data);
if(data==0xE5)
Serial.println("it work Success");
else
Serial.println("it work Fail");
}
void read_adxl345() {
byte bytes[6];
memset(bytes,0,6);
// Read 6 bytes from the ADXL345
i2c_read(ADXL345_ADDRESS, ADXL345_REGISTER_XLSB, 6, bytes);
// Unpack data
for (int i=0;i<3;++i) {
accelerometer_data[i] = (int)bytes[2*i] + (((int)bytes[2*i + 1]) << 8);
}
}
// initialise and start everything
void setup() {
Wire.begin();
Serial.begin(9600);
for(int i=0; i<3; ++i) {
accelerometer_data[i] = 0;
}
init_adxl345();
}
void loop() {
read_adxl345();
Serial.print("ACCEL: ");
Serial.print(float(accelerometer_data[0])*3.9/1000);//3.9mg/LSB scale factor in 13-bit mode
Serial.print("\t");
Serial.print(float(accelerometer_data[1])*3.9/1000);
Serial.print("\t");
Serial.print(float(accelerometer_data[2])*3.9/1000);
Serial.print("\n");
delay(100);
}
Rezultat
Priklopite vezje kot je prikazano na zgornjem diagramu, ga priklopite na napajanje in nato naložite kodo. Po tem odprite serijski monitor, kjer se bo prikazal triosni pospešek senzorja in njegovo stanje, kot je prikazano na spodnjem grafu.
Dodatna uporaba
Z 3-osnim pospeškometrom lahko nadzorujete vklop in izklop treh LED diod. Na primer:
Viri
- Video: http://video.keyestudio.com/ks0012/
- PDF in kodo najdete na https://fs.keyestudio.com/KS0012