Library to use BMX055 via I2C
Dependents: NineIMUAttitude_MadgwickFilter
BMX055.hpp@0:be73a6efa20b, 2020-08-21 (annotated)
- Committer:
- aktk
- Date:
- Fri Aug 21 03:11:36 2020 +0000
- Revision:
- 0:be73a6efa20b
The first commit.
Who changed what in which revision?
User | Revision | Line number | New 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 |