Skip to content

Accelerometer & magnetometer

The SODAQ ONE V1 and V2 have a different accelerometer. On the ONE v1 there is the LSM303 which is not only an accelerometer but also an magnetometer. We moved in ONE v2 to the LIS3DE for its low power features.

LSM303D / ONE v1

Install the library

Go to: Sketch → Include Library → Manage Libraries…
Search for “LSM303”
Install the LSM303 by Pololu

Example Sketch

#include <Wire.h>
#include <LSM303.h>

LSM303 compass;

char report[80];

void setup()
{
  SerialUSB.begin(9600);
  Wire.begin();
  compass.init();
  compass.enableDefault();
}

void loop()
{
  compass.read();

  snprintf(report, sizeof(report), "A: %6d %6d %6d    M: %6d %6d %6d",
    compass.a.x, compass.a.y, compass.a.z,
    compass.m.x, compass.m.y, compass.m.z);
  SerialUSB.println(report);

  delay(100);
}

LIS3DE / ONE v2

Install the library

Download the Sodaq_LIS3DE library from the Arduino Library Manager
Go to: Sketch → Include Library → Manage Libraries…
Search for Sodaq_LIS3DE Install the library

Example Sketch

/* Example for using the accelerometer with the Sodaq_LSM303AGR library */
/* The example is tested on an Arduino M0 and a Sodaq Explorer with a Sodaq NB-IoT shield */
/* This code prints accelerometer readings every second and registers whether the board is flipped by interrupt */
#include <Arduino.h>
#include <Sodaq_LIS3DE.h>

Sodaq_LIS3DE accelerometer;

// Print the debug information on the SerialUSB
#define USB SerialUSB

// The interrupt pin for the Accelerometer is attached to D4
#define ACC_INT_PIN 4

// Threshold for interrupt trigger
double threshold = -0.8;
int now = millis();

void setup() {
    USB.begin(9600);
    while ((!USB) && (millis() < 10000)) {
        // Wait 10 seconds for the Serial Monitor
    }

    // Start the I2C bus
    Wire.begin();

    pinMode(ACCEL_INT1, INPUT);
    attachInterrupt(ACCEL_INT1, interrupt_event, CHANGE);

    // Configure EIC to use GCLK1 which uses XOSC32K, XOSC32K is already running in standby
    // This has to be done after the first call to attachInterrupt()
    GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(GCM_EIC) |
        GCLK_CLKCTRL_GEN_GCLK1 |
        GCLK_CLKCTRL_CLKEN;

    accelerometer.enable(true,
        Sodaq_LIS3DE::NormalLowPower10Hz,
        Sodaq_LIS3DE::XYZ,
        Sodaq_LIS3DE::Scale8g,
        true);

    delay(100);

    accelerometer.enableInterrupt1(
        Sodaq_LIS3DE::XHigh | Sodaq_LIS3DE::XLow | Sodaq_LIS3DE::YHigh | Sodaq_LIS3DE::YLow | Sodaq_LIS3DE::ZHigh | Sodaq_LIS3DE::ZLow,
        20 * 8.0 / 100.0,
        0,
        Sodaq_LIS3DE::MovementRecognition);
}

void loop() {

    // Print sensor readings every second
    if ((now + 1000) < millis())
    {
        now = millis();
        read_AccMeter();
    }
}

void read_AccMeter()
{
    USB.print("x = ");
    USB.print(accelerometer.getX());

    USB.print("\ty = ");
    USB.print(accelerometer.getY());

    USB.print("\tz = ");
    USB.println(accelerometer.getZ());
}

void interrupt_event()
{
    // Do not print in an interrupt event when sleep is enabled.
    USB.println("Board flipped");
}

LSM303AGR / ONE v3

Install the library

Download the Sodaq_LSM303AGR library from the Arduino Library Manager
Go to: Sketch → Include Library → Manage Libraries…
Search for Sodaq_LSM303AGR Install the library

Example Sketch

/* Example for using the accelerometer with the Sodaq_LSM303AGR library */
/* The example is tested on an Arduino M0 and a Sodaq Explorer with a Sodaq NB-IoT shield */
/* This code prints accelerometer readings every second and registers whether the board is flipped by interrupt */
#include <Arduino.h>
#include <Sodaq_LSM303AGR.h>

Sodaq_LSM303AGR AccMeter;

// Print the debug information on the SerialUSB
#define USB SerialUSB

// The interrupt pin for the Accelerometer is attached to D4
#define ACC_INT_PIN 4

// Threshold for interrupt trigger
double threshold = -0.8;
int now = millis();

void setup() {
    USB.begin(9600);
    while ((!USB) && (millis() < 10000)) {
        // Wait 10 seconds for the Serial Monitor
    }

    // Start the I2C bus
    Wire.begin();

    AccMeter.rebootAccelerometer();
    delay(1000);

    // Enable the Accelerometer
    AccMeter.enableAccelerometer();

    // Attach interrupt event fot the Accelerometer
    pinMode(ACC_INT_PIN, INPUT);
    attachInterrupt(ACC_INT_PIN, interrupt_event, RISING);

    // Enable interrupts on the SAMD
    GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(GCM_EIC) |
        GCLK_CLKCTRL_GEN_GCLK1 |
        GCLK_CLKCTRL_CLKEN;

    // If Z goes below threshold the interrupt is triggered
    AccMeter.enableInterrupt1(AccMeter.ZLow, threshold, 0, AccMeter.PositionRecognition);
}

void loop() {

    // Print sensor readings every second
    if ((now + 1000) < millis())
    {
        now = millis();
        read_AccMeter();
    }
}

void read_AccMeter()
{
    USB.print("x = ");
    USB.print(AccMeter.getX());

    USB.print("\ty = ");
    USB.print(AccMeter.getY());

    USB.print("\tz = ");
    USB.println(AccMeter.getZ());
}

void interrupt_event()
{
    // Do not print in an interrupt event when sleep is enabled.
    USB.println("Board flipped");
}

Questions

You can ask us anything on our Forum.