Remarks
ElectronicSpeedController | |
---|---|
Status | |
Source code | GitHub |
Datasheet(s) | GitHub |
NuGet package |
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 |
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. |