Interface library for ST LSM303DLM 3-axis magnetometer/accelerometer
Dependents: AVC_2012 m3pi_Kompass Fish_2014Fall Fish_2014Fall ... more
LSM303DLM.cpp@2:0fcea8569714, 2012-01-30 (annotated)
- Committer:
- shimniok
- Date:
- Mon Jan 30 20:28:47 2012 +0000
- Revision:
- 2:0fcea8569714
- Parent:
- 1:fc5c9258ec45
Fixed initialization bug that rendered the sensor inoperable. Duh.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shimniok | 0:faef9e4c8bea | 1 | #include "mbed.h" |
shimniok | 0:faef9e4c8bea | 2 | #include "LSM303DLM.h" |
shimniok | 0:faef9e4c8bea | 3 | #include "stdio.h" |
shimniok | 0:faef9e4c8bea | 4 | |
shimniok | 0:faef9e4c8bea | 5 | #define MAG_ADDRESS 0x3C |
shimniok | 0:faef9e4c8bea | 6 | #define ACC_ADDRESS 0x30 |
shimniok | 0:faef9e4c8bea | 7 | |
shimniok | 0:faef9e4c8bea | 8 | LSM303DLM::LSM303DLM(PinName sda, PinName scl): _device(sda, scl) |
shimniok | 0:faef9e4c8bea | 9 | { |
shimniok | 0:faef9e4c8bea | 10 | _device.frequency(400000); |
shimniok | 0:faef9e4c8bea | 11 | init(); |
shimniok | 0:faef9e4c8bea | 12 | } |
shimniok | 0:faef9e4c8bea | 13 | |
shimniok | 0:faef9e4c8bea | 14 | void LSM303DLM::init() |
shimniok | 0:faef9e4c8bea | 15 | { |
shimniok | 0:faef9e4c8bea | 16 | // init mag |
shimniok | 0:faef9e4c8bea | 17 | // continuous conversion mode |
shimniok | 0:faef9e4c8bea | 18 | _data[0] = MR_REG_M; |
shimniok | 0:faef9e4c8bea | 19 | _data[1] = 0x00; |
shimniok | 2:0fcea8569714 | 20 | _device.write(MAG_ADDRESS, _data, 2); |
shimniok | 0:faef9e4c8bea | 21 | // data rate 75hz |
shimniok | 0:faef9e4c8bea | 22 | _data[0] = CRA_REG_M; |
shimniok | 0:faef9e4c8bea | 23 | _data[1] = 0x18; // 0b00011000 |
shimniok | 2:0fcea8569714 | 24 | _device.write(MAG_ADDRESS, _data, 2); |
shimniok | 0:faef9e4c8bea | 25 | // init acc |
shimniok | 0:faef9e4c8bea | 26 | // data rate 100hz |
shimniok | 0:faef9e4c8bea | 27 | _data[0] = CTRL_REG1_A; |
shimniok | 0:faef9e4c8bea | 28 | _data[1] = 0x2F; // 0b00101111 |
shimniok | 2:0fcea8569714 | 29 | _device.write(ACC_ADDRESS, _data, 2); |
shimniok | 0:faef9e4c8bea | 30 | } |
shimniok | 0:faef9e4c8bea | 31 | |
shimniok | 0:faef9e4c8bea | 32 | void LSM303DLM::read(int a[3], int m[3]) |
shimniok | 0:faef9e4c8bea | 33 | { |
shimniok | 0:faef9e4c8bea | 34 | readAcc(a); |
shimniok | 0:faef9e4c8bea | 35 | readMag(m); |
shimniok | 0:faef9e4c8bea | 36 | } |
shimniok | 0:faef9e4c8bea | 37 | |
shimniok | 0:faef9e4c8bea | 38 | void LSM303DLM::readAcc(int a[3]) |
shimniok | 0:faef9e4c8bea | 39 | { |
shimniok | 0:faef9e4c8bea | 40 | _data[0] = OUT_X_L_A | (1<<7); |
shimniok | 0:faef9e4c8bea | 41 | _device.write(ACC_ADDRESS, _data, 1); |
shimniok | 0:faef9e4c8bea | 42 | _device.read(ACC_ADDRESS, _data, 6); |
shimniok | 0:faef9e4c8bea | 43 | |
shimniok | 0:faef9e4c8bea | 44 | // 12-bit values |
shimniok | 1:fc5c9258ec45 | 45 | a[0] = (short) (_data[1]<<8 | _data[0]) >> 4; |
shimniok | 1:fc5c9258ec45 | 46 | a[1] = (short) (_data[3]<<8 | _data[2]) >> 4; |
shimniok | 1:fc5c9258ec45 | 47 | a[2] = (short) (_data[5]<<8 | _data[4]) >> 4; |
shimniok | 0:faef9e4c8bea | 48 | } |
shimniok | 0:faef9e4c8bea | 49 | |
shimniok | 0:faef9e4c8bea | 50 | void LSM303DLM::readMag(int m[3]) |
shimniok | 0:faef9e4c8bea | 51 | { |
shimniok | 0:faef9e4c8bea | 52 | _data[0] = OUT_X_H_M; |
shimniok | 0:faef9e4c8bea | 53 | _device.write(MAG_ADDRESS, _data, 1); |
shimniok | 0:faef9e4c8bea | 54 | _device.read(MAG_ADDRESS, _data, 6); |
shimniok | 0:faef9e4c8bea | 55 | |
shimniok | 1:fc5c9258ec45 | 56 | m[0] = (short) (_data[0]<<8 | _data[1]); // X |
shimniok | 1:fc5c9258ec45 | 57 | m[1] = (short) (_data[4]<<8 | _data[5]); // Y |
shimniok | 1:fc5c9258ec45 | 58 | m[2] = (short) (_data[2]<<8 | _data[3]); // Z |
shimniok | 1:fc5c9258ec45 | 59 | } |
shimniok | 1:fc5c9258ec45 | 60 | |
shimniok | 1:fc5c9258ec45 | 61 | void LSM303DLM::setScale(float x, float y, float z) |
shimniok | 1:fc5c9258ec45 | 62 | { |
shimniok | 1:fc5c9258ec45 | 63 | scale[0] = x; |
shimniok | 1:fc5c9258ec45 | 64 | scale[1] = y; |
shimniok | 1:fc5c9258ec45 | 65 | scale[2] = z; |
shimniok | 1:fc5c9258ec45 | 66 | } |
shimniok | 1:fc5c9258ec45 | 67 | |
shimniok | 1:fc5c9258ec45 | 68 | void LSM303DLM::setOffset(float x, float y, float z) |
shimniok | 1:fc5c9258ec45 | 69 | { |
shimniok | 1:fc5c9258ec45 | 70 | offset[0] = x; |
shimniok | 1:fc5c9258ec45 | 71 | offset[1] = y; |
shimniok | 1:fc5c9258ec45 | 72 | offset[2] = z; |
shimniok | 0:faef9e4c8bea | 73 | } |