Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

Characteristic Locus
Inheritance object ObservableBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)> SamplingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)> PollingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)> > Bmi270
Implements IObservable<IChangeResult<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>> ISamplingSensor<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)> ISensor<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)> II2cPeripheral IGyroscope ISamplingSensor<AngularVelocity3D> ISensor<AngularVelocity3D> IAccelerometer ISamplingSensor<Acceleration3D> ISensor<Acceleration3D> ITemperatureSensor ISamplingSensor<Temperature> ISensor<Temperature>
Inherited Members PollingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.StartUpdating(TimeSpan?) PollingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.StopUpdating() SamplingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.samplingLock SamplingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.Updated SamplingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.SamplingTokenSource SamplingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.Conditions SamplingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.IsSampling SamplingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.UpdateInterval SamplingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.ReadSensor() SamplingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.RaiseEventsAndNotify(IChangeResult<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>) SamplingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.Read() ObservableBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.observers ObservableBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.NotifyObservers(IChangeResult<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>) ObservableBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.Subscribe(IObserver<IChangeResult<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>>) ObservableBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>.CreateObserver(Action<IChangeResult<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>>, Predicate<IChangeResult<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>>) object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString()
Namespace Meadow.Foundation.Sensors.Accelerometers
Assembly Bmi270.dll

Syntax

public class Bmi270 : PollingSensorBase<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>, IObservable<IChangeResult<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>>, ISamplingSensor<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>, ISensor<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>, II2cPeripheral, IGyroscope, ISamplingSensor<AngularVelocity3D>, ISensor<AngularVelocity3D>, IAccelerometer, ISamplingSensor<Acceleration3D>, ISensor<Acceleration3D>, ITemperatureSensor, ISamplingSensor<Temperature>, ISensor<Temperature>

Constructors

Bmi270(II2cBus, byte)

Create a new Bmi270 instance

Declaration
public Bmi270(II2cBus i2cBus, byte address = 104)

Parameters

Type Name Description
II2cBus i2cBus

The I2C bus connected to the sensor

byte address

The I2C address

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

Fields

i2cComms

I2C Communication bus used to communicate with the peripheral

Declaration
protected readonly II2cCommunications i2cComms

Field Value

Type Description
II2cCommunications

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

Properties

Acceleration3D

Current Acceleration 3D

Declaration
public Acceleration3D? Acceleration3D { get; }

Property Value

Type Description
Acceleration3D?

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

AngularVelocity3D

Current Angular Velocity (Gyro) 3D

Declaration
public AngularVelocity3D? AngularVelocity3D { get; }

Property Value

Type Description
AngularVelocity3D?

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

CurrentAccelerationRange

The range of values that can be read for acceleration on each axis

Declaration
public Bmi270.AccelerationRange CurrentAccelerationRange { get; }

Property Value

Type Description
Bmi270.AccelerationRange

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

CurrentAngularVelocityRange

The range of values that can be read for angular acceleration (gyro) on each axis

Declaration
public Bmi270.AngularVelocityRange CurrentAngularVelocityRange { get; }

Property Value

Type Description
Bmi270.AngularVelocityRange

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

DefaultI2cAddress

The default I2C address for the peripheral

Declaration
public byte DefaultI2cAddress { get; }

Property Value

Type Description
byte

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

Temperature

Current Temperature

Declaration
public Temperature? Temperature { get; }

Property Value

Type Description
Temperature?

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

Methods

RaiseEventsAndNotify(IChangeResult<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>)

Raise events for subscribers and notify of value changes

Declaration
protected override void RaiseEventsAndNotify(IChangeResult<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)> changeResult)

Parameters

Type Name Description
IChangeResult<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)> changeResult

The updated sensor data

Overrides

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

ReadSensor()

Reads data from the sensor

Declaration
protected override Task<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)> ReadSensor()

Returns

Type Description
Task<(Acceleration3D? Acceleration3D, AngularVelocity3D? AngularVelocity3D, Temperature? Temperature)>

The latest sensor reading

Overrides

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

SetAccelerationRange(AccelerationRange)

Set the range of values the sensor can read for acceleration

Declaration
public void SetAccelerationRange(Bmi270.AccelerationRange accelRange)

Parameters

Type Name Description
Bmi270.AccelerationRange accelRange

AccelerationRange

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

SetAngularVelocityRange(AngularVelocityRange)

Set the range of values the sensor can read for angular velocity (gyro)

Declaration
public void SetAngularVelocityRange(Bmi270.AngularVelocityRange angRange)

Parameters

Type Name Description
Bmi270.AngularVelocityRange angRange

AngularAccelerationRange

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

SetPowerMode(PowerMode)

Set the device power mode

Declaration
public void SetPowerMode(Bmi270.PowerMode powerMode)

Parameters

Type Name Description
Bmi270.PowerMode powerMode

The power mode

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

Events

Acceleration3DUpdated

Event raised when linear acceleration changes

Declaration
public event EventHandler<IChangeResult<Acceleration3D>> Acceleration3DUpdated

Event Type

Type Description
EventHandler<IChangeResult<Acceleration3D>>

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

AngularVelocity3DUpdated

Event raised when angular velocity (gyro) changes

Declaration
public event EventHandler<IChangeResult<AngularVelocity3D>> AngularVelocity3DUpdated

Event Type

Type Description
EventHandler<IChangeResult<AngularVelocity3D>>

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub

TemperatureUpdated

Event raised when temperature changes

Declaration
public event EventHandler<IChangeResult<Temperature>> TemperatureUpdated

Event Type

Type Description
EventHandler<IChangeResult<Temperature>>

Remarks

Bmi270
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Motion.Bmi270

Code Example

Bmi270 bmi270;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize hardware...");
    bmi270 = new Bmi270(Device.CreateI2cBus());

    // classical .NET events can also be used:
    bmi270.Updated += HandleResult;

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Bmi270.CreateObserver(handler: result => HandleResult(this, result),
                                         filter: result => FilterResult(result));

    bmi270.Subscribe(consumer);

    bmi270.StartUpdating(TimeSpan.FromMilliseconds(2000));

    return base.Initialize();
}

bool FilterResult(IChangeResult<(Acceleration3D? Acceleration3D,
                                 AngularVelocity3D? AngularVelocity3D,
                                 Temperature? Temperature)> result)
{
    return result.New.Acceleration3D.Value.Z > new Acceleration(0.1, Acceleration.UnitType.Gravity);
}

void HandleResult(object sender,
    IChangeResult<(Acceleration3D? Acceleration3D,
    AngularVelocity3D? AngularVelocity3D,
    Temperature? Temperature)> result)
{
    var accel = result.New.Acceleration3D.Value;
    var gyro = result.New.AngularVelocity3D.Value;
    var temp = result.New.Temperature.Value;

    Resolver.Log.Info($"AccelX={accel.X.Gravity:0.##}g, AccelY={accel.Y.Gravity:0.##}g, AccelZ={accel.Z.Gravity:0.##}g, GyroX={gyro.X.RadiansPerMinute:0.##}rpm, GyroY={gyro.Y.RadiansPerMinute:0.##}rpm, GyroZ={gyro.Z.RadiansPerMinute:0.##}rpm, {temp.Celsius:0.##}C");
}

Sample project(s) available on GitHub