diff --git a/src/SparkFun_ADXL345.cpp b/src/SparkFun_ADXL345.cpp index 195155d..5ca43e6 100644 --- a/src/SparkFun_ADXL345.cpp +++ b/src/SparkFun_ADXL345.cpp @@ -1,5 +1,5 @@ -/* -Sparkfun's ADXL345 Library Main Source File +/* +Sparkfun's ADXL345 Library Main Source File SparkFun_ADXL345.cpp E.Robert @ SparkFun Electronics @@ -16,807 +16,883 @@ Hardware Resources: Development Environment Specifics: Arduino 1.6.8 SparkFun Triple Axis Accelerometer Breakout - ADXL345 -Arduino Uno -*/ - -#include "Arduino.h" -#include "SparkFun_ADXL345.h" -#include -#include - -#define ADXL345_DEVICE (0x53) // Device Address for ADXL345 -#define ADXL345_TO_READ (6) // Number of Bytes Read - Two Bytes Per Axis - -ADXL345::ADXL345() { - status = ADXL345_OK; - error_code = ADXL345_NO_ERROR; - - gains[0] = 0.00376390; // Original gain 0.00376390 - gains[1] = 0.00376009; // Original gain 0.00376009 - gains[2] = 0.00349265; // Original gain 0.00349265 - I2C = true; -} - -ADXL345::ADXL345(int CS) { - status = ADXL345_OK; - error_code = ADXL345_NO_ERROR; - - gains[0] = 0.00376390; - gains[1] = 0.00376009; - gains[2] = 0.00349265; - _CS = CS; - I2C = false; - SPI.begin(); - SPI.setDataMode(SPI_MODE3); - pinMode(_CS, OUTPUT); - digitalWrite(_CS, HIGH); -} - -void ADXL345::powerOn() { - if(I2C) { - Wire.begin(); // If in I2C Mode Only - } - //ADXL345 TURN ON - writeTo(ADXL345_POWER_CTL, 0); // Wakeup - writeTo(ADXL345_POWER_CTL, 16); // Auto_Sleep - writeTo(ADXL345_POWER_CTL, 8); // Measure -} - - -/*********************** READING ACCELERATION ***********************/ -/* Reads Acceleration into Three Variables: x, y and z */ - -void ADXL345::readAccel(int *xyz){ - readAccel(xyz, xyz + 1, xyz + 2); -} - -void ADXL345::readAccel(int *x, int *y, int *z) { - readFrom(ADXL345_DATAX0, ADXL345_TO_READ, _buff); // Read Accel Data from ADXL345 - - // Each Axis @ All g Ranges: 10 Bit Resolution (2 Bytes) - *x = (int16_t)((((int)_buff[1]) << 8) | _buff[0]); - *y = (int16_t)((((int)_buff[3]) << 8) | _buff[2]); - *z = (int16_t)((((int)_buff[5]) << 8) | _buff[4]); -} - -void ADXL345::get_Gxyz(double *xyz){ - int i; - int xyz_int[3]; - readAccel(xyz_int); - for(i=0; i<3; i++){ - xyz[i] = xyz_int[i] * gains[i]; - } -} - -/***************** WRITES VALUE TO ADDRESS REGISTER *****************/ -void ADXL345::writeTo(byte address, byte val) { - if(I2C) { - writeToI2C(address, val); - } - else { - writeToSPI(address, val); - } -} - -/************************ READING NUM BYTES *************************/ -/* Reads Num Bytes. Starts from Address Reg to _buff Array */ -void ADXL345::readFrom(byte address, int num, byte _buff[]) { - if(I2C) { - readFromI2C(address, num, _buff); // If I2C Communication - } - else { - readFromSPI(address, num, _buff); // If SPI Communication - } -} - -/*************************** WRITE TO I2C ***************************/ -/* Start; Send Register Address; Send Value To Write; End */ -void ADXL345::writeToI2C(byte _address, byte _val) { - Wire.beginTransmission(ADXL345_DEVICE); - Wire.write(_address); - Wire.write(_val); - Wire.endTransmission(); -} - -/*************************** READ FROM I2C **************************/ -/* Start; Send Address To Read; End */ -void ADXL345::readFromI2C(byte address, int num, byte _buff[]) { - Wire.beginTransmission(ADXL345_DEVICE); - Wire.write(address); - Wire.endTransmission(); - -// Wire.beginTransmission(ADXL345_DEVICE); -// Wire.reqeustFrom contains the beginTransmission and endTransmission in it. - Wire.requestFrom(ADXL345_DEVICE, num); // Request 6 Bytes - - int i = 0; - while(Wire.available()) - { - _buff[i] = Wire.read(); // Receive Byte - i++; - } - if(i != num){ - status = ADXL345_ERROR; - error_code = ADXL345_READ_ERROR; - } -// Wire.endTransmission(); -} - -/************************** WRITE FROM SPI **************************/ -/* Point to Destination; Write Value; Turn Off */ -void ADXL345::writeToSPI(byte __reg_address, byte __val) { - digitalWrite(_CS, LOW); - SPI.transfer(__reg_address); - SPI.transfer(__val); - digitalWrite(_CS, HIGH); -} - -/*************************** READ FROM SPI **************************/ -/* */ -void ADXL345::readFromSPI(byte __reg_address, int num, byte _buff[]) { - // Read: Most Sig Bit of Reg Address Set - char _address = 0x80 | __reg_address; - // If Multi-Byte Read: Bit 6 Set - if(num > 1) { - _address = _address | 0x40; - } - - digitalWrite(_CS, LOW); - SPI.transfer(_address); // Transfer Starting Reg Address To Be Read - for(int i=0; i>= 1) - { - r++; - } - if (r <= 9) { - readFrom(ADXL345_BW_RATE, 1, &_b); - _s = (byte) (r + 6) | (_b & B11110000); - writeTo(ADXL345_BW_RATE, _s); - } -} - -/*************************** BANDWIDTH ******************************/ -/* ~ SET & GET */ -void ADXL345::set_bw(byte bw_code){ - if((bw_code < ADXL345_BW_0_05) || (bw_code > ADXL345_BW_1600)){ - status = false; - error_code = ADXL345_BAD_ARG; - } - else{ - writeTo(ADXL345_BW_RATE, bw_code); - } -} - -byte ADXL345::get_bw_code(){ - byte bw_code; - readFrom(ADXL345_BW_RATE, 1, &bw_code); - return bw_code; -} - - - - -/************************* TRIGGER CHECK ***************************/ -/* */ -// Check if Action was Triggered in Interrupts -// Example triggered(interrupts, ADXL345_SINGLE_TAP); -bool ADXL345::triggered(byte interrupts, int mask){ - return ((interrupts >> mask) & 1); -} - -/* - ADXL345_DATA_READY - ADXL345_SINGLE_TAP - ADXL345_DOUBLE_TAP - ADXL345_ACTIVITY - ADXL345_INACTIVITY - ADXL345_FREE_FALL - ADXL345_WATERMARK - ADXL345_OVERRUNY - */ - - -byte ADXL345::getInterruptSource() { - byte _b; - readFrom(ADXL345_INT_SOURCE, 1, &_b); - return _b; -} - -bool ADXL345::getInterruptSource(byte interruptBit) { - return getRegisterBit(ADXL345_INT_SOURCE,interruptBit); -} - -bool ADXL345::getInterruptMapping(byte interruptBit) { - return getRegisterBit(ADXL345_INT_MAP,interruptBit); -} - -/*********************** INTERRUPT MAPPING **************************/ -/* Set the Mapping of an Interrupt to pin1 or pin2 */ -// eg: setInterruptMapping(ADXL345_INT_DOUBLE_TAP_BIT,ADXL345_INT2_PIN); -void ADXL345::setInterruptMapping(byte interruptBit, bool interruptPin) { - setRegisterBit(ADXL345_INT_MAP, interruptBit, interruptPin); -} - -void ADXL345::setImportantInterruptMapping(int single_tap, int double_tap, int free_fall, int activity, int inactivity) { - if(single_tap == 1) { - setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT, ADXL345_INT1_PIN );} - else if(single_tap == 2) { - setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT, ADXL345_INT2_PIN );} - - if(double_tap == 1) { - setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT, ADXL345_INT1_PIN );} - else if(double_tap == 2) { - setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT, ADXL345_INT2_PIN );} - - if(free_fall == 1) { - setInterruptMapping( ADXL345_INT_FREE_FALL_BIT, ADXL345_INT1_PIN );} - else if(free_fall == 2) { - setInterruptMapping( ADXL345_INT_FREE_FALL_BIT, ADXL345_INT2_PIN );} - - if(activity == 1) { - setInterruptMapping( ADXL345_INT_ACTIVITY_BIT, ADXL345_INT1_PIN );} - else if(activity == 2) { - setInterruptMapping( ADXL345_INT_ACTIVITY_BIT, ADXL345_INT2_PIN );} - - if(inactivity == 1) { - setInterruptMapping( ADXL345_INT_INACTIVITY_BIT, ADXL345_INT1_PIN );} - else if(inactivity == 2) { - setInterruptMapping( ADXL345_INT_INACTIVITY_BIT, ADXL345_INT2_PIN );} -} - -bool ADXL345::isInterruptEnabled(byte interruptBit) { - return getRegisterBit(ADXL345_INT_ENABLE,interruptBit); -} - -void ADXL345::setInterrupt(byte interruptBit, bool state) { - setRegisterBit(ADXL345_INT_ENABLE, interruptBit, state); -} - -void ADXL345::singleTapINT(bool status) { - if(status) { - setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1); - } - else { - setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 0); - } -} -void ADXL345::doubleTapINT(bool status) { - if(status) { - setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1); - } - else { - setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 0); - } -} -void ADXL345::FreeFallINT(bool status) { - if(status) { - setInterrupt( ADXL345_INT_FREE_FALL_BIT, 1); - } - else { - setInterrupt( ADXL345_INT_FREE_FALL_BIT, 0); - } -} -void ADXL345::ActivityINT(bool status) { - if(status) { - setInterrupt( ADXL345_INT_ACTIVITY_BIT, 1); - } - else { - setInterrupt( ADXL345_INT_ACTIVITY_BIT, 0); - } -} -void ADXL345::InactivityINT(bool status) { - if(status) { - setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1); - } - else { - setInterrupt( ADXL345_INT_INACTIVITY_BIT, 0); - } -} - -void ADXL345::setRegisterBit(byte regAdress, int bitPos, bool state) { - byte _b; - readFrom(regAdress, 1, &_b); - if (state) { - _b |= (1 << bitPos); // Forces nth Bit of _b to 1. Other Bits Unchanged. - } - else { - _b &= ~(1 << bitPos); // Forces nth Bit of _b to 0. Other Bits Unchanged. - } - writeTo(regAdress, _b); -} - -bool ADXL345::getRegisterBit(byte regAdress, int bitPos) { - byte _b; - readFrom(regAdress, 1, &_b); - return ((_b >> bitPos) & 1); -} - -/********************************************************************/ -/* */ -// Print Register Values to Serial Output = -// Can be used to Manually Check the Current Configuration of Device -void ADXL345::printAllRegister() { - byte _b; - Serial.print("0x00: "); - readFrom(0x00, 1, &_b); - print_byte(_b); - Serial.println(""); - int i; - for (i=29;i<=57;i++){ - Serial.print("0x"); - Serial.print(i, HEX); - Serial.print(": "); - readFrom(i, 1, &_b); - print_byte(_b); - Serial.println(""); - } -} - -void print_byte(byte val){ - int i; - Serial.print("B"); - for(i=7; i>=0; i--){ - Serial.print(val >> i & 1, BIN); - } -} +Arduino Uno +*/ + +#include "Arduino.h" +#include "SparkFun_ADXL345.h" +#include +#include + +#define ADXL345_DEVICE (0x53) // Device Address for ADXL345 +#define ADXL345_TO_READ (6) // Number of Bytes Read - Two Bytes Per Axis + +ADXL345::ADXL345() { + status = ADXL345_OK; + error_code = ADXL345_NO_ERROR; + + gains[0] = 0.00376390; // Original gain 0.00376390 + gains[1] = 0.00376009; // Original gain 0.00376009 + gains[2] = 0.00349265; // Original gain 0.00349265 + I2C = true; +} + +ADXL345::ADXL345(int CS) { + status = ADXL345_OK; + error_code = ADXL345_NO_ERROR; + + gains[0] = 0.00376390; + gains[1] = 0.00376009; + gains[2] = 0.00349265; + _CS = CS; + I2C = false; + SPI.begin(); + SPI.setDataMode(SPI_MODE3); + pinMode(_CS, OUTPUT); + digitalWrite(_CS, HIGH); +} + +void ADXL345::powerOn() { + if(I2C) { + Wire.begin(); // If in I2C Mode Only + } + //ADXL345 TURN ON + writeTo(ADXL345_POWER_CTL, 0); // Wakeup + writeTo(ADXL345_POWER_CTL, 16); // Auto_Sleep + writeTo(ADXL345_POWER_CTL, 8); // Measure +} + + +/*********************** READING ACCELERATION ***********************/ +/* Reads Acceleration into Three Variables: x, y and z */ + +void ADXL345::readAccel(int *xyz){ + readAccel(xyz, xyz + 1, xyz + 2); +} + +void ADXL345::readAccel(int *x, int *y, int *z) { + readFrom(ADXL345_DATAX0, ADXL345_TO_READ, _buff); // Read Accel Data from ADXL345 + + // Each Axis @ All g Ranges: 10 Bit Resolution (2 Bytes) + *x = (int16_t)((((int)_buff[1]) << 8) | _buff[0]); + *y = (int16_t)((((int)_buff[3]) << 8) | _buff[2]); + *z = (int16_t)((((int)_buff[5]) << 8) | _buff[4]); +} + +void ADXL345::get_Gxyz(double *xyz){ + int i; + int xyz_int[3]; + readAccel(xyz_int); + for(i=0; i<3; i++){ + xyz[i] = xyz_int[i] * gains[i]; + } +} + +/***************** WRITES VALUE TO ADDRESS REGISTER *****************/ +void ADXL345::writeTo(byte address, byte val) { + if(I2C) { + writeToI2C(address, val); + } + else { + writeToSPI(address, val); + } +} + +/************************ READING NUM BYTES *************************/ +/* Reads Num Bytes. Starts from Address Reg to _buff Array */ +void ADXL345::readFrom(byte address, int num, byte _buff[]) { + if(I2C) { + readFromI2C(address, num, _buff); // If I2C Communication + } + else { + readFromSPI(address, num, _buff); // If SPI Communication + } +} + +/*************************** WRITE TO I2C ***************************/ +/* Start; Send Register Address; Send Value To Write; End */ +void ADXL345::writeToI2C(byte _address, byte _val) { + Wire.beginTransmission(ADXL345_DEVICE); + Wire.write(_address); + Wire.write(_val); + Wire.endTransmission(); +} + +/*************************** READ FROM I2C **************************/ +/* Start; Send Address To Read; End */ +void ADXL345::readFromI2C(byte address, int num, byte _buff[]) { + Wire.beginTransmission(ADXL345_DEVICE); + Wire.write(address); + Wire.endTransmission(); + +// Wire.beginTransmission(ADXL345_DEVICE); +// Wire.reqeustFrom contains the beginTransmission and endTransmission in it. + Wire.requestFrom(ADXL345_DEVICE, num); // Request 6 Bytes + + int i = 0; + while(Wire.available()) + { + _buff[i] = Wire.read(); // Receive Byte + i++; + } + if(i != num){ + status = ADXL345_ERROR; + error_code = ADXL345_READ_ERROR; + } +// Wire.endTransmission(); +} + +/************************** WRITE FROM SPI **************************/ +/* Point to Destination; Write Value; Turn Off */ +void ADXL345::writeToSPI(byte __reg_address, byte __val) { + digitalWrite(_CS, LOW); + SPI.transfer(__reg_address); + SPI.transfer(__val); + digitalWrite(_CS, HIGH); +} + +/*************************** READ FROM SPI **************************/ +/* */ +void ADXL345::readFromSPI(byte __reg_address, int num, byte _buff[]) { + // Read: Most Sig Bit of Reg Address Set + char _address = 0x80 | __reg_address; + // If Multi-Byte Read: Bit 6 Set + if(num > 1) { + _address = _address | 0x40; + } + + digitalWrite(_CS, LOW); + SPI.transfer(_address); // Transfer Starting Reg Address To Be Read + for(int i=0; i>= 1) + { + r++; + } + if (r <= 9) { + readFrom(ADXL345_BW_RATE, 1, &_b); + _s = (byte) (r + 6) | (_b & B11110000); + writeTo(ADXL345_BW_RATE, _s); + } +} + +/*************************** BANDWIDTH ******************************/ +/* ~ SET & GET */ +void ADXL345::set_bw(byte bw_code){ + if((bw_code < ADXL345_BW_0_05) || (bw_code > ADXL345_BW_1600)){ + status = false; + error_code = ADXL345_BAD_ARG; + } + else{ + writeTo(ADXL345_BW_RATE, bw_code); + } +} + +byte ADXL345::get_bw_code(){ + byte bw_code; + readFrom(ADXL345_BW_RATE, 1, &bw_code); + return bw_code; +} + + + + +/************************* TRIGGER CHECK ***************************/ +/* */ +// Check if Action was Triggered in Interrupts +// Example triggered(interrupts, ADXL345_SINGLE_TAP); +bool ADXL345::triggered(byte interrupts, int mask){ + return ((interrupts >> mask) & 1); +} + +/* + ADXL345_DATA_READY + ADXL345_SINGLE_TAP + ADXL345_DOUBLE_TAP + ADXL345_ACTIVITY + ADXL345_INACTIVITY + ADXL345_FREE_FALL + ADXL345_WATERMARK + ADXL345_OVERRUNY + */ + + +byte ADXL345::getInterruptSource() { + byte _b; + readFrom(ADXL345_INT_SOURCE, 1, &_b); + return _b; +} + +bool ADXL345::getInterruptSource(byte interruptBit) { + return getRegisterBit(ADXL345_INT_SOURCE,interruptBit); +} + +bool ADXL345::getInterruptMapping(byte interruptBit) { + return getRegisterBit(ADXL345_INT_MAP,interruptBit); +} + +/*********************** INTERRUPT MAPPING **************************/ +/* Set the Mapping of an Interrupt to pin1 or pin2 */ +// eg: setInterruptMapping(ADXL345_INT_DOUBLE_TAP_BIT,ADXL345_INT2_PIN); +void ADXL345::setInterruptMapping(byte interruptBit, bool interruptPin) { + setRegisterBit(ADXL345_INT_MAP, interruptBit, interruptPin); +} + +void ADXL345::setImportantInterruptMapping(int single_tap, int double_tap, int free_fall, int activity, int inactivity) { + if(single_tap == 1) { + setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT, ADXL345_INT1_PIN );} + else if(single_tap == 2) { + setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT, ADXL345_INT2_PIN );} + + if(double_tap == 1) { + setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT, ADXL345_INT1_PIN );} + else if(double_tap == 2) { + setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT, ADXL345_INT2_PIN );} + + if(free_fall == 1) { + setInterruptMapping( ADXL345_INT_FREE_FALL_BIT, ADXL345_INT1_PIN );} + else if(free_fall == 2) { + setInterruptMapping( ADXL345_INT_FREE_FALL_BIT, ADXL345_INT2_PIN );} + + if(activity == 1) { + setInterruptMapping( ADXL345_INT_ACTIVITY_BIT, ADXL345_INT1_PIN );} + else if(activity == 2) { + setInterruptMapping( ADXL345_INT_ACTIVITY_BIT, ADXL345_INT2_PIN );} + + if(inactivity == 1) { + setInterruptMapping( ADXL345_INT_INACTIVITY_BIT, ADXL345_INT1_PIN );} + else if(inactivity == 2) { + setInterruptMapping( ADXL345_INT_INACTIVITY_BIT, ADXL345_INT2_PIN );} +} + +bool ADXL345::isInterruptEnabled(byte interruptBit) { + return getRegisterBit(ADXL345_INT_ENABLE,interruptBit); +} + +void ADXL345::setInterrupt(byte interruptBit, bool state) { + setRegisterBit(ADXL345_INT_ENABLE, interruptBit, state); +} + +void ADXL345::singleTapINT(bool status) { + if(status) { + setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1); + } + else { + setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 0); + } +} +void ADXL345::doubleTapINT(bool status) { + if(status) { + setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1); + } + else { + setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 0); + } +} +void ADXL345::FreeFallINT(bool status) { + if(status) { + setInterrupt( ADXL345_INT_FREE_FALL_BIT, 1); + } + else { + setInterrupt( ADXL345_INT_FREE_FALL_BIT, 0); + } +} +void ADXL345::ActivityINT(bool status) { + if(status) { + setInterrupt( ADXL345_INT_ACTIVITY_BIT, 1); + } + else { + setInterrupt( ADXL345_INT_ACTIVITY_BIT, 0); + } +} +void ADXL345::InactivityINT(bool status) { + if(status) { + setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1); + } + else { + setInterrupt( ADXL345_INT_INACTIVITY_BIT, 0); + } +} +void ADXL345::WatermarkINT(bool status) { + if(status) { + setInterrupt( ADXL345_WATERMARK, 1); + } + else { + setInterrupt( ADXL345_WATERMARK, 0); + } +} +void ADXL345::OverrunINT(bool status) { + if(status) { + setInterrupt( ADXL345_OVERRUNY, 1); + } + else { + setInterrupt( ADXL345_OVERRUNY, 0); + } +} + +void ADXL345::setRegisterBit(byte regAdress, int bitPos, bool state) { + byte _b; + readFrom(regAdress, 1, &_b); + if (state) { + _b |= (1 << bitPos); // Forces nth Bit of _b to 1. Other Bits Unchanged. + } + else { + _b &= ~(1 << bitPos); // Forces nth Bit of _b to 0. Other Bits Unchanged. + } + writeTo(regAdress, _b); +} + +bool ADXL345::getRegisterBit(byte regAdress, int bitPos) { + byte _b; + readFrom(regAdress, 1, &_b); + return ((_b >> bitPos) & 1); +} + +/*********************** FIFO **************************/ +void ADXL345::setFIFO(byte fifo_mode_code) { + byte _b; + readFrom(ADXL345_FIFO_CTL, 1, &_b); //read current bits + _b &= B00111111; + _b |= (fifo_mode_code << 6); + writeTo(ADXL345_FIFO_CTL, _b); +} + +void ADXL345::setFIFO_Bypass(){ + setFIFO(ADXL345_FIFO_BYPASS); +} +void ADXL345::setFIFO_FIFO(){ + setFIFO(ADXL345_FIFO_FIFO); +} +void ADXL345::setFIFO_Stream(){ + setFIFO(ADXL345_FIFO_STREAM); +} +void ADXL345::setFIFO_Trigger(){ + setFIFO(ADXL345_FIFO_TRIGGER); +} + +void ADXL345::setTriggerBit(bool status){ + setRegisterBit(ADXL345_FIFO_CTL, ADXL345_FIFO_TRIGGER_BIT, status); +} +bool ADXL345::getTriggerBit(){ + return getRegisterBit(ADXL345_FIFO_CTL, ADXL345_FIFO_TRIGGER_BIT); +} + +void ADXL345::setFifoSize(int samples){ + byte _b,_s; + if((samples<0 || samples>31)){ + status = false; + error_code = ADXL345_BAD_ARG; + } + _s = (byte) samples; + readFrom(ADXL345_FIFO_CTL, 1, &_b); + _b &= B11100000; + _b |= _s; + writeTo(ADXL345_FIFO_CTL, _b); +} +int ADXL345::getFifoSize(){ + byte _b; + readFrom(ADXL345_FIFO_CTL, 1, &_b); + _b &= B00011111; + return int (_b); +} + +bool ADXL345::getTriggerStatus(){ + return getRegisterBit(ADXL345_FIFO_STATUS, 7); +} + +int ADXL345::getFifoEntries(){ + byte _b; + readFrom(ADXL345_FIFO_STATUS, 1, &_b); + _b &= B00111111; + return int (_b); +} + + +/********************************************************************/ +/* */ +// Print Register Values to Serial Output = +// Can be used to Manually Check the Current Configuration of Device +void ADXL345::printAllRegister() { + byte _b; + Serial.print("0x00: "); + readFrom(0x00, 1, &_b); + print_byte(_b); + Serial.println(""); + int i; + for (i=29;i<=57;i++){ + Serial.print("0x"); + Serial.print(i, HEX); + Serial.print(": "); + readFrom(i, 1, &_b); + print_byte(_b); + Serial.println(""); + } +} + +void print_byte(byte val){ + int i; + Serial.print("B"); + for(i=7; i>=0; i--){ + Serial.print(val >> i & 1, BIN); + } +} diff --git a/src/SparkFun_ADXL345.h b/src/SparkFun_ADXL345.h index 504a23a..8e4864c 100644 --- a/src/SparkFun_ADXL345.h +++ b/src/SparkFun_ADXL345.h @@ -1,5 +1,5 @@ -/* -Sparkfun's ADXL345 Library Main Header File +/* +Sparkfun's ADXL345 Library Main Header File ADXL345.h E.Robert @ SparkFun Electronics @@ -13,224 +13,245 @@ Hardware Resources: Development Environment Specifics: Arduino 1.6.8 SparkFun Triple Axis Accelerometer Breakout - ADXL345 -Arduino Uno -*/ - -#include "Arduino.h" - -#ifndef ADXL345_h -#define ADXL345_h - -/*************************** REGISTER MAP ***************************/ -#define ADXL345_DEVID 0x00 // Device ID -#define ADXL345_RESERVED1 0x01 // Reserved. Do Not Access. -#define ADXL345_THRESH_TAP 0x1D // Tap Threshold. -#define ADXL345_OFSX 0x1E // X-Axis Offset. -#define ADXL345_OFSY 0x1F // Y-Axis Offset. -#define ADXL345_OFSZ 0x20 // Z- Axis Offset. -#define ADXL345_DUR 0x21 // Tap Duration. -#define ADXL345_LATENT 0x22 // Tap Latency. -#define ADXL345_WINDOW 0x23 // Tap Window. -#define ADXL345_THRESH_ACT 0x24 // Activity Threshold -#define ADXL345_THRESH_INACT 0x25 // Inactivity Threshold -#define ADXL345_TIME_INACT 0x26 // Inactivity Time -#define ADXL345_ACT_INACT_CTL 0x27 // Axis Enable Control for Activity and Inactivity Detection -#define ADXL345_THRESH_FF 0x28 // Free-Fall Threshold. -#define ADXL345_TIME_FF 0x29 // Free-Fall Time. -#define ADXL345_TAP_AXES 0x2A // Axis Control for Tap/Double Tap. -#define ADXL345_ACT_TAP_STATUS 0x2B // Source of Tap/Double Tap -#define ADXL345_BW_RATE 0x2C // Data Rate and Power mode Control -#define ADXL345_POWER_CTL 0x2D // Power-Saving Features Control -#define ADXL345_INT_ENABLE 0x2E // Interrupt Enable Control -#define ADXL345_INT_MAP 0x2F // Interrupt Mapping Control -#define ADXL345_INT_SOURCE 0x30 // Source of Interrupts -#define ADXL345_DATA_FORMAT 0x31 // Data Format Control -#define ADXL345_DATAX0 0x32 // X-Axis Data 0 -#define ADXL345_DATAX1 0x33 // X-Axis Data 1 -#define ADXL345_DATAY0 0x34 // Y-Axis Data 0 -#define ADXL345_DATAY1 0x35 // Y-Axis Data 1 -#define ADXL345_DATAZ0 0x36 // Z-Axis Data 0 -#define ADXL345_DATAZ1 0x37 // Z-Axis Data 1 -#define ADXL345_FIFO_CTL 0x38 // FIFO Control -#define ADXL345_FIFO_STATUS 0x39 // FIFO Status - -#define ADXL345_BW_1600 0xF // 1111 IDD = 40uA -#define ADXL345_BW_800 0xE // 1110 IDD = 90uA -#define ADXL345_BW_400 0xD // 1101 IDD = 140uA -#define ADXL345_BW_200 0xC // 1100 IDD = 140uA -#define ADXL345_BW_100 0xB // 1011 IDD = 140uA -#define ADXL345_BW_50 0xA // 1010 IDD = 140uA -#define ADXL345_BW_25 0x9 // 1001 IDD = 90uA -#define ADXL345_BW_12_5 0x8 // 1000 IDD = 60uA -#define ADXL345_BW_6_25 0x7 // 0111 IDD = 50uA -#define ADXL345_BW_3_13 0x6 // 0110 IDD = 45uA -#define ADXL345_BW_1_56 0x5 // 0101 IDD = 40uA -#define ADXL345_BW_0_78 0x4 // 0100 IDD = 34uA -#define ADXL345_BW_0_39 0x3 // 0011 IDD = 23uA -#define ADXL345_BW_0_20 0x2 // 0010 IDD = 23uA -#define ADXL345_BW_0_10 0x1 // 0001 IDD = 23uA -#define ADXL345_BW_0_05 0x0 // 0000 IDD = 23uA - - - /************************** INTERRUPT PINS **************************/ -#define ADXL345_INT1_PIN 0x00 //INT1: 0 -#define ADXL345_INT2_PIN 0x01 //INT2: 1 - - - /********************** INTERRUPT BIT POSITION **********************/ -#define ADXL345_INT_DATA_READY_BIT 0x07 -#define ADXL345_INT_SINGLE_TAP_BIT 0x06 -#define ADXL345_INT_DOUBLE_TAP_BIT 0x05 -#define ADXL345_INT_ACTIVITY_BIT 0x04 -#define ADXL345_INT_INACTIVITY_BIT 0x03 -#define ADXL345_INT_FREE_FALL_BIT 0x02 -#define ADXL345_INT_WATERMARK_BIT 0x01 -#define ADXL345_INT_OVERRUNY_BIT 0x00 - -#define ADXL345_DATA_READY 0x07 -#define ADXL345_SINGLE_TAP 0x06 -#define ADXL345_DOUBLE_TAP 0x05 -#define ADXL345_ACTIVITY 0x04 -#define ADXL345_INACTIVITY 0x03 -#define ADXL345_FREE_FALL 0x02 -#define ADXL345_WATERMARK 0x01 -#define ADXL345_OVERRUNY 0x00 - - - /****************************** ERRORS ******************************/ -#define ADXL345_OK 1 // No Error -#define ADXL345_ERROR 0 // Error Exists - -#define ADXL345_NO_ERROR 0 // Initial State -#define ADXL345_READ_ERROR 1 // Accelerometer Reading Error -#define ADXL345_BAD_ARG 2 // Bad Argument - - -class ADXL345 -{ -public: - bool status; // Set When Error Exists - - byte error_code; // Initial State - double gains[3]; // Counts to Gs - - ADXL345(); - ADXL345(int CS); - void powerOn(); - void readAccel(int* xyx); - void readAccel(int* x, int* y, int* z); - void get_Gxyz(double *xyz); - - void setTapThreshold(int tapThreshold); - int getTapThreshold(); - void setAxisGains(double *_gains); - void getAxisGains(double *_gains); - void setAxisOffset(int x, int y, int z); - void getAxisOffset(int* x, int* y, int*z); - void setTapDuration(int tapDuration); - int getTapDuration(); - void setDoubleTapLatency(int doubleTapLatency); - int getDoubleTapLatency(); - void setDoubleTapWindow(int doubleTapWindow); - int getDoubleTapWindow(); - void setActivityThreshold(int activityThreshold); - int getActivityThreshold(); - void setInactivityThreshold(int inactivityThreshold); - int getInactivityThreshold(); - void setTimeInactivity(int timeInactivity); - int getTimeInactivity(); - void setFreeFallThreshold(int freeFallthreshold); - int getFreeFallThreshold(); - void setFreeFallDuration(int freeFallDuration); - int getFreeFallDuration(); - - bool isActivityXEnabled(); - bool isActivityYEnabled(); - bool isActivityZEnabled(); - bool isInactivityXEnabled(); - bool isInactivityYEnabled(); - bool isInactivityZEnabled(); - bool isActivityAc(); - bool isInactivityAc(); - void setActivityAc(bool state); - void setInactivityAc(bool state); - - bool getSuppressBit(); - void setSuppressBit(bool state); - bool isTapDetectionOnX(); - void setTapDetectionOnX(bool state); - bool isTapDetectionOnY(); - void setTapDetectionOnY(bool state); - bool isTapDetectionOnZ(); - void setTapDetectionOnZ(bool state); - void setTapDetectionOnXYZ(bool stateX, bool stateY, bool stateZ); - - void setActivityX(bool state); - void setActivityY(bool state); - void setActivityZ(bool state); - void setActivityXYZ(bool stateX, bool stateY, bool stateZ); - void setInactivityX(bool state); - void setInactivityY(bool state); - void setInactivityZ(bool state); - void setInactivityXYZ(bool stateX, bool stateY, bool stateZ); - - bool isActivitySourceOnX(); - bool isActivitySourceOnY(); - bool isActivitySourceOnZ(); - bool isTapSourceOnX(); - bool isTapSourceOnY(); - bool isTapSourceOnZ(); - bool isAsleep(); - - bool isLowPower(); - void setLowPower(bool state); - double getRate(); - void setRate(double rate); - void set_bw(byte bw_code); - byte get_bw_code(); - - bool triggered(byte interrupts, int mask); - - byte getInterruptSource(); - bool getInterruptSource(byte interruptBit); - bool getInterruptMapping(byte interruptBit); - void setInterruptMapping(byte interruptBit, bool interruptPin); - bool isInterruptEnabled(byte interruptBit); - void setInterrupt(byte interruptBit, bool state); - void setImportantInterruptMapping(int single_tap, int double_tap, int free_fall, int activity, int inactivity); - void InactivityINT(bool status); - void ActivityINT(bool status); - void FreeFallINT(bool status); - void doubleTapINT(bool status); - void singleTapINT(bool status); - - void getRangeSetting(byte* rangeSetting); - void setRangeSetting(int val); - bool getSelfTestBit(); - void setSelfTestBit(bool selfTestBit); - bool getSpiBit(); - void setSpiBit(bool spiBit); - bool getInterruptLevelBit(); - void setInterruptLevelBit(bool interruptLevelBit); - bool getFullResBit(); - void setFullResBit(bool fullResBit); - bool getJustifyBit(); - void setJustifyBit(bool justifyBit); - void printAllRegister(); - -private: - void writeTo(byte address, byte val); - void writeToI2C(byte address, byte val); - void writeToSPI(byte address, byte val); - void readFrom(byte address, int num, byte buff[]); - void readFromI2C(byte address, int num, byte buff[]); - void readFromSPI(byte address, int num, byte buff[]); - void setRegisterBit(byte regAdress, int bitPos, bool state); - bool getRegisterBit(byte regAdress, int bitPos); - byte _buff[6] ; // 6 Bytes Buffer - int _CS = 10; - bool I2C = true; - unsigned long SPIfreq = 5000000; -}; -void print_byte(byte val); -#endif \ No newline at end of file +Arduino Uno +*/ + +#include "Arduino.h" + +#ifndef ADXL345_h +#define ADXL345_h + +/*************************** REGISTER MAP ***************************/ +#define ADXL345_DEVID 0x00 // Device ID +#define ADXL345_RESERVED1 0x01 // Reserved. Do Not Access. +#define ADXL345_THRESH_TAP 0x1D // Tap Threshold. +#define ADXL345_OFSX 0x1E // X-Axis Offset. +#define ADXL345_OFSY 0x1F // Y-Axis Offset. +#define ADXL345_OFSZ 0x20 // Z- Axis Offset. +#define ADXL345_DUR 0x21 // Tap Duration. +#define ADXL345_LATENT 0x22 // Tap Latency. +#define ADXL345_WINDOW 0x23 // Tap Window. +#define ADXL345_THRESH_ACT 0x24 // Activity Threshold +#define ADXL345_THRESH_INACT 0x25 // Inactivity Threshold +#define ADXL345_TIME_INACT 0x26 // Inactivity Time +#define ADXL345_ACT_INACT_CTL 0x27 // Axis Enable Control for Activity and Inactivity Detection +#define ADXL345_THRESH_FF 0x28 // Free-Fall Threshold. +#define ADXL345_TIME_FF 0x29 // Free-Fall Time. +#define ADXL345_TAP_AXES 0x2A // Axis Control for Tap/Double Tap. +#define ADXL345_ACT_TAP_STATUS 0x2B // Source of Tap/Double Tap +#define ADXL345_BW_RATE 0x2C // Data Rate and Power mode Control +#define ADXL345_POWER_CTL 0x2D // Power-Saving Features Control +#define ADXL345_INT_ENABLE 0x2E // Interrupt Enable Control +#define ADXL345_INT_MAP 0x2F // Interrupt Mapping Control +#define ADXL345_INT_SOURCE 0x30 // Source of Interrupts +#define ADXL345_DATA_FORMAT 0x31 // Data Format Control +#define ADXL345_DATAX0 0x32 // X-Axis Data 0 +#define ADXL345_DATAX1 0x33 // X-Axis Data 1 +#define ADXL345_DATAY0 0x34 // Y-Axis Data 0 +#define ADXL345_DATAY1 0x35 // Y-Axis Data 1 +#define ADXL345_DATAZ0 0x36 // Z-Axis Data 0 +#define ADXL345_DATAZ1 0x37 // Z-Axis Data 1 +#define ADXL345_FIFO_CTL 0x38 // FIFO Control +#define ADXL345_FIFO_STATUS 0x39 // FIFO Status + +#define ADXL345_BW_1600 0xF // 1111 IDD = 40uA +#define ADXL345_BW_800 0xE // 1110 IDD = 90uA +#define ADXL345_BW_400 0xD // 1101 IDD = 140uA +#define ADXL345_BW_200 0xC // 1100 IDD = 140uA +#define ADXL345_BW_100 0xB // 1011 IDD = 140uA +#define ADXL345_BW_50 0xA // 1010 IDD = 140uA +#define ADXL345_BW_25 0x9 // 1001 IDD = 90uA +#define ADXL345_BW_12_5 0x8 // 1000 IDD = 60uA +#define ADXL345_BW_6_25 0x7 // 0111 IDD = 50uA +#define ADXL345_BW_3_13 0x6 // 0110 IDD = 45uA +#define ADXL345_BW_1_56 0x5 // 0101 IDD = 40uA +#define ADXL345_BW_0_78 0x4 // 0100 IDD = 34uA +#define ADXL345_BW_0_39 0x3 // 0011 IDD = 23uA +#define ADXL345_BW_0_20 0x2 // 0010 IDD = 23uA +#define ADXL345_BW_0_10 0x1 // 0001 IDD = 23uA +#define ADXL345_BW_0_05 0x0 // 0000 IDD = 23uA + + + /************************** INTERRUPT PINS **************************/ +#define ADXL345_INT1_PIN 0x00 //INT1: 0 +#define ADXL345_INT2_PIN 0x01 //INT2: 1 + + + /********************** INTERRUPT BIT POSITION **********************/ +#define ADXL345_INT_DATA_READY_BIT 0x07 +#define ADXL345_INT_SINGLE_TAP_BIT 0x06 +#define ADXL345_INT_DOUBLE_TAP_BIT 0x05 +#define ADXL345_INT_ACTIVITY_BIT 0x04 +#define ADXL345_INT_INACTIVITY_BIT 0x03 +#define ADXL345_INT_FREE_FALL_BIT 0x02 +#define ADXL345_INT_WATERMARK_BIT 0x01 +#define ADXL345_INT_OVERRUNY_BIT 0x00 + +#define ADXL345_DATA_READY 0x07 +#define ADXL345_SINGLE_TAP 0x06 +#define ADXL345_DOUBLE_TAP 0x05 +#define ADXL345_ACTIVITY 0x04 +#define ADXL345_INACTIVITY 0x03 +#define ADXL345_FREE_FALL 0x02 +#define ADXL345_WATERMARK 0x01 +#define ADXL345_OVERRUNY 0x00 + + /********************** FIFO Mode **********************/ +#define ADXL345_FIFO_BYPASS 0x00 +#define ADXL345_FIFO_FIFO 0x01 +#define ADXL345_FIFO_STREAM 0x02 +#define ADXL345_FIFO_TRIGGER 0x03 + +#define ADXL345_FIFO_TRIGGER_BIT 0x05 + + /****************************** ERRORS ******************************/ +#define ADXL345_OK 1 // No Error +#define ADXL345_ERROR 0 // Error Exists + +#define ADXL345_NO_ERROR 0 // Initial State +#define ADXL345_READ_ERROR 1 // Accelerometer Reading Error +#define ADXL345_BAD_ARG 2 // Bad Argument + + +class ADXL345 +{ +public: + bool status; // Set When Error Exists + + byte error_code; // Initial State + double gains[3]; // Counts to Gs + + ADXL345(); + ADXL345(int CS); + void powerOn(); + void readAccel(int* xyx); + void readAccel(int* x, int* y, int* z); + void get_Gxyz(double *xyz); + + void setTapThreshold(int tapThreshold); + int getTapThreshold(); + void setAxisGains(double *_gains); + void getAxisGains(double *_gains); + void setAxisOffset(int x, int y, int z); + void getAxisOffset(int* x, int* y, int*z); + void setTapDuration(int tapDuration); + int getTapDuration(); + void setDoubleTapLatency(int doubleTapLatency); + int getDoubleTapLatency(); + void setDoubleTapWindow(int doubleTapWindow); + int getDoubleTapWindow(); + void setActivityThreshold(int activityThreshold); + int getActivityThreshold(); + void setInactivityThreshold(int inactivityThreshold); + int getInactivityThreshold(); + void setTimeInactivity(int timeInactivity); + int getTimeInactivity(); + void setFreeFallThreshold(int freeFallthreshold); + int getFreeFallThreshold(); + void setFreeFallDuration(int freeFallDuration); + int getFreeFallDuration(); + + bool isActivityXEnabled(); + bool isActivityYEnabled(); + bool isActivityZEnabled(); + bool isInactivityXEnabled(); + bool isInactivityYEnabled(); + bool isInactivityZEnabled(); + bool isActivityAc(); + bool isInactivityAc(); + void setActivityAc(bool state); + void setInactivityAc(bool state); + + bool getSuppressBit(); + void setSuppressBit(bool state); + bool isTapDetectionOnX(); + void setTapDetectionOnX(bool state); + bool isTapDetectionOnY(); + void setTapDetectionOnY(bool state); + bool isTapDetectionOnZ(); + void setTapDetectionOnZ(bool state); + void setTapDetectionOnXYZ(bool stateX, bool stateY, bool stateZ); + + void setActivityX(bool state); + void setActivityY(bool state); + void setActivityZ(bool state); + void setActivityXYZ(bool stateX, bool stateY, bool stateZ); + void setInactivityX(bool state); + void setInactivityY(bool state); + void setInactivityZ(bool state); + void setInactivityXYZ(bool stateX, bool stateY, bool stateZ); + + bool isActivitySourceOnX(); + bool isActivitySourceOnY(); + bool isActivitySourceOnZ(); + bool isTapSourceOnX(); + bool isTapSourceOnY(); + bool isTapSourceOnZ(); + bool isAsleep(); + + bool isLowPower(); + void setLowPower(bool state); + double getRate(); + void setRate(double rate); + void set_bw(byte bw_code); + byte get_bw_code(); + + bool triggered(byte interrupts, int mask); + + byte getInterruptSource(); + bool getInterruptSource(byte interruptBit); + bool getInterruptMapping(byte interruptBit); + void setInterruptMapping(byte interruptBit, bool interruptPin); + bool isInterruptEnabled(byte interruptBit); + void setInterrupt(byte interruptBit, bool state); + void setImportantInterruptMapping(int single_tap, int double_tap, int free_fall, int activity, int inactivity); + void InactivityINT(bool status); + void ActivityINT(bool status); + void FreeFallINT(bool status); + void doubleTapINT(bool status); + void singleTapINT(bool status); + void WatermarkINT(bool status); + void OverrunINT(bool status); + + void setFIFO_Bypass(); + void setFIFO_FIFO(); + void setFIFO_Stream(); + void setFIFO_Trigger(); + void setTriggerBit(bool status); + bool getTriggerBit(); + void setFifoSize(int samples); + int getFifoSize(); + bool getTriggerStatus(); + int getFifoEntries(); + + void getRangeSetting(byte* rangeSetting); + void setRangeSetting(int val); + bool getSelfTestBit(); + void setSelfTestBit(bool selfTestBit); + bool getSpiBit(); + void setSpiBit(bool spiBit); + bool getInterruptLevelBit(); + void setInterruptLevelBit(bool interruptLevelBit); + bool getFullResBit(); + void setFullResBit(bool fullResBit); + bool getJustifyBit(); + void setJustifyBit(bool justifyBit); + void printAllRegister(); + +private: + void writeTo(byte address, byte val); + void writeToI2C(byte address, byte val); + void writeToSPI(byte address, byte val); + void readFrom(byte address, int num, byte buff[]); + void readFromI2C(byte address, int num, byte buff[]); + void readFromSPI(byte address, int num, byte buff[]); + void setRegisterBit(byte regAdress, int bitPos, bool state); + bool getRegisterBit(byte regAdress, int bitPos); + void setFIFO(byte fifo_mode_code); + byte _buff[6] ; // 6 Bytes Buffer + int _CS = 10; + bool I2C = true; + unsigned long SPIfreq = 5000000; +}; +void print_byte(byte val); +#endif