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:

  1. 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).

  2. 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.

  3. 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.

 

thumb

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

thumb

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

thumb

 

 

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.

thumb

Dodatna uporaba

Z 3-osnim pospeškometrom lahko nadzorujete vklop in izklop treh LED diod. Na primer:thumb