東北大学学友会準加盟団体 From The Earth の高高度ロケットFTE-06(通称:海豚)にて使用したソフトウェアです.ご自由にお使いください.このプログラムによって生じた損害について当団体は一切責任を負いません.また,各モジュールのライブラリは当団体が作成したものではないので再配布は禁止します.

Dependencies:   mbed FATFileSystem

Fork of FTE-06 by Tetsushi Amano

Committer:
mizuki_akaike
Date:
Fri Aug 25 03:42:30 2017 +0000
Revision:
57:d78497a079cf
Parent:
25:c98c32708c63
??????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mizuki_akaike 23:9be034083282 1 #ifndef LSM303DLHC_H
mizuki_akaike 23:9be034083282 2 #define LSM303DLHC_H
mizuki_akaike 23:9be034083282 3
mizuki_akaike 23:9be034083282 4 #include "mbed.h"
mizuki_akaike 23:9be034083282 5
mizuki_akaike 23:9be034083282 6 //! LSM303DLHC 3D accelerometer and 3D magnetometer
mizuki_akaike 23:9be034083282 7 class LSM303DLHC {
mizuki_akaike 23:9be034083282 8 typedef struct vector {float x, y, z;} vector;
mizuki_akaike 23:9be034083282 9 static void vector_cross(const vector *a, const vector *b, vector *out);
mizuki_akaike 23:9be034083282 10 static float vector_dot(const vector *a,const vector *b);
mizuki_akaike 23:9be034083282 11 static void vector_normalize(vector *a);
mizuki_akaike 23:9be034083282 12 public:
mizuki_akaike 23:9be034083282 13 //! @param obj pointer to I2C object
mizuki_akaike 23:9be034083282 14 LSM303DLHC(I2C *obj);
mizuki_akaike 23:9be034083282 15 //! measure accelerometer value
mizuki_akaike 23:9be034083282 16 void getAccel(void) {read(ACCEL_SAD, OUT_A, _accel, 6);}
mizuki_akaike 23:9be034083282 17 //! extract X-axis value from mesured accelerometer
mizuki_akaike 23:9be034083282 18 int16_t accelX(void) {return (_accel[1]<<8)|_accel[0];}
mizuki_akaike 23:9be034083282 19 //! extract Y-axis value from mesured accelerometer
mizuki_akaike 23:9be034083282 20 int16_t accelY(void) {return (_accel[3]<<8)|_accel[2];}
mizuki_akaike 23:9be034083282 21 //! extract Z-axis value from mesured accelerometer
mizuki_akaike 23:9be034083282 22 int16_t accelZ(void) {return (_accel[5]<<8)|_accel[4];}
mizuki_akaike 23:9be034083282 23
mizuki_akaike 23:9be034083282 24 //! mesure magnetometer value
mizuki_akaike 23:9be034083282 25 void getMagnet(void) {read(MAGNET_SAD, OUT_M, _magnet, 6);}
mizuki_akaike 23:9be034083282 26 //accelと magnetでは Highと Lowの順序が逆になってる変な仕様
mizuki_akaike 23:9be034083282 27 //しかもMagnetは X,Z,Y の順番
mizuki_akaike 23:9be034083282 28 //! extract X-axis value from mesured magnetometer
mizuki_akaike 23:9be034083282 29 int16_t magnetX(void) {return (_magnet[0]<<8)|_magnet[1];}
moai26 25:c98c32708c63 30 //! extract Z-axis val]ue from mesured magnetometer
mizuki_akaike 23:9be034083282 31 int16_t magnetZ(void) {return (_magnet[2]<<8)|_magnet[3];}
mizuki_akaike 23:9be034083282 32 //! extract Y-axis value from mesured magnetometer
mizuki_akaike 23:9be034083282 33 int16_t magnetY(void) {return (_magnet[4]<<8)|_magnet[5];}
mizuki_akaike 23:9be034083282 34
mizuki_akaike 23:9be034083282 35 float heading(vector from);
mizuki_akaike 23:9be034083282 36 //! @return orientation(direction) value, expressed in degrees(0~360)
mizuki_akaike 23:9be034083282 37 float orientation(void);
mizuki_akaike 23:9be034083282 38 //! @return Temperature value, expressed in degrees Celsius
mizuki_akaike 23:9be034083282 39 float temperature(void);
mizuki_akaike 23:9be034083282 40 protected:
mizuki_akaike 23:9be034083282 41 //! write 1byte
mizuki_akaike 23:9be034083282 42 //! @param sad I2C address
mizuki_akaike 23:9be034083282 43 //! @param reg register address
mizuki_akaike 23:9be034083282 44 //! @param data data
mizuki_akaike 23:9be034083282 45 void write(char sad, char reg, char data);
mizuki_akaike 23:9be034083282 46 //! read data
mizuki_akaike 23:9be034083282 47 //! @param sad I2C address
mizuki_akaike 23:9be034083282 48 //! @param reg register address start from here and auto incriment
mizuki_akaike 23:9be034083282 49 //! @param data pointer to data storage
mizuki_akaike 23:9be034083282 50 //! @param length how many bytes to read
mizuki_akaike 23:9be034083282 51 void read(char sad, char reg, char *data, int length=1);
mizuki_akaike 23:9be034083282 52
mizuki_akaike 23:9be034083282 53 I2C *i2c;
mizuki_akaike 23:9be034083282 54 static const int8_t ACCEL_SAD = 0x32;
mizuki_akaike 23:9be034083282 55 static const int8_t MAGNET_SAD = 0x3C;
mizuki_akaike 23:9be034083282 56 enum accel_regs {
mizuki_akaike 23:9be034083282 57 CTRL_REG1_A=0x20,
mizuki_akaike 23:9be034083282 58 CTRL_REG2_A=0x21,
mizuki_akaike 23:9be034083282 59 CTRL_REG3_A=0x22,
mizuki_akaike 23:9be034083282 60 CTRL_REG4_A=0x23,
mizuki_akaike 23:9be034083282 61 CTRL_REG5_A=0x24,
mizuki_akaike 23:9be034083282 62 CTRL_REG6_A=0x25,
mizuki_akaike 23:9be034083282 63 REFERENCE_A=0x26,
mizuki_akaike 23:9be034083282 64 STATUS_REG_A=0x27,
mizuki_akaike 23:9be034083282 65 OUT_A=0x28, //6bytes
mizuki_akaike 23:9be034083282 66 FIFO_CTRL_REG_A=0x2E,
mizuki_akaike 23:9be034083282 67 FIFO_SRC_REG_A=0x2F,
mizuki_akaike 23:9be034083282 68 INT1_A=0x30, //4bytes
mizuki_akaike 23:9be034083282 69 INT2_A=0x34, //4bytes
mizuki_akaike 23:9be034083282 70 CLICK_A=0x38, //3bytes
mizuki_akaike 23:9be034083282 71 TIME_LIMIT_A=0x3B,
mizuki_akaike 23:9be034083282 72 TIME_LATENCY_A=0x3C,
mizuki_akaike 23:9be034083282 73 TIME_WINDOW_A=0x3D
mizuki_akaike 23:9be034083282 74 };
mizuki_akaike 23:9be034083282 75 static const int INT_CFG=0;
mizuki_akaike 23:9be034083282 76 static const int INT_SRC=1;
mizuki_akaike 23:9be034083282 77 static const int INT_THS=2;
mizuki_akaike 23:9be034083282 78 static const int INT_DURATION=3;
mizuki_akaike 23:9be034083282 79 enum magnet_regs {
mizuki_akaike 23:9be034083282 80 CRA_REG_M=0x00,
mizuki_akaike 23:9be034083282 81 CRB_REG_M=0x01,
mizuki_akaike 23:9be034083282 82 MR_REG_M=0x02,
mizuki_akaike 23:9be034083282 83 OUT_M=0x03, //6bytes
mizuki_akaike 23:9be034083282 84 SR_REG_M=0x09,
mizuki_akaike 23:9be034083282 85 IRA_REG_M=0x0A,
mizuki_akaike 23:9be034083282 86 IRB_REG_M=0x0B,
mizuki_akaike 23:9be034083282 87 IRC_REG_M=0x0C,
mizuki_akaike 23:9be034083282 88 TEMP_OUT_M=0x31 //2bytes
mizuki_akaike 23:9be034083282 89 };
mizuki_akaike 23:9be034083282 90 private:
mizuki_akaike 23:9be034083282 91 char _accel[6];
mizuki_akaike 23:9be034083282 92 char _magnet[6];
mizuki_akaike 23:9be034083282 93 };
mizuki_akaike 23:9be034083282 94
mizuki_akaike 23:9be034083282 95 #endif