LIS3DH Hookup Guide
Example: SPI and FIFO usage
The second method in which to communicate with the LIS3DH is with the SPI interface. The SPI interface operates at 3.3v, so use a logic level converter or a MCU that operates at 3.3V. Use the following pictures to help build the circuit.
Basic Accelerometer Data Collection:
SPI is not the default configuration, so you'll have to pass extra information to the library by constructing with parameters. Modify "MinimalistExample" by changing LIS3DH myIMU;
to LIS3DH myIMU(SPI_MODE, 10);
for SPI mode with the !CS pin connected to pin 10.
The modified "MinimalistExample" is listed here:
myIMU(SPI_MODE, 10); // constructed with parameters for SPI and cs pin number void setup() { // put your setup code here, to run once: Serial.begin(9600); delay(1000); //relax... Serial.println("Processor came out of reset.\n"); //Call .begin() to configure the IMU myIMU.begin(); } void loop() { //Get all parameters Serial.print("\nAccelerometer:\n"); Serial.print(" X = "); Serial.println(myIMU.readFloatAccelX(), 4); Serial.print(" Y = "); Serial.println(myIMU.readFloatAccelY(), 4); Serial.print(" Z = "); Serial.println(myIMU.readFloatAccelZ(), 4); delay(1000); }
LIS3DH
Example output:
Processor came out of reset. Accelerometer: X = -0.1481 Y = -0.1361 Z = 0.9768 Accelerometer: X = -0.1481 Y = -0.1361 Z = 0.9768 Accelerometer: X = -0.1481 Y = -0.1361 Z = 0.9768 Accelerometer: X = -0.1481 Y = -0.1361 Z = 0.9768
When run, the sketch will display data in Gs to the serial terminal. Every second, the data is collected and printed.
FIFO usage:
The SPI bus can operate faster than I2C, so for high speed data collections where periodic sampling is required, SPI is advisable.
myIMU(SPI_MODE, 10); //Constructing with SPI interface information //LIS3DH myIMU(I2C_MODE, 0x19); //Alternate constructor for I2C uint32_t sampleNumber = 0; //Used to make CSV output row numbers void setup() { // put your setup code here, to run once: Serial.begin(9600); delay(1000); //relax... Serial.println("Processor came out of reset.\n"); myIMU.settings.adcEnabled = 0; //Note: By also setting tempEnabled = 1, temperature data is available //instead of ADC3 in. Temperature *differences* can be read at a rate of //1 degree C per unit of ADC3 data. myIMU.settings.tempEnabled = 0; myIMU.settings.accelSampleRate = 10; //Hz. Can be: 0,1,10,25,50,100,200,400,1600,5000 Hz myIMU.settings.accelRange = 2; //Max G force readable. Can be: 2, 4, 8, 16 myIMU.settings.xAccelEnabled = 1; myIMU.settings.yAccelEnabled = 1; myIMU.settings.zAccelEnabled = 1; //FIFO control settings myIMU.settings.fifoEnabled = 1; myIMU.settings.fifoThreshold = 20; //Can be 0 to 31 myIMU.settings.fifoMode = 1; //FIFO mode. //fifoMode can be: // 0 (Bypass mode, FIFO off) // 1 (FIFO mode) // 3 (FIFO until full) // 4 (FIFO when trigger) //Call .begin() to configure the IMU (except for the fifo) myIMU.begin(); Serial.print("Configuring FIFO with no error checking..."); myIMU.fifoBegin(); //Configure fifo Serial.print("Done!\n"); Serial.print("Clearing out the FIFO..."); myIMU.fifoClear(); Serial.print("Done!\n"); myIMU.fifoStartRec(); //cause fifo to start taking data (re-applies mode bits) } void loop() { //float temp; //This is to hold read data //uint16_t tempUnsigned; // while(( myIMU.fifoGetStatus() & 0x80 ) == 0) {}; //Wait for watermark //Now loop until FIFO is empty. //If having problems with the fifo not restarting after reading data, use the watermark //bits (b5 to b0) instead. //while(( myIMU.fifoGetStatus() & 0x1F ) > 2) //This checks that there is only a couple entries left while(( myIMU.fifoGetStatus() & 0x20 ) == 0) //This checks for the 'empty' flag { Serial.print(sampleNumber); Serial.print(","); Serial.print(myIMU.readFloatAccelX()); Serial.print(","); Serial.print(myIMU.readFloatAccelY()); Serial.print(","); Serial.print(myIMU.readFloatAccelZ()); Serial.println(); sampleNumber++; } }
LIS3DH
Example output:
Processor came out of reset. Configuring FIFO with no error checking...Done! Clearing out the FIFO...Done! 0,-0.15,-0.14,1.04 1,-0.17,-0.12,1.02 2,-0.21,-0.10,0.95 3,-0.21,-0.10,1.01 4,-0.22,-0.12,1.07 5,-0.17,-0.12,0.99 6,-0.12,-0.15,0.96 7,-0.18,-0.12,0.94 8,-0.19,-0.10,0.98 9,-0.20,-0.14,1.04 10,-0.19,-0.12,0.99 11,-0.20,-0.10,0.95 12,-0.21,-0.12,1.06 13,-0.14,-0.12,0.98 14,-0.10,-0.11,0.95 15,-0.12,-0.10,0.94 16,-0.14,-0.09,0.90 ...
Notice that the output produces batches of data periodically. Even though the data waits to be collected, it is still sampled periodically. The data is collected when the FIFO is past the watermark configured in the line myIMU.settings.fifoThreshold = 20;
.