Rock Monitoring  V 1.0
FXLS8471Q.cpp
Go to the documentation of this file.
1 #include "FXLS8471Q.h"
2 #include "WaspUSB.h"
3 
8 {
9 }
12 void FXLS8471Q::init(uint8_t slaveAddr)
13 {
14  switch (slaveAddr)
15  {
16  case 0:
17  {
18  i2cSlaveAddr = 0x1E; // with pins SA0=0, SA1=0
19  }
20  break;
21  case 1:
22  {
23  i2cSlaveAddr = 0x1D; // with pins SA0=1, SA1=0
24  }
25  break;
26  case 2:
27  {
28  i2cSlaveAddr = 0x1C; // with pins SA0=0, SA1=1
29  }
30  break;
31  case 3:
32  {
33  i2cSlaveAddr = 0x1F; // with pins SA0=1, SA1=1
34  }
35  break;
36  default:
37  {
38  //i2c slave address not set
39  }
40  }
41 
42  uint8_t databyte;
43 
44  // write 0000 0000 = 0x00 to accelerometer control register 1 to place FXLS8471Q into standby
45  // [7-1] = 0000 000
46  // [0]: active=0
47  databyte = 0x00;
48  Wire.writeBytes( i2cSlaveAddr, FXLS8471Q_CTRL_REG1, &databyte,(uint8_t) 1);
49 
50  // write 0000 0000= 0x00 to XYZ_DATA_CFG register
51  // [7]: reserved
52  // [6]: reserved
53  // [5]: reserved
54  // [4]: hpf_out=0
55  // [3]: reserved
56  // [2]: reserved
57  // [1-0]: fs=00 for accelerometer range of +/-2g with 0.244mg/LSB
58  databyte = 0x00;
59  Wire.writeBytes(i2cSlaveAddr, FXLS8471Q_XYZ_DATA_CFG, &databyte, (uint8_t) 1);
60 
61  // write 0011 1001b = 0x39 to accelerometer control register 1
62  // [7-6]: aslp_rate=00
63  // [5-3]: dr=111 for 1.56Hz data rate
64  // [2]: lnoise=0 for Reduced noise mode
65  // [1]: f_read=0 for normal 16 bit reads
66  // [0]: active=1 to take the part out of standby and enable sampling
67  databyte = 0x39;
68  Wire.writeBytes(i2cSlaveAddr, FXLS8471Q_CTRL_REG1, &databyte,(uint8_t) 1);
69 
70  // write 0001 0010b = 0x12 to accelerometer control register 2
71  // [7] : 0 self test disabled
72  // [6] : 0 reset disabled
73  // [5] : 0 -
74  // [4-3]: 10 low noise low power in sleep mode
75  // [2] : 0 auto sleep not enabled
76  // [1-0]: 10 low noise, low power
77  databyte = 0x12;
78  Wire.writeBytes(i2cSlaveAddr, FXLS8471Q_CTRL_REG2, &databyte,(uint8_t) 1);
79 
80  // write 0000 0011b = 0x03 to accelerometer control register 3
81  // [7] : 0 fifo_gate
82  // [6] : 0 wake_tran
83  // [5] : 0 wake_Indprt
84  // [4] : 0 wake_pulse
85  // [3] : 0 wake_ffmt
86  // [2] : 0 wake_en_a_vecm
87  // [1] : 1 ipol -> active high
88  // [0] : 0 pp_od ->open-drain
89  databyte = 0x03;
90  Wire.writeBytes(i2cSlaveAddr, FXLS8471Q_CTRL_REG3, &databyte,(uint8_t) 1);
91 
93  getAccXYZ(& xyz);
94 }
95 
102 {
103  uint8_t Buffer[FXLS8471Q_READ_LEN]; // read buffer
104  // read FXLS8471Q Acceleration Data (Status plus 3 acceleration channels)
105  if (Wire.readBytes(i2cSlaveAddr, FXLS8471Q_STATUS, Buffer, FXLS8471Q_READ_LEN) == FXLS8471Q_READ_LEN)
106  {
107  // copy the 14 bit accelerometer byte data into 16 bit words
108  xyz->x = ((Buffer[1] << 8) | Buffer[2])>> 2;
109  xyz->y = ((Buffer[3] << 8) | Buffer[4])>> 2;
110  xyz->z = ((Buffer[5] << 8) | Buffer[6])>> 2;
111  }
112  else
113  {
114  return (RETURN_ERROR);
115  }
116  return (RETURN_OK);
117 
118 }
119 
126 {
127  uint8_t Buffer[FXLS8471Q_READ_LEN]; // read buffer
129  double roll, pitch;
130  double X_G, Y_G, Z_G;
131  // read FXLS8471Q Acceleration Data (Status plus 3 acceleration channels)
132  if (Wire.readBytes(i2cSlaveAddr, FXLS8471Q_STATUS, Buffer, FXLS8471Q_READ_LEN) == FXLS8471Q_READ_LEN)
133  {
134  // copy the 14 bit accelerometer byte data into 16 bit words
135  xyz.x = ((Buffer[1] << 8) | Buffer[2])>> 2;
136  xyz.y = ((Buffer[3] << 8) | Buffer[4])>> 2;
137  xyz.z = ((Buffer[5] << 8) | Buffer[6])>> 2;
138 
139  //Calculate the acceleration in G for of each axis
140  X_G = xyz.x*FXLS8471Q_Sensitivity;
141  Y_G =xyz.y*FXLS8471Q_Sensitivity ;
142  Z_G =xyz.z*FXLS8471Q_Sensitivity ;
143 
144  //Calculate pitch and roll angles
145  pitch = 57.2957795 * atan(X_G/(sqrt((Y_G*Y_G)+(Z_G*Z_G)))); //Calculation of Pitch Angle in Degrees
146  roll = 57.2957795 * atan(Y_G/(sqrt((X_G*X_G)+(Z_G*Z_G)))); //Calculation of Roll Angle in Degrees
147 
148  //set 2 digits after commas
149  pitch = static_cast<int> (pitch*100+0.5) / 100.0;
150  roll = static_cast<int> (roll *100+0.5) / 100.0;
151 
152  //cast to int, but is stored 100 times higher (including 2 places after comma)
153  PitchRoll->pitch = (int) (pitch*100);
154  PitchRoll->roll = (int) (roll*100);
155 
156  }
157  else
158  {
159  return (RETURN_ERROR);
160  }
161  return (RETURN_OK);
162 
163 }
164 
167 {
168  uint8_t databyte;
169 
170  // write 0000 0000 = 0x00 to accelerometer control register 1 to place FXLS8471Q into
171  // standby
172  // [7-1] = 0000 000
173  // [0]: active=0
174  databyte = 0x00;
175  Wire.writeBytes( i2cSlaveAddr, FXLS8471Q_CTRL_REG1, &databyte,(uint8_t) 1);
176 }
#define RETURN_ERROR
Definition: Constants.h:4
#define FXLS8471Q_READ_LEN
Definition: FXLS8471Q.h:14
#define FXLS8471Q_STATUS
Definition: FXLS8471Q.h:5
uint8_t i2cSlaveAddr
Definition: FXLS8471Q.h:55
#define RETURN_OK
Definition: Constants.h:9
#define FXLS8471Q_CTRL_REG3
Definition: FXLS8471Q.h:10
#define FXLS8471Q_CTRL_REG2
Definition: FXLS8471Q.h:9
#define FXLS8471Q_Sensitivity
Definition: FXLS8471Q.h:15
#define FXLS8471Q_XYZ_DATA_CFG
Definition: FXLS8471Q.h:7
void goToSleep()
This method sets the Accelerometer in Standby.
Definition: FXLS8471Q.cpp:166
uint8_t getAccXYZ(FXLS8471Q::structXYZ *xyz)
This method returns the values of the X, Y and Z axis of the Accelerometer FXLS8471Q.
Definition: FXLS8471Q.cpp:101
#define FXLS8471Q_CTRL_REG1
Definition: FXLS8471Q.h:8
uint8_t getAccPitchRoll(FXLS8471Q::structPitchRoll *PitchRoll)
This method returns the values of the pitch and roll angles of the Accelerometer FXLS8471Q.
Definition: FXLS8471Q.cpp:125
void init(uint8_t slaveAddr)
This method initializes the Accelerometer FXLS8471Q.
Definition: FXLS8471Q.cpp:12