{\rtf1\ansi\ansicpg1252\cocoartf2580 \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 AndaleMono;\f1\fnil\fcharset0 HelveticaNeue;} {\colortbl;\red255\green255\blue255;\red0\green0\blue0;} {\*\expandedcolortbl;;\cssrgb\c0\c0\c0;} \margl1440\margr1440\vieww11520\viewh8400\viewkind0 \deftab720 \pard\pardeftab720\sl240\partightenfactor0 \f0\fs21 \cf2 \expnd0\expndtw0\kerning0 \outl0\strokewidth0 \strokec2 //MPU-6050 Accelerometer + Gyro\ // -----------------------------\ //\ // Using Arduino 1.0.1\ // It will not work with an older version,\ // since Wire.endTransmission() uses a parameter\ // to hold or release the I2C bus.\ //\ // Documentation:\ // - The InvenSense documents:\ // - "MPU-6000 and MPU-6050 Product Specification",\ // PS-MPU-6000A.pdf\ // - "MPU-6000 and MPU-6050 Register Map and Descriptions",\ // RM-MPU-6000A.pdf or RS-MPU-6000A.pdf\ // - "MPU-6000/MPU-6050 9-Axis Evaluation Board User Guide"\ // AN-MPU-6000EVB.pdf\ //\ // The accuracy is 16-bits.\ //\ // Temperature sensor from -40 to +85 degrees Celsius\ // 340 per degrees, -512 at 35 degrees.\ //\ // At power-up, all registers are zero, except these two:\ // Register 0x6B (PWR_MGMT_2) = 0x40 (I read zero).\ // Register 0x75 (WHO_AM_I) = 0x68.\ //\ \ #include \ #include \ #include \ \ #define CLK 9\ #define DIO 8\ \ TM1637Display display(CLK, DIO);\ \ // Register names according to the datasheet.\ // According to the InvenSense document\ // "MPU-6000 and MPU-6050 Register Map\ // and Descriptions Revision 3.2", there are no registers\ // at 0x02 ... 0x18, but according other information\ // the registers in that unknown area are for gain\ // and offsets.\ //\ #define MPU6050_AUX_VDDIO 0x01 // R/W\ #define MPU6050_SMPLRT_DIV 0x19 // R/W\ #define MPU6050_CONFIG 0x1A // R/W\ #define MPU6050_GYRO_CONFIG 0x1B // R/W\ #define MPU6050_ACCEL_CONFIG 0x1C // R/W\ #define MPU6050_FF_THR 0x1D // R/W\ #define MPU6050_FF_DUR 0x1E // R/W\ #define MPU6050_MOT_THR 0x1F // R/W\ #define MPU6050_MOT_DUR 0x20 // R/W\ #define MPU6050_ZRMOT_THR 0x21 // R/W\ #define MPU6050_ZRMOT_DUR 0x22 // R/W\ #define MPU6050_FIFO_EN 0x23 // R/W\ #define MPU6050_I2C_MST_CTRL 0x24 // R/W\ #define MPU6050_I2C_SLV0_ADDR 0x25 // R/W\ #define MPU6050_I2C_SLV0_REG 0x26 // R/W\ #define MPU6050_I2C_SLV0_CTRL 0x27 // R/W\ #define MPU6050_I2C_SLV1_ADDR 0x28 // R/W\ #define MPU6050_I2C_SLV1_REG 0x29 // R/W\ #define MPU6050_I2C_SLV1_CTRL 0x2A // R/W\ #define MPU6050_I2C_SLV2_ADDR 0x2B // R/W\ #define MPU6050_I2C_SLV2_REG 0x2C // R/W\ #define MPU6050_I2C_SLV2_CTRL 0x2D // R/W\ #define MPU6050_I2C_SLV3_ADDR 0x2E // R/W\ #define MPU6050_I2C_SLV3_REG 0x2F // R/W\ #define MPU6050_I2C_SLV3_CTRL 0x30 // R/W\ #define MPU6050_I2C_SLV4_ADDR 0x31 // R/W\ #define MPU6050_I2C_SLV4_REG 0x32 // R/W\ #define MPU6050_I2C_SLV4_DO 0x33 // R/W\ #define MPU6050_I2C_SLV4_CTRL 0x34 // R/W\ #define MPU6050_I2C_SLV4_DI 0x35 // R \ #define MPU6050_I2C_MST_STATUS 0x36 // R\ #define MPU6050_INT_PIN_CFG 0x37 // R/W\ #define MPU6050_INT_ENABLE 0x38 // R/W\ #define MPU6050_INT_STATUS 0x3A // R \ #define MPU6050_ACCEL_XOUT_H 0x3B // R \ #define MPU6050_ACCEL_XOUT_L 0x3C // R \ #define MPU6050_ACCEL_YOUT_H 0x3D // R \ #define MPU6050_ACCEL_YOUT_L 0x3E // R \ #define MPU6050_ACCEL_ZOUT_H 0x3F // R \ #define MPU6050_ACCEL_ZOUT_L 0x40 // R \ #define MPU6050_TEMP_OUT_H 0x41 // R \ #define MPU6050_TEMP_OUT_L 0x42 // R \ #define MPU6050_GYRO_XOUT_H 0x43 // R \ #define MPU6050_GYRO_XOUT_L 0x44 // R \ #define MPU6050_GYRO_YOUT_H 0x45 // R \ #define MPU6050_GYRO_YOUT_L 0x46 // R \ #define MPU6050_GYRO_ZOUT_H 0x47 // R \ #define MPU6050_GYRO_ZOUT_L 0x48 // R \ #define MPU6050_EXT_SENS_DATA_00 0x49 // R \ #define MPU6050_EXT_SENS_DATA_01 0x4A // R \ #define MPU6050_EXT_SENS_DATA_02 0x4B // R \ #define MPU6050_EXT_SENS_DATA_03 0x4C // R \ #define MPU6050_EXT_SENS_DATA_04 0x4D // R \ #define MPU6050_EXT_SENS_DATA_05 0x4E // R \ #define MPU6050_EXT_SENS_DATA_06 0x4F // R \ #define MPU6050_EXT_SENS_DATA_07 0x50 // R \ #define MPU6050_EXT_SENS_DATA_08 0x51 // R \ #define MPU6050_EXT_SENS_DATA_09 0x52 // R \ #define MPU6050_EXT_SENS_DATA_10 0x53 // R \ #define MPU6050_EXT_SENS_DATA_11 0x54 // R \ #define MPU6050_EXT_SENS_DATA_12 0x55 // R \ #define MPU6050_EXT_SENS_DATA_13 0x56 // R \ #define MPU6050_EXT_SENS_DATA_14 0x57 // R \ #define MPU6050_EXT_SENS_DATA_15 0x58 // R \ #define MPU6050_EXT_SENS_DATA_16 0x59 // R \ #define MPU6050_EXT_SENS_DATA_17 0x5A // R \ #define MPU6050_EXT_SENS_DATA_18 0x5B // R \ #define MPU6050_EXT_SENS_DATA_19 0x5C // R \ #define MPU6050_EXT_SENS_DATA_20 0x5D // R \ #define MPU6050_EXT_SENS_DATA_21 0x5E // R \ #define MPU6050_EXT_SENS_DATA_22 0x5F // R \ #define MPU6050_EXT_SENS_DATA_23 0x60 // R \ #define MPU6050_MOT_DETECT_STATUS 0x61 // R \ #define MPU6050_I2C_SLV0_DO 0x63 // R/W\ #define MPU6050_I2C_SLV1_DO 0x64 // R/W\ #define MPU6050_I2C_SLV2_DO 0x65 // R/W\ #define MPU6050_I2C_SLV3_DO 0x66 // R/W\ #define MPU6050_I2C_MST_DELAY_CTRL 0x67 // R/W\ #define MPU6050_SIGNAL_PATH_RESET 0x68 // R/W\ #define MPU6050_MOT_DETECT_CTRL 0x69 // R/W\ #define MPU6050_USER_CTRL 0x6A // R/W\ #define MPU6050_PWR_MGMT_1 0x6B // R/W\ #define MPU6050_PWR_MGMT_2 0x6C // R/W\ #define MPU6050_FIFO_COUNTH 0x72 // R/W\ #define MPU6050_FIFO_COUNTL 0x73 // R/W\ #define MPU6050_FIFO_R_W 0x74 // R/W\ #define MPU6050_WHO_AM_I 0x75 // R\ \ \ // Defines for the bits, to be able to change\ // between bit number and binary definition.\ // By using the bit number, programming the sensor\ // is like programming the AVR microcontroller.\ // But instead of using "(1<= threshold && prev < threshold)\ \{\ count += 1;\ Serial.print("steps= ");\ Serial.println(count);\ \}\ \ prev = mag;\ x = angle_x;\ y = angle_y;\ z = angle_z;\ \ // Delay so we don't swamp the serial port\ delay(100);\ //Serial.write(10);\ \ updateDisplay(count);\ \}\ \ \ // --------------------------------------------------------\ // MPU6050_read\ //\ // This is a common function to read multiple bytes\ // from an I2C device.\ //\ // It uses the boolean parameter for Wire.endTransMission()\ // to be able to hold or release the I2C-bus.\ // This is implemented in Arduino 1.0.1.\ //\ // Only this function is used to read.\ // There is no function for a single byte.\ //\ int MPU6050_read(int start, uint8_t *buffer, int size)\ \{\ int i, n, error;\ \ Wire.beginTransmission(MPU6050_I2C_ADDRESS);\ n = Wire.write(start);\ if (n != 1)\ return (-10);\ \ n = Wire.endTransmission(false); // hold the I2C-bus\ if (n != 0)\ return (n);\ \ // Third parameter is true: relase I2C-bus after data is read.\ Wire.requestFrom(MPU6050_I2C_ADDRESS, size, true);\ i = 0;\ while (Wire.available() && i < size)\ \{\ buffer[i++] = Wire.read();\ \}\ if ( i != size)\ return (-11);\ \ return (0); // return : no error\ \}\ \ \ // --------------------------------------------------------\ // MPU6050_write\ //\ // This is a common function to write multiple bytes to an I2C device.\ //\ // If only a single register is written,\ // use the function MPU_6050_write_reg().\ //\ // Parameters:\ // start : Start address, use a define for the register\ // pData : A pointer to the data to write.\ // size : The number of bytes to write.\ //\ // If only a single register is written, a pointer\ // to the data has to be used, and the size is\ // a single byte:\ // int data = 0; // the data to write\ // MPU6050_write (MPU6050_PWR_MGMT_1, &c, 1);\ //\ int MPU6050_write(int start, const uint8_t *pData, int size)\ \{\ int n, error;\ \ Wire.beginTransmission(MPU6050_I2C_ADDRESS);\ n = Wire.write(start); // write the start address\ if (n != 1)\ return (-20);\ \ n = Wire.write(pData, size); // write data bytes\ if (n != size)\ return (-21);\ \ error = Wire.endTransmission(true); // release the I2C-bus\ if (error != 0)\ return (error);\ \ return (0); // return : no error\ \}\ \ // --------------------------------------------------------\ // MPU6050_write_reg\ //\ // An extra function to write a single register.\ // It is just a wrapper around the MPU_6050_write()\ // function, and it is only a convenient function\ // to make it easier to write a single register.\ //\ int MPU6050_write_reg(int reg, uint8_t data)\ \{\ int error;\ \ error = MPU6050_write(reg, &data, 1);\ \ return (error);\ \}\ \ void updateDisplay(int number) \{\ display.setBrightness(0x0f);\ display.showNumberDec(number);\ \}\ \pard\pardeftab720\partightenfactor0 \f1\fs32 \cf2 \ }