183 lines
6.2 KiB
Markdown
Raw Normal View History

2021-01-29 12:31:58 +01:00
[![Arduino CI](https://github.com/RobTillaart/GY521/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
2021-10-20 18:48:35 +02:00
[![Arduino-lint](https://github.com/RobTillaart/GY521/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/GY521/actions/workflows/arduino-lint.yml)
[![JSON check](https://github.com/RobTillaart/GY521/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/GY521/actions/workflows/jsoncheck.yml)
2021-01-29 12:31:58 +01:00
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/GY521/blob/master/LICENSE)
[![GitHub release](https://img.shields.io/github/release/RobTillaart/GY521.svg?maxAge=3600)](https://github.com/RobTillaart/GY521/releases)
2021-12-18 18:14:36 +01:00
2021-01-29 12:31:58 +01:00
# GY521
2021-12-18 18:14:36 +01:00
Arduino library for I2C GY521 accelerometer-gyroscope sensor a.k.a. MCU-6050.
2021-01-29 12:31:58 +01:00
## Description
2021-12-18 18:14:36 +01:00
Experimental library for GY521 a.k.a. MCU-6050.
2021-01-29 12:31:58 +01:00
2021-07-05 19:35:46 +02:00
Library is work in progress, in fact it is extracted and extended from an old project.
2021-01-29 12:31:58 +01:00
It needs to be tested a lot more.
2023-06-12 17:34:31 +02:00
See changelog.md for latest updates.
2021-07-05 19:35:46 +02:00
#### Examples
2023-01-27 13:07:04 +01:00
- **GY521_angle** read angleX, angleY, angleZ.
- **GY521_performance** measure performance.
- **GY521_pitch_roll_yaw** to get pitch roll yaw.
- **GY521_readCalibration_1** read calibration values / errors for a flat sensor.
- **GY521_readCalibration_2** generate calibration code snippet.
- **GY521_test_1** test working of the sensor.
- **GY521_test_2** test set/get functions.
2021-01-29 12:31:58 +01:00
2021-02-06 15:52:51 +01:00
## Breakout board
2021-07-05 19:35:46 +02:00
From left to right
2021-02-06 15:52:51 +01:00
2023-01-27 13:07:04 +01:00
| pin | pinName | description | notes |
|:-----:|:---------:|:------------------|:-------:|
| 0 | VCC | +5V |
| 1 | GND | ground |
| 2 | SCL | I2C clock |
| 3 | SDA | I2C data |
| 4 | XDA | auxiliary data | see datasheet
| 5 | XCL | auxiliary clock | see datasheet
| 6 | AD0 | address |
| 7 | INT | interrupt |
2021-02-06 15:52:51 +01:00
2021-07-05 19:35:46 +02:00
2021-02-06 15:52:51 +01:00
#### Address
2021-07-05 19:35:46 +02:00
2021-02-06 15:52:51 +01:00
AD0 connected to GND => 0x68
AD0 connected to VCC => 0x69
2021-01-29 12:31:58 +01:00
## Calibration (short version for now)
1. load and run calibration example
it shows a header containing 6 numbers and 10 lines of 8 numbers
1. wait until the middle 6 of the longer lines stabilize (should all be 0)
1. copy the 6 numbers above the axe aye aze as these are the numbers needed.
## Interface
2023-01-27 13:07:04 +01:00
```cpp
#include "GY521.h"
```
2021-01-29 12:31:58 +01:00
### Constructor
2021-07-05 19:35:46 +02:00
- **GY521(uint8_t address = 0x69, , TwoWire \*wire = &Wire)** Constructor with default address.
0x68 is also a valid address. The wire argument is optional to select Wire1 Wire2 etc. on some boards.
- **bool begin(uint8_t sda, uint8_t scl)** begin for ESP32 et al. Returns true if address can be found on I2C bus.
- **bool begin()** Returns true if address can be found on I2C bus.
- **bool isConnected()** returns true if device can be found on I2C bus.
2021-06-13 16:00:27 +02:00
- **void reset()** set all internal values to 0 and throttle time to 10 ms.
2021-12-18 18:14:36 +01:00
- **bool wakeUp()** idem.
2021-01-29 12:31:58 +01:00
### Throttle
2021-07-05 19:35:46 +02:00
- **void setThrottle(bool throttle = true)** throttle to force "delay" between reads.
- **bool getThrottle()** returns true if throttle mode is set.
- **void setThrottleTime(uint16_t ti )** throttle time in milliseconds, max = 65535 = 1++ minute
- **uint16_t getThrottleTime()** returns throttle time set.
2021-01-29 12:31:58 +01:00
2023-01-27 13:07:04 +01:00
### Read
2021-07-05 19:35:46 +02:00
#### Set before read
2021-01-29 12:31:58 +01:00
- **bool setAccelSensitivity(uint8_t as)** as = 0, 1, 2, 3 ==> 2g 4g 8g 16g
- **uint8_t getAccelSensitivity()** returns 0, 1, 2, 3
- **bool setGyroSensitivity(uint8_t gs)** gs = 0,1,2,3 ==> 250, 500, 1000, 2000 degrees/second
2022-07-27 12:42:05 +02:00
- **uint8_t getGyroSensitivity()** returns 0, 1, 2, 3
2023-06-12 17:34:31 +02:00
= **void setNormalize(bool normalize = true)** normalizes pitch roll yaw or not. Default true.
= **bool getNormalize()** returns flag.
2021-01-29 12:31:58 +01:00
#### Actual read
2022-07-27 12:42:05 +02:00
- **int16_t read()** returns status = GY521_OK on success.
- **int16_t readAccel()** read accelerometer only to speed up interaction. This call does update the throttle timer.
returns status = GY521_OK on success.
- **int16_t readGyro()** read gyroscope only to speed up interaction. This call does update the throttle timer.
returns status = GY521_OK on success.
Note: for pitch roll yaw you need to call **read()**.
- **int16_t readTemperature()** read temperature only, does **not** update the throttle timer.
returns status = GY521_OK on success.
- **uint32_t lastTime()** last time sensor is actually read. In milliseconds. Not updated by readTemperature().
2021-01-29 12:31:58 +01:00
2022-10-08 15:41:16 +02:00
Since version 0.3.8 the **read()** and **readGyro()** function is updated to keep the range of **getPitch()**,
2023-06-12 17:34:31 +02:00
**getRoll()** and **getYaw()** in the range 0..359.999 degrees. (Issue #36).
Problem is that with continuous rotation in a same direction internal variables will overflow and new
2022-10-08 15:41:16 +02:00
movements (angles) will get lost as insignificant digits.
2023-06-12 17:34:31 +02:00
In version 0.4.0 the normalization of pitch, roll and yaw is fixed and made conditional. (Issue #42).
2021-01-29 12:31:58 +01:00
2023-06-12 17:34:31 +02:00
#### Calls after read
2021-01-29 12:31:58 +01:00
2021-07-05 19:35:46 +02:00
Note that multiple calls will return the same value. One must explicitly call **read()** to get new values.
2023-06-12 17:34:31 +02:00
- **float getAccelX()** idem.
- **float getAccelY()** idem.
- **float getAccelZ()** idem.
- **float getAngleX()** idem.
- **float getAngleY()** idem.
- **float getAngleZ()** idem.
- **float getTemperature()** idem.
- **float getGyroX()** idem.
- **float getGyroY()** idem.
- **float getGyroZ()** idem.
- **float getPitch()** idem. May return any number.
If **setNormalize(true)** return value will be 0-359.999
- **float getRoll()** idem. May return any number.
If **setNormalize(true)** return value will be 0-359.999
- **float getYaw()** idem. May return any number.
If **setNormalize(true)** return value will be 0-359.999
2021-01-29 12:31:58 +01:00
### Register access
2021-07-05 19:35:46 +02:00
Read the register PDF for the specific value and meaning of registers.
2021-01-29 12:31:58 +01:00
- **uint8_t setRegister(uint8_t reg, uint8_t value)**
- **uint8_t getRegister(uint8_t reg)**
2021-12-18 18:14:36 +01:00
## documents
- check details - MPU-6000-Register-Map1.pdf
## Operation
See examples, use with care
2021-01-29 12:31:58 +01:00
## Future
2023-01-27 13:07:04 +01:00
#### Must
2021-01-29 12:31:58 +01:00
- improve documentation
2023-06-12 17:34:31 +02:00
- test test and test ...(ESP too)
2021-07-05 19:35:46 +02:00
2023-01-27 13:07:04 +01:00
2023-06-12 17:34:31 +02:00
#### Should
2023-01-27 13:07:04 +01:00
#### Could
2021-01-29 12:31:58 +01:00
- calibrate sketch could print code snippet to include...
2022-07-27 12:42:05 +02:00
2023-01-27 13:07:04 +01:00
#### Wont
- look for maths optimizations (atan, hypot, performance)
- ==> hypot optimized.
- other ideas affect accuracy, so unless new ideas arise.
- calibrate function in the lib
- not as lib will grow too large.