.. highlight:: csharp Bosch Accelerometer =================== With the exception of our first ever board, the MetaWear R, all other MbientLab boards use a Bosch accelerometer, represeted by the `IAccelerometerBosch `_ interface. This interface is an extension of the ``IAccelerometer`` interface providing methods and classes specific to Bosch accelerometers. Currently, we support both the :ref:`BMI160 ` and :ref:`BMA255 ` sensors and they share much of their functionality with only a few differences enumerated in their respective interfaces. :: using MbientLab.MetaWear.Sensor; using MbientLab.MetaWear.Sensor.AccelerometerBosch; IAccelerometerBosch accBosch = metawear.GetModule(); Low/High Detection ------------------ Low/High-g detection is an algorithm on the sensor that detects when the measured acceleration falls below a lower bound (in freefall) or rises above an upper bound (high-g motion). This algorithm is accessed via the `LowAndHighG `_ property. Before enabling the algorithm, first configure the parameters by calling ``ILowAndHighGDataProducer``'s `Configure `_ method. This function configures both low and high-g detection. For low-g detection, set ``EnableLowG`` to true, and configure the threshold, hysteresis, and acceleration criteria if desired. :: // enable low-g detection, use sum criteria, // detect when sum < 0.333g accBosch.LowAndHighG.Configure(enableLowG: true, lowThreshold: 0.333f, mode: LowGMode.Sum); Unlike low-g detection, High-g detection can be disabled at a per axis level so developers need to explicitly set which axes to monitor. Developers can also optionally configure the duration, threshold, and hyesteresis of the high-g detection algorithm. :: // enable high-g detection on z-axis, // detect when acc > 2g accBosch.LowAndHighG.Configure(enableHighGz: true, highThreshold: 2f); After configuring the algorithm, add a route for the low/high-g responses. Data is interpreted as a `LowHighG `_ type. :: await accBosch.LowAndHighG.AddRouteAsync(source => source.Stream(data => Console.WriteLine(data.Value())) ); accBosch.LowAndHighG.Start(); accBosch.Start(); Flat Detection -------------- Flat detection checks when the sensor enters or leaves a horizontal position i.e. laying on a table. Data is interpretted as a boolean where true signifies the sensor is laying horizontally. :: await accBosch.Flat.AddRouteAsync(source => source.Stream(data => Console.WriteLine("Flat? " + data.Value())) ); accBosch.Flat.Start(); accBosch.Start(); Orientation Detection --------------------- The orientation detector alerts you when the sensor's orientation changes between portrait/landscape and front/back. Data is represented as a ``SensorOrientation`` enum. :: using MbientLab.MetaWear.Data; await accelerometer.Orientation.AddRouteAsync(source => source.Stream(data => Console.WriteLine("Orientation = " + data.Value())) ); accBosch.Orientation.Start(); accBosch.Start(); Tap Detection ------------- The tap detection algorithm checks if the difference in acceleration exceeds a threshold. To detect double tap, a second tap must be registered within the quiet delay but before the double tap window ends. The shock duration is a period of time where the direction of the first tap is locked; the quiet delay starts after the shock duration ends. Use ``ITapDataProducer``'s `Configure `_ to set the aforementioned parameters and to select which tap types to detect. Data from the tap detection algorithm is represented as a `Tap `_ type. :: using MbientLab.MetaWear.Data; // enable single tap detection accBosch.Tap.Configure(threshold: 2f, shock: TapShockTime._50ms); await accelerometer.Tap.AddRouteAsync(source => source.Stream(data => { var tap = data.Value(); if (tap.Type.HasValue) { switch (tap.Type.Value) { case TapType.Single: Console.WriteLine("Single tap!"); break; case TapType.Double: Console.WriteLine("Double tap!"); break; } } })); accBosch.Tap.Start(); accBosch.Start(); Motion Detection ---------------- The motion detection algorithms on the Bosch chips use the difference in consecutive acceleration data samples to determine different types of motion. =========== ===================================================================== Motion Description =========== ===================================================================== Any Difference exceeds threshold for N consecutive samples No Difference doesn't exceed the threshold for a period of time Slow Same as any motion but axis and direction information is not retained =========== ===================================================================== The different motion detection algorithms are accessed with the `Motion `_ property and only one algorithm can be active at any time. :: // configure no motion detection // difference < 0.1g for 10 seconds before interrupt is fired accBosch.Motion.ConfigureNo(duration: 10000, threshold: 0.1f); accBosch.Motion.AddRouteAsync(source => source.Stream(data => Console.WriteLine("No motion detected")) ); accBosch.Motion.Start(); accBosch.Start()