Remarks

ElectronicSpeedController
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Motors.ElectronicSpeedController
float frequency = 50f;
const float armMs = 0.5f;
const float powerIncrement = 0.05f;

ElectronicSpeedController esc;
RotaryEncoderWithButton rotary;

public MeadowApp()
{
    Initialize();
    DisplayPowerOnLed(esc.Power);
}

void Initialize()
{
    Console.WriteLine("Initialize hardware...");

    //==== rotary encoder
    rotary = new RotaryEncoderWithButton(Device, Device.Pins.D07, Device.Pins.D08, Device.Pins.D06);
    rotary.Rotated += Rotary_Rotated;
    rotary.Clicked += (s, e) => {
        Console.WriteLine($"Arming the device.");
        _ = esc.Arm();
    }; ;

    //==== Electronic Speed Controller
    esc = new ElectronicSpeedController(Device, Device.Pins.D02, frequency);

    Console.WriteLine("Hardware initialized.");
}

private void Rotary_Rotated(object sender, Meadow.Peripherals.Sensors.Rotary.RotaryChangeResult e)
{
    esc.Power += (e.Direction == RotationDirection.Clockwise) ? powerIncrement : -powerIncrement;
    DisplayPowerOnLed(esc.Power);

    Console.WriteLine($"New Power: {esc.Power * (float)100:n0}%");
}

/// <summary>
/// Displays the ESC power on the onboard LED as full red @ `100%`,
/// blue @ `0%`, and a proportional mix, in between those speeds.
/// </summary>
/// <param name="power"></param>
void DisplayPowerOnLed(float power)
{
    // `0.0` - `1.0`
    int r = (int)Map(power, 0f, 1f, 0f, 255f);
    int b = (int)Map(power, 0f, 1f, 255f, 0f);

    var color = Color.FromRgb(r, 0, b);
}

float Map(float value, float fromSource, float toSource, float fromTarget, float toTarget)
{
    return (value - fromSource) / (toSource - fromSource) * (toTarget - fromTarget) + fromTarget;
}

Sample project(s) available on GitHub

|

Code Example

Frequency frequency = new Frequency(50, Frequency.UnitType.Hertz);
const float armMs = 0.5f;
const float powerIncrement = 0.05f;

ElectronicSpeedController esc;
RotaryEncoderWithButton rotary;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    rotary = new RotaryEncoderWithButton(Device.Pins.D07, Device.Pins.D08, Device.Pins.D06);
    rotary.Rotated += RotaryRotated;
    rotary.Clicked += (s, e) =>
    {
        Resolver.Log.Info($"Arming the device.");
        esc.Arm();
    }; ;

    esc = new ElectronicSpeedController(Device.Pins.D02, frequency);

    Resolver.Log.Info("Hardware initialized.");

    return base.Initialize();
}

private void RotaryRotated(object sender, RotaryChangeResult e)
{
    esc.Power += (e.New == RotationDirection.Clockwise) ? powerIncrement : -powerIncrement;
    DisplayPowerOnLed(esc.Power);

    Resolver.Log.Info($"New Power: {esc.Power * (float)100:n0}%");
}

/// <summary>
/// Displays the ESC power on the onboard LED as full red @ `100%`,
/// blue @ `0%`, and a proportional mix, in between those speeds.
/// </summary>
/// <param name="power"></param>
void DisplayPowerOnLed(float power)
{
    // `0.0` - `1.0`
    int r = (int)ExtensionMethods.Map(power, 0f, 1f, 0f, 255f);
    int b = (int)ExtensionMethods.Map(power, 0f, 1f, 255f, 0f);

    var color = Color.FromRgb(r, 0, b);
}

public override Task Run()
{
    DisplayPowerOnLed(esc.Power);

    return base.Run();
}

Sample project(s) available on GitHub

Characteristic Locus
Inheritance System.Object > ElectronicSpeedController
Namespace Meadow.Foundation.Motors
Assembly ElectronicSpeedController.dll

Syntax

public class ElectronicSpeedController : object

Constructors

ElectronicSpeedController(IPin, Units.Frequency)

Initializes an electronic speed controller on the specified device pin, at the specified frequency.

Declaration
public ElectronicSpeedController(IPin pwmPin, Units.Frequency frequency)

Parameters

Type Name Description
IPin pwmPin

PWM capable pin.

Units.Frequency frequency

Frequency of the PWM signal. All ESCs should support 50Hz, but some support much higher. Increase for finer grained control of speed in time.

ElectronicSpeedController(IPwmPort)

Initializes an electronic speed controller on the specified device pin, at the specified frequency.

Declaration
public ElectronicSpeedController(IPwmPort port)

Parameters

Type Name Description
IPwmPort port

The IPwmPort that will drive the ESC.

Properties

ArmingPulseDuration

The pulse duration, in milliseconds, neccessary to "arm" the ESC. Default value is 0.5ms.

Declaration
public float ArmingPulseDuration { get; set; }

Property Value

Type Description
System.Single

Frequency

Frequency (in Hz) of the PWM signal. Default is 50Hz. Set during construction, and increase for higher quality ESC's that allow a higher frequency PWM control signal.

Declaration
public Units.Frequency Frequency { get; }

Property Value

Type Description
Units.Frequency

Power

0.0 -> 1.0

Declaration
public float Power { get; set; }

Property Value

Type Description
System.Single

Methods

Arm()

Sends a 0.5ms pulse to the motor to enable throttle control.

Declaration
public void Arm()

CalculateDutyCycle(Single, Units.Frequency)

Calculates the appropriate duty cycle of a PWM signal for the given pulse duration and frequency.

Declaration
protected float CalculateDutyCycle(float pulseDuration, Units.Frequency frequency)

Parameters

Type Name Description
System.Single pulseDuration

The duration of the target pulse, in milliseconds.

Units.Frequency frequency

The frequency of the PWM.

Returns

Type Description
System.Single

A duty cycle value expressed as a percentage between 0.0 and 1.0.

CalculatePulseDuration(Single)

Returns a pulse duration, in milliseconds, for the given power, assuming that the allowed power band is between 1ms and 2ms.

Declaration
protected float CalculatePulseDuration(float power)

Parameters

Type Name Description
System.Single power

A value between 0.0 and 1.0 representing the percentage of power, between 0% and 100%, with 0.0 = 0%, and 1.0 = 100%.

Returns

Type Description
System.Single

A pulse duration in milliseconds for the given power.