#include #include #include #include // class Accelerometer -- member function definitions // enable accelerometer only // to enable both accelerometer and magnetometer, call enableDefault() instead void Accelerometer::enable(void) { // Enable Accelerometer // 0x27 = 0b00100111 // Normal power mode, all axes enabled writeAccReg(LSM303::CTRL_REG1_A, 0x27); if (getDeviceType() == LSM303::device_DLHC) writeAccReg(LSM303::CTRL_REG4_A, 0x08); // DLHC: enable high resolution mode } void Accelerometer::getLogHeader(void) { Serial.print("millis x y len dir | len_avg dir_avg | avg_len"); Serial.println(); } void Accelerometer::readAcceleration(unsigned long timestamp) { readAcc(); if (a.x == last.x && a.y == last.y) return; last.timestamp = timestamp; last.x = a.x; last.y = a.y; ra_x.addValue(last.x); ra_y.addValue(last.y); #ifdef LOG_SERIAL Serial.print(last.timestamp); Serial.print(" "); Serial.print(last.x); Serial.print(" "); Serial.print(last.y); Serial.print(" "); Serial.print(len_xy()); Serial.print(" "); Serial.print(dir_xy()); Serial.print(" | "); Serial.print(sqrt(static_cast(ss_xy_avg()))); Serial.print(" "); Serial.print(dir_xy_avg()); Serial.println(); #endif } float Accelerometer::len_xy() const { return sqrt(last.x*a.x + last.y*a.y); } float Accelerometer::dir_xy() const { return atan2(last.x, last.y) * 180.0 / M_PI; } int Accelerometer::x_avg(void) const { return ra_x.getAverage(); } int Accelerometer::y_avg(void) const { return ra_y.getAverage(); } long Accelerometer::ss_xy_avg(void) const { long x_avg_long = static_cast(x_avg()); long y_avg_long = static_cast(y_avg()); return x_avg_long*x_avg_long + y_avg_long*y_avg_long; } float Accelerometer::dir_xy_avg(void) const { return atan2(static_cast(x_avg()), static_cast(y_avg())) * 180.0 / M_PI; }