NM500 / NeuroShield

Dependents:   NeuroShield_SimpleScript NeuroShield_andIMU NeuroShield_Gesture_Recognition

Committer:
nepes_ai
Date:
Tue Feb 11 00:48:18 2020 +0000
Revision:
3:6163399b611e
Parent:
0:529602524696
Release version 1.1.5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nepes_ai 0:529602524696 1 #include "mbed.h"
nepes_ai 0:529602524696 2 #include "mpu6050.h"
nepes_ai 0:529602524696 3
nepes_ai 0:529602524696 4 MPU6050::MPU6050() : connection(PB_9, PB_8) { // SDA(D14), SCL(D15) // pinnames.h
nepes_ai 0:529602524696 5 dev_addr = MPU6050_DEFAULT_ADDRESS;
nepes_ai 0:529602524696 6 }
nepes_ai 0:529602524696 7
nepes_ai 0:529602524696 8 MPU6050::MPU6050(uint8_t address) : connection(PB_9, PB_8) {
nepes_ai 0:529602524696 9 dev_addr = address;
nepes_ai 0:529602524696 10 }
nepes_ai 0:529602524696 11
nepes_ai 0:529602524696 12 MPU6050::MPU6050(uint8_t address, PinName sda, PinName scl) : connection(sda, scl) {
nepes_ai 0:529602524696 13 dev_addr = address;
nepes_ai 0:529602524696 14 }
nepes_ai 0:529602524696 15
nepes_ai 0:529602524696 16 void MPU6050::initialize() {
nepes_ai 0:529602524696 17 setClockSource(MPU6050_CLOCK_PLL_XGYRO);
nepes_ai 0:529602524696 18 setFullScaleGyroRange(MPU6050_GYRO_FS_250);
nepes_ai 0:529602524696 19 setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
nepes_ai 0:529602524696 20 setSleepEnable(false);
nepes_ai 0:529602524696 21 }
nepes_ai 0:529602524696 22
nepes_ai 0:529602524696 23 bool MPU6050::testConnection() {
nepes_ai 0:529602524696 24 return (getDeviceID() == 0x68);
nepes_ai 0:529602524696 25 }
nepes_ai 0:529602524696 26
nepes_ai 0:529602524696 27 void MPU6050::write(char address, char data) {
nepes_ai 0:529602524696 28 char temp[2];
nepes_ai 0:529602524696 29 temp[0] = address;
nepes_ai 0:529602524696 30 temp[1] = data;
nepes_ai 0:529602524696 31 connection.write((dev_addr << 1), temp, 2);
nepes_ai 0:529602524696 32 }
nepes_ai 0:529602524696 33
nepes_ai 0:529602524696 34 void MPU6050::writeWord(char address, int16_t data) {
nepes_ai 0:529602524696 35 char temp[3];
nepes_ai 0:529602524696 36 temp[0] = address;
nepes_ai 0:529602524696 37 temp[1] = (char)((data >> 8) & 0x00ff);
nepes_ai 0:529602524696 38 temp[2] = (char)(data & 0x00ff);
nepes_ai 0:529602524696 39 connection.write((dev_addr << 1), temp, 3);
nepes_ai 0:529602524696 40 }
nepes_ai 0:529602524696 41
nepes_ai 0:529602524696 42 char MPU6050::read(char address) {
nepes_ai 0:529602524696 43 char retval;
nepes_ai 0:529602524696 44 connection.write((dev_addr << 1), &address, true);
nepes_ai 0:529602524696 45 connection.read((dev_addr << 1), &retval, 1);
nepes_ai 0:529602524696 46 return retval;
nepes_ai 0:529602524696 47 }
nepes_ai 0:529602524696 48
nepes_ai 0:529602524696 49 void MPU6050::read(char address, char* data, int length) {
nepes_ai 0:529602524696 50 connection.write((dev_addr << 1), &address, true);
nepes_ai 0:529602524696 51 connection.read((dev_addr << 1), data, length);
nepes_ai 0:529602524696 52 }
nepes_ai 0:529602524696 53
nepes_ai 0:529602524696 54 ///////////////////////////////////////////////////////////
nepes_ai 0:529602524696 55 // CLKSEL[2:0] = (0x6B)PWR_MGMT_1[2:0]
nepes_ai 0:529602524696 56 ///////////////////////////////////////////////////////////
nepes_ai 0:529602524696 57 void MPU6050::setClockSource(uint8_t source) {
nepes_ai 0:529602524696 58 char read_val, write_val;
nepes_ai 0:529602524696 59
nepes_ai 0:529602524696 60 read_val = this->read(MPU6050_PWR_MGMT_1_REG);
nepes_ai 0:529602524696 61 write_val = (read_val & 0xF8) | (source & 0x07);
nepes_ai 0:529602524696 62
nepes_ai 0:529602524696 63 this->write(MPU6050_PWR_MGMT_1_REG, write_val);
nepes_ai 0:529602524696 64 }
nepes_ai 0:529602524696 65
nepes_ai 0:529602524696 66 ///////////////////////////////////////////////////////////
nepes_ai 0:529602524696 67 // SLEEP = (0x6B)PWR_MGMT_1[6]
nepes_ai 0:529602524696 68 ///////////////////////////////////////////////////////////
nepes_ai 0:529602524696 69 void MPU6050::setSleepEnable(bool enabled) {
nepes_ai 0:529602524696 70 char read_val, write_val;
nepes_ai 0:529602524696 71
nepes_ai 0:529602524696 72 read_val = this->read(MPU6050_PWR_MGMT_1_REG);
nepes_ai 0:529602524696 73 if (enabled)
nepes_ai 0:529602524696 74 write_val = read_val | 0x40;
nepes_ai 0:529602524696 75 else
nepes_ai 0:529602524696 76 write_val = read_val & 0xBF;
nepes_ai 0:529602524696 77
nepes_ai 0:529602524696 78 this->write(MPU6050_PWR_MGMT_1_REG, write_val);
nepes_ai 0:529602524696 79 }
nepes_ai 0:529602524696 80
nepes_ai 0:529602524696 81 ///////////////////////////////////////////////////////////
nepes_ai 0:529602524696 82 // WHO_AM_I[5:0] = (0x75)WHO_AM_I[6:1]
nepes_ai 0:529602524696 83 ///////////////////////////////////////////////////////////
nepes_ai 0:529602524696 84 uint8_t MPU6050::getDeviceID() {
nepes_ai 0:529602524696 85 return (this->read(MPU6050_WHO_AM_I_REG));
nepes_ai 0:529602524696 86 }
nepes_ai 0:529602524696 87
nepes_ai 0:529602524696 88 ///////////////////////////////////////////////////////////
nepes_ai 0:529602524696 89 // FS_SEL[1:0] = (0x1B)GYRO_CONFIG[4:3]
nepes_ai 0:529602524696 90 ///////////////////////////////////////////////////////////
nepes_ai 0:529602524696 91 void MPU6050::setFullScaleGyroRange(int8_t range) {
nepes_ai 0:529602524696 92 char read_val, write_val;
nepes_ai 0:529602524696 93
nepes_ai 0:529602524696 94 read_val = this->read(MPU6050_GYRO_CONFIG_REG);
nepes_ai 0:529602524696 95 write_val = (read_val & 0xE7) | ((range << 3) & 0x18);
nepes_ai 0:529602524696 96
nepes_ai 0:529602524696 97 this->write(MPU6050_GYRO_CONFIG_REG, write_val);
nepes_ai 0:529602524696 98 }
nepes_ai 0:529602524696 99
nepes_ai 0:529602524696 100 ///////////////////////////////////////////////////////////
nepes_ai 0:529602524696 101 // AFS_SEL[1:0] = (0x1C)ACCEL_CONFIG[4:3]
nepes_ai 0:529602524696 102 ///////////////////////////////////////////////////////////
nepes_ai 0:529602524696 103 void MPU6050::setFullScaleAccelRange(int8_t range) {
nepes_ai 0:529602524696 104 char read_val, write_val;
nepes_ai 0:529602524696 105
nepes_ai 0:529602524696 106 read_val = this->read(MPU6050_ACCEL_CONFIG_REG);
nepes_ai 0:529602524696 107 write_val = (read_val & 0xE7) | ((range << 3) & 0x18);
nepes_ai 0:529602524696 108
nepes_ai 0:529602524696 109 this->write(MPU6050_ACCEL_CONFIG_REG, write_val);
nepes_ai 0:529602524696 110 }
nepes_ai 0:529602524696 111
nepes_ai 0:529602524696 112 //////////////////////////////////////////////////////////////////////
nepes_ai 0:529602524696 113 // XA_OFFSET[14:0] = (0x06)XA_OFFSET_H[7:0] + (0x07)XA_OFFSET_L[7:1]
nepes_ai 0:529602524696 114 //////////////////////////////////////////////////////////////////////
nepes_ai 0:529602524696 115 void MPU6050::setXAccelOffset(int16_t offset) {
nepes_ai 0:529602524696 116 this->writeWord(MPU6050_XA_OFFS_H_REG, offset);
nepes_ai 0:529602524696 117 }
nepes_ai 0:529602524696 118
nepes_ai 0:529602524696 119 //////////////////////////////////////////////////////////////////////
nepes_ai 0:529602524696 120 // YA_OFFSET[14:0] = (0x08)YA_OFFSET_H[7:0] + (0x09)YA_OFFSET_L[7:1]
nepes_ai 0:529602524696 121 //////////////////////////////////////////////////////////////////////
nepes_ai 0:529602524696 122 void MPU6050::setYAccelOffset(int16_t offset) {
nepes_ai 0:529602524696 123 this->writeWord(MPU6050_YA_OFFS_H_REG, offset);
nepes_ai 0:529602524696 124 }
nepes_ai 0:529602524696 125
nepes_ai 0:529602524696 126 //////////////////////////////////////////////////////////////////////
nepes_ai 0:529602524696 127 // ZA_OFFSET[14:0] = (0x0A)ZA_OFFSET_H[7:0] + (0x0B)ZA_OFFSET_L[7:1]
nepes_ai 0:529602524696 128 //////////////////////////////////////////////////////////////////////
nepes_ai 0:529602524696 129 void MPU6050::setZAccelOffset(int16_t offset) {
nepes_ai 0:529602524696 130 this->writeWord(MPU6050_ZA_OFFS_H_REG, offset);
nepes_ai 0:529602524696 131 }
nepes_ai 0:529602524696 132
nepes_ai 0:529602524696 133 //////////////////////////////////////////////////////////////////////
nepes_ai 0:529602524696 134 // XG_OFFSET[15:0] = (0x13)XG_OFFSET_H[7:0] + (0x14)XG_OFFSET_L[7:0]
nepes_ai 0:529602524696 135 //////////////////////////////////////////////////////////////////////
nepes_ai 0:529602524696 136 void MPU6050::setXGyroOffset(int16_t offset) {
nepes_ai 0:529602524696 137 this->writeWord(MPU6050_XG_OFFS_USRH_REG, offset);
nepes_ai 0:529602524696 138 }
nepes_ai 0:529602524696 139
nepes_ai 0:529602524696 140 //////////////////////////////////////////////////////////////////////
nepes_ai 0:529602524696 141 // YG_OFFSET[15:0] = (0x15)YG_OFFSET_H[7:0] + (0x16)YG_OFFSET_L[7:0]
nepes_ai 0:529602524696 142 //////////////////////////////////////////////////////////////////////
nepes_ai 0:529602524696 143 void MPU6050::setYGyroOffset(int16_t offset) {
nepes_ai 0:529602524696 144 this->writeWord(MPU6050_YG_OFFS_USRH_REG, offset);
nepes_ai 0:529602524696 145 }
nepes_ai 0:529602524696 146
nepes_ai 0:529602524696 147 //////////////////////////////////////////////////////////////////////
nepes_ai 0:529602524696 148 // ZG_OFFSET[15:0] = (0x17)ZG_OFFSET_H[7:0] + (0x18)ZG_OFFSET_L[7:0]
nepes_ai 0:529602524696 149 //////////////////////////////////////////////////////////////////////
nepes_ai 0:529602524696 150 void MPU6050::setZGyroOffset(int16_t offset) {
nepes_ai 0:529602524696 151 this->writeWord(MPU6050_ZG_OFFS_USRH_REG, offset);
nepes_ai 0:529602524696 152 }
nepes_ai 0:529602524696 153
nepes_ai 0:529602524696 154 void MPU6050::getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz) {
nepes_ai 0:529602524696 155 char buffer[14];
nepes_ai 0:529602524696 156 this->read(MPU6050_ACCEL_XOUT_H_REG, buffer, 14);
nepes_ai 0:529602524696 157 *ax = (((int16_t)buffer[0]) << 8) | buffer[1];
nepes_ai 0:529602524696 158 *ay = (((int16_t)buffer[2]) << 8) | buffer[3];
nepes_ai 0:529602524696 159 *az = (((int16_t)buffer[4]) << 8) | buffer[5];
nepes_ai 0:529602524696 160 *gx = (((int16_t)buffer[8]) << 8) | buffer[9];
nepes_ai 0:529602524696 161 *gy = (((int16_t)buffer[10]) << 8) | buffer[11];
nepes_ai 0:529602524696 162 *gz = (((int16_t)buffer[12]) << 8) | buffer[13];
nepes_ai 0:529602524696 163 }