Home | History | Annotate | Download | only in mpu9150
      1 /*
      2  * Author: Jon Trulson <jtrulson (at) ics.com>
      3  * Copyright (c) 2015 Intel Corporation.
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining
      6  * a copy of this software and associated documentation files (the
      7  * "Software"), to deal in the Software without restriction, including
      8  * without limitation the rights to use, copy, modify, merge, publish,
      9  * distribute, sublicense, and/or sell copies of the Software, and to
     10  * permit persons to whom the Software is furnished to do so, subject to
     11  * the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be
     14  * included in all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
     20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
     21  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
     22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     23  */
     24 
     25 #pragma once
     26 
     27 #include "mpu60x0.h"
     28 #include "ak8975.h"
     29 
     30 #define MPU9150_I2C_BUS 0
     31 #define MPU9150_DEFAULT_I2C_ADDR  MPU60X0_DEFAULT_I2C_ADDR
     32 
     33 
     34 namespace upm {
     35 
     36   /**
     37    * @brief MPU9150 accelerometer library
     38    * @defgroup mpu9150 libupm-mpu9150
     39    * @ingroup seeed i2c gpio accelerometer compass
     40    */
     41 
     42   /**
     43    * @library mpu9150
     44    * @sensor mpu9150
     45    * @comname MPU9150 Inertial Measurement Unit
     46    * @altname Grove IMU 9DOF
     47    * @type accelerometer compass
     48    * @man seeed
     49    * @web http://www.seeedstudio.com/wiki/Grove_-_IMU_9DOF_v1.0
     50    * @con i2c gpio
     51    *
     52    * @brief API for MPU9150 chip (Accelerometer, Gyro and Magnometer Sensor)
     53    *
     54    * This module defines the MPU9150 interface for libmpu9150
     55    *
     56    * @image html mpu9150.jpg
     57    * @snippet mpu9150.cxx Interesting
     58    */
     59 
     60   class MPU9150: public MPU60X0
     61   {
     62   public:
     63     /**
     64      * MPU9150 constructor
     65      *
     66      * @param bus I2C bus to use
     67      * @param address The address for this device
     68      * @param magAddress The address of the connected magnetometer
     69      */
     70     MPU9150 (int bus=MPU9150_I2C_BUS, int address=MPU9150_DEFAULT_I2C_ADDR,
     71              int magAddress=AK8975_DEFAULT_I2C_ADDR, bool enableAk8975=false);
     72 
     73     /**
     74      * MPU9150 destructor
     75      */
     76     ~MPU9150 ();
     77 
     78     /**
     79      * Set up initial values and start operation
     80      *
     81      * @return true if successful
     82      */
     83     bool init();
     84 
     85     /**
     86      * Take a measurement and store the current sensor values
     87      * internally.  Note, these user facing registers are only updated
     88      * from the internal device sensor values when the i2c serial
     89      * traffic is 'idle'.  So, if you are reading the values too fast,
     90      * the bus may never be idle, and you will just end up reading
     91      * the same values over and over.
     92      *
     93      * Unfortunately, it is is not clear how long 'idle' actually
     94      * means, so if you see this behavior, reduce the rate at which
     95      * you are calling update().
     96      */
     97     void update();
     98 
     99     /**
    100      * Return the compensated values for the x, y, and z axes.  The
    101      * unit of measurement is in micro-teslas (uT).
    102      *
    103      * @param x Pointer to returned X axis value
    104      * @param y Pointer to returned Y axis value
    105      * @param z Pointer to returned Z axis value
    106      */
    107     void getMagnetometer(float *x, float *y, float *z);
    108 
    109 #ifdef SWIGJAVA
    110     /**
    111      * Return the compensated values for the x, y, and z axes.  The
    112      * unit of measurement is in micro-teslas (uT).
    113      *
    114      * @return Array containing X, Y, Z magnetometer values
    115      */
    116     float *getMagnetometer();
    117 #endif
    118 
    119 
    120 
    121   protected:
    122     // magnetometer instance
    123     AK8975* m_mag;
    124 
    125 
    126   private:
    127     int m_i2cBus;
    128     uint8_t m_magAddress;
    129     bool m_enableAk8975;
    130   };
    131 
    132 }
    133