A16. ADXL345 kiihtyvyysanturi - matpi/EmbeddedSystemsUTU GitHub Wiki
##ADXL345 kiihtyvyysanturi
ADXL345 on digitaalinen kiihtyvyysanturi, joka mittaa kiihtyvyyttä kolmella akselilla (x,y,z). Laitetta luetaan ja ohjataan I2C-väylällä, joten se tarvitsee vain kaksi datalinjaa. I2C-väylän vaatimat ylösvetovastukset ovat valmiina moduulissa. Laitetta voidaan käyttää hyvin erilaisissa projekteissa. Arduino voidaan ohjelmoida vaikkapa tunnistamaan kiihtyvyysanturin avulla vapaapudotus tai muunlainen liikeaktiivisuus. Anturille löytyy englanninkielinen tutorial esimerkiksi sivustolta http://bildr.org/2011/03/adxl345-arduino/
• käyttöjännite 3.3 V tai 5 V
ADXL345 kiihtyvyysanturi liitetään Arduinon I2C väylään kuten muutkin I2C laitteet:
• ADXL345 GND -> Arduino GND
• ADXL345 VCC -> Arduino +5v
• ADXL345 SDA -> Arduino SDA (Analog 4)
• ADXL345 SCL -> Arduino SCL (Analog 5)
1. Ladatkaa arduino-ohjelmasta löytyvä koodi Arduinolle. Laite voidaan kytkeä joko 3,3 V tai 3,5 käyttöjännitteelle. Kokeilkaa laitetta.
Esimerkki 1: Luetaan kiihtyvyysdataa ja tulostetaan sarjaporttiin.
//Arduino 1.0+ Only!
//Arduino 1.0+ Only!
#include <Wire.h>
#include <ADXL345.h>
ADXL345 adxl; //alustetaan kirjasto objekti
void setup()
{
Serial.begin(9600);
adxl.powerOn(); // sensori päälle
}
void loop()
{
//Boring accelerometer stuff
int x,y,z; // luodaan int-muuttujat jokaiselle kiihtyvyyssuunnalle
adxl.readAccel(&x, &y, &z); //luetaan kiihtyvyydet ja tallenetaan ne muuttujiin x,y,z
// Output x,y,z values - Commented out
Serial.print("X=");
Serial.print(x);
Serial.print("Y=");
Serial.print(y);
Serial.print("Z=");
Serial.println(z);
}
Esimerkki 2: Tämä koodi löytyy Arduino-ohjelman esimerkeistä ADXL345 kiihtyvyysanturin alta nimellä adxl345_example. Alla olevassa koodissa activity ja inactivity rajoja on hieman muutettu. Koodi lukee tiedon siitä, liikutellaanko sensoria vai ei.
// Arduino 1.0+ Only!
// Arduino 1.0+ Only!
#include <Wire.h>
#include <ADXL345.h>
ADXL345 adxl; // variable adxl is an instance of the ADXL345 library
void setup()
{
Serial.begin(9600);
adxl.powerOn();
// asetetaan activity / inactivity rajat (0-255)
adxl.setActivityThreshold(100); //62.5mg per increment
adxl.setInactivityThreshold(125); //62.5mg per increment
adxl.setTimeInactivity(10); // kuinka monta sekunttia toimettomuutta tulkitaan olevan "inactivity"?
// millä akseleilla aktiivisuutta tutkitaan s - 1 == on; 0 == off
adxl.setActivityX(1);
adxl.setActivityY(1);
adxl.setActivityZ(1);
// look of inactivity movement on this axes - 1 == on; 0 == off
adxl.setInactivityX(1);
adxl.setInactivityY(1);
adxl.setInactivityZ(1);
// setting all interupts to take place on int pin 1
// I had issues with int pin 2, was unable to reset it
adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT, ADXL345_INT1_PIN );
adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT, ADXL345_INT1_PIN );
// register interupt actions - 1 == on; 0 == off
adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT, 1);
adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
}
void loop()
{
// Fun Stuff!
// read interrupts source and look for triggerd actions
// getInterruptSource clears all triggered actions after returning value
// so do not call again until you need to recheck for triggered actions
byte interrupts = adxl.getInterruptSource();
// inactivity
if(adxl.triggered(interrupts, ADXL345_INACTIVITY))
{
Serial.println("inactivity");
//add code here to do when inactivity is sensed
}
// activity
if(adxl.triggered(interrupts, ADXL345_ACTIVITY))
{
Serial.println("activity");
// add code here to do when activity is sensed
}
}