mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
164 lines
4.9 KiB
C++
164 lines
4.9 KiB
C++
#pragma once
|
|
//
|
|
// FILE: GY521.h
|
|
// AUTHOR: Rob Tillaart
|
|
// VERSION: 0.6.1
|
|
// PURPOSE: Arduino library for I2C GY521 accelerometer-gyroscope sensor
|
|
// URL: https://github.com/RobTillaart/GY521
|
|
|
|
|
|
#include "Arduino.h"
|
|
#include "Wire.h"
|
|
|
|
|
|
#define GY521_LIB_VERSION (F("0.6.1"))
|
|
|
|
const float GRAVITY = 9.80655;
|
|
|
|
|
|
// THROTTLE TIMING
|
|
#ifndef GY521_THROTTLE_TIME
|
|
#define GY521_THROTTLE_TIME 10 // milliseconds
|
|
#endif
|
|
|
|
|
|
// ERROR CODES
|
|
#define GY521_OK 0
|
|
#define GY521_THROTTLED 1
|
|
#define GY521_ERROR_READ -1
|
|
#define GY521_ERROR_WRITE -2
|
|
#define GY521_ERROR_NOT_CONNECTED -3
|
|
#define GY521_ERROR_PARAMETER -4
|
|
|
|
|
|
// CONVERSION CONSTANTS
|
|
#define GY521_RAD2DEGREES (180.0 / PI)
|
|
#define GY521_DEGREES2RAD (PI / 180.0)
|
|
#define GY521_RAW2DPS (1.0 / 131.0)
|
|
#define GY521_RAW2G (1.0 / 16384.0)
|
|
|
|
|
|
class GY521
|
|
{
|
|
public:
|
|
// address == 0x68 or 0x69
|
|
GY521(uint8_t address = 0x69, TwoWire *wire = &Wire);
|
|
|
|
bool begin();
|
|
bool isConnected();
|
|
uint8_t getAddress();
|
|
void reset();
|
|
|
|
// EXPERIMENTAL
|
|
// calibrate needs to be called to compensate for errors.
|
|
// must be called after setAccelSensitivity(as); and setGyroSensitivity(gs);
|
|
bool calibrate(uint16_t times, float angleX = 0, float angleY = 0, bool inverted = false);
|
|
|
|
bool wakeup();
|
|
// throttle to force delay between reads.
|
|
void setThrottle(bool throttle = true) { _throttle = throttle; };
|
|
bool getThrottle() { return _throttle; };
|
|
// 0..65535 max milliseconds == roughly 1 minute.
|
|
void setThrottleTime(uint16_t ti ) { _throttleTime = ti; };
|
|
uint16_t getThrottleTime() { return _throttleTime; };
|
|
|
|
|
|
// SET BEFORE READ
|
|
// as = 0,1,2,3 ==> 2g 4g 8g 16g
|
|
bool setAccelSensitivity(uint8_t as);
|
|
uint8_t getAccelSensitivity(); // returns 0,1,2,3
|
|
// gs = 0,1,2,3 ==> 250, 500, 1000, 2000 degrees/second
|
|
bool setGyroSensitivity(uint8_t gs);
|
|
uint8_t getGyroSensitivity(); // returns 0,1,2,3
|
|
// normalizes Pitch Roll and Yaw.
|
|
void setNormalize(bool normalize = true) { _normalize = normalize; };
|
|
bool getNormalize() { return _normalize; };
|
|
|
|
|
|
// READ THE SENSOR
|
|
// returns GY521_OK or one of the error codes above.
|
|
int16_t read();
|
|
// optimized partial reading
|
|
// read accelerometer only
|
|
int16_t readAccel();
|
|
// read gyroscope only can be done too
|
|
// however for pitch roll yaw you need all.
|
|
int16_t readGyro();
|
|
// read temperature only, does not affect throttle.
|
|
int16_t readTemperature();
|
|
|
|
|
|
// CALL AFTER READ
|
|
float getAccelX() { return _ax; };
|
|
float getAccelY() { return _ay; };
|
|
float getAccelZ() { return _az; };
|
|
float getAngleX() { return _aax; };
|
|
float getAngleY() { return _aay; };
|
|
float getAngleZ() { return _aaz; };
|
|
float getTemperature() { return _temperature; };
|
|
float getGyroX() { return _gx; };
|
|
float getGyroY() { return _gy; };
|
|
float getGyroZ() { return _gz; };
|
|
|
|
// EXPERIMENTAL
|
|
// pitch, roll and yaw is work in progress.
|
|
float getPitch() { return _pitch; };
|
|
float getRoll() { return _roll; };
|
|
float getYaw() { return _yaw; };
|
|
|
|
|
|
// last time sensor is actually read.
|
|
uint32_t lastTime() { return _lastTime; };
|
|
|
|
// CONFIGURATION
|
|
// Digital Low Pass Filter - datasheet P13-reg26
|
|
bool setDLPFMode(uint8_t mode); // returns false if mode > 6
|
|
uint8_t getDLPFMode();
|
|
|
|
// generic worker to get access to all functionality
|
|
uint8_t setRegister(uint8_t reg, uint8_t value);
|
|
uint8_t getRegister(uint8_t reg);
|
|
|
|
|
|
// get last error and reset error to OK.
|
|
int16_t getError() { return _error; _error = GY521_OK; };
|
|
|
|
|
|
// calibration errors
|
|
float axe = 0, aye = 0, aze = 0; // accelerometer errors
|
|
float gxe = 0, gye = 0, gze = 0; // gyro errors
|
|
|
|
|
|
private:
|
|
uint8_t _address; // I2C address
|
|
bool _throttle = true; // to prevent reading too fast
|
|
uint16_t _throttleTime = GY521_THROTTLE_TIME;
|
|
uint32_t _lastTime = 0; // to measure duration for math & throttle
|
|
uint32_t _lastMicros = 0; // to measure duration for math & throttle
|
|
int16_t _error = GY521_OK; // initially everything is OK
|
|
|
|
uint8_t _afs = 0; // sensitivity factor
|
|
float _raw2g = GY521_RAW2G; // raw data to gravity g's
|
|
float _ax, _ay, _az; // accelerometer raw
|
|
float _aax, _aay, _aaz; // accelerometer processed
|
|
|
|
uint8_t _gfs = 0;
|
|
float _raw2dps = GY521_RAW2DPS;
|
|
float _gx, _gy, _gz; // gyro raw
|
|
float _gax, _gay, _gaz; // gyro processed
|
|
float _pitch, _roll, _yaw; // used by user
|
|
|
|
float _temperature = 0;
|
|
|
|
bool _normalize = true; // default true.
|
|
|
|
int16_t _readRaw();
|
|
// to read register of 2 bytes.
|
|
int16_t _WireRead2();
|
|
|
|
TwoWire* _wire;
|
|
};
|
|
|
|
|
|
// -- END OF FILE --
|