Library to use BMX055 via I2C

Dependents:   NineIMUAttitude_MadgwickFilter

Committer:
aktk
Date:
Fri Aug 21 03:11:36 2020 +0000
Revision:
0:be73a6efa20b
The first commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 0:be73a6efa20b 1 #ifndef BMX055_HPP
aktk 0:be73a6efa20b 2 #define BMX055_HPP
aktk 0:be73a6efa20b 3
aktk 0:be73a6efa20b 4 #include "mbed.h"
aktk 0:be73a6efa20b 5
aktk 0:be73a6efa20b 6 // Aux class
aktk 0:be73a6efa20b 7 template <typename T = float, unsigned char D = 3>
aktk 0:be73a6efa20b 8 class FixedLengthVector
aktk 0:be73a6efa20b 9 {
aktk 0:be73a6efa20b 10 public:
aktk 0:be73a6efa20b 11 const unsigned char degree; // length of array, or num of elements
aktk 0:be73a6efa20b 12
aktk 0:be73a6efa20b 13 T * const e; // elements
aktk 0:be73a6efa20b 14
aktk 0:be73a6efa20b 15 //elements' alias
aktk 0:be73a6efa20b 16 T &w, &x, &y, &z;
aktk 0:be73a6efa20b 17
aktk 0:be73a6efa20b 18
aktk 0:be73a6efa20b 19 FixedLengthVector (T* arg_init_vec = array_filled_0(D))
aktk 0:be73a6efa20b 20 :degree(value_checked_degree(D))
aktk 0:be73a6efa20b 21 ,e(new T[degree])
aktk 0:be73a6efa20b 22 ,w(e[0])
aktk 0:be73a6efa20b 23 ,x((degree > 3 ? e[1] : e[0]))
aktk 0:be73a6efa20b 24 ,y((degree > 3 ? e[2] : e[1]))
aktk 0:be73a6efa20b 25 ,z((degree > 3 ? e[3] : (degree == 3 ? e[2] : e[1])))
aktk 0:be73a6efa20b 26 {
aktk 0:be73a6efa20b 27 for (int i = 0; i < degree; i++) e[i] = arg_init_vec[i];
aktk 0:be73a6efa20b 28 }
aktk 0:be73a6efa20b 29
aktk 0:be73a6efa20b 30
aktk 0:be73a6efa20b 31 private:
aktk 0:be73a6efa20b 32 static inline unsigned char value_checked_degree (unsigned char arg_degree)
aktk 0:be73a6efa20b 33 {
aktk 0:be73a6efa20b 34 if (arg_degree < 2) return 2;
aktk 0:be73a6efa20b 35 else return arg_degree;
aktk 0:be73a6efa20b 36 }
aktk 0:be73a6efa20b 37
aktk 0:be73a6efa20b 38 static inline T * array_filled_0 (unsigned char arg_degree)
aktk 0:be73a6efa20b 39 {
aktk 0:be73a6efa20b 40 unsigned char l_degree = value_checked_degree(arg_degree);
aktk 0:be73a6efa20b 41 T* tmp = new T[l_degree];
aktk 0:be73a6efa20b 42
aktk 0:be73a6efa20b 43 for(int i = 0; i < l_degree; i++) tmp[i] = 0;
aktk 0:be73a6efa20b 44 return tmp;
aktk 0:be73a6efa20b 45 }
aktk 0:be73a6efa20b 46
aktk 0:be73a6efa20b 47 };
aktk 0:be73a6efa20b 48
aktk 0:be73a6efa20b 49 class BMX055
aktk 0:be73a6efa20b 50 {
aktk 0:be73a6efa20b 51 public:
aktk 0:be73a6efa20b 52 /** Main buffers which store 3 cubic data
aktk 0:be73a6efa20b 53 *
aktk 0:be73a6efa20b 54 * Acc: all x,y,z has 12 bits payload
aktk 0:be73a6efa20b 55 * Gyr: all x,y,z has 16 bits payload
aktk 0:be73a6efa20b 56 * Mag: x,y have 13 bits and z have 15 bits payload
aktk 0:be73a6efa20b 57 */
aktk 0:be73a6efa20b 58 FixedLengthVector<signed short, 3> acc, gyr, mag;
aktk 0:be73a6efa20b 59
aktk 0:be73a6efa20b 60 // I2C pin of LPC 1768 is (p9, p10) or (p28, p27);
aktk 0:be73a6efa20b 61 BMX055(
aktk 0:be73a6efa20b 62 const char arg_addr_acc = 0x19,
aktk 0:be73a6efa20b 63 const char arg_addr_gyr = 0x69,
aktk 0:be73a6efa20b 64 const char arg_addr_mag = 0x13,
aktk 0:be73a6efa20b 65 PinName arg_SDA = p9,
aktk 0:be73a6efa20b 66 PinName arg_SCL = p10)
aktk 0:be73a6efa20b 67 : m_addr_acc(arg_addr_acc << 1)
aktk 0:be73a6efa20b 68 , m_addr_gyr(arg_addr_gyr << 1)
aktk 0:be73a6efa20b 69 , m_addr_mag(arg_addr_mag << 1)
aktk 0:be73a6efa20b 70 {
aktk 0:be73a6efa20b 71 Init_I2C(arg_SDA, arg_SCL);
aktk 0:be73a6efa20b 72 }
aktk 0:be73a6efa20b 73 void Update();
aktk 0:be73a6efa20b 74 void UpdateIMU();
aktk 0:be73a6efa20b 75
aktk 0:be73a6efa20b 76 private:
aktk 0:be73a6efa20b 77 I2C* i2c;
aktk 0:be73a6efa20b 78 const char m_addr_acc;
aktk 0:be73a6efa20b 79 const char m_addr_gyr;
aktk 0:be73a6efa20b 80 const char m_addr_mag;
aktk 0:be73a6efa20b 81 void Init_I2C(PinName arg_SDA, PinName arg_SCL);
aktk 0:be73a6efa20b 82
aktk 0:be73a6efa20b 83 };
aktk 0:be73a6efa20b 84 #endif