The Netduino forums have been replaced by new forums at community.wildernesslabs.co.
This site has been preserved for archival purposes only
and the ability to make new accounts or posts has been turned off.
. Start () and minor modifications to work in the new 4.3.1
Netduino 2 plus - servo generic hobby king
using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
namespace Servo_API
{
public class Servo : IDisposable
{
/// <summary>
/// PWM handle
/// </summary>
private PWM servo;
/// <summary>
/// Timings range
/// </summary>
private int[] range = new int[2];
/// <summary>
/// Set servo inversion
/// </summary>
public bool inverted = false;
/// <summary>
/// Create the PWM Channel, set it low and configure timings
/// </summary>
/// <param name="pin"></param>
public Servo(Cpu.PWMChannel channelPin)
{
// Init the PWM pin
// servo = new PWM((Cpu.PWMChannel)channelPin, 20000, 1500, PWM.ScaleFactor.Microseconds, false);
servo = new PWM(PWMChannels.PWM_PIN_D5, 20000, 1500, Microsoft.SPOT.Hardware.PWM.ScaleFactor.Microseconds, false);
servo.Period = 20000;
// Typical settings
range[0] = 1000;
range[1] = 2000;
}
public void Dispose()
{
disengage();
servo.Dispose();
}
/// <summary>
/// Allow the user to set cutom timings
/// </summary>
/// <param name="fullLeft"></param>
/// <param name="fullRight"></param>
public void setRange(int fullLeft, int fullRight)
{
range[1] = fullLeft;
range[0] = fullRight;
}
/// <summary>
/// Disengage the servo.
/// The servo motor will stop trying to maintain an angle
/// </summary>
public void disengage()
{
// See what the Netduino team say about this...
servo.DutyCycle = 0; //SetDutyCycle(0);
}
/// <summary>
/// Set the servo degree
/// </summary>
public double Degree
{
set
{
/// Range checks
if (value > 180)
value = 180;
if (value < 0)
value = 0;
// Are we inverted?
if (inverted)
value = 180 - value;
// Set the pulse
//servo.SetPulse(20000, (uint)map((long)value, 0, 180, range[0], range[1]));
servo.Duration = (uint)map((long)value, 0, 180, range[0], range[1]);
servo.Start();
}
}
private long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
}
}
i call
Servo tt = new Servo(Cpu.PWMChannel.PWM_5);
tt.Degree = 30;
tt.setRange(1000, 2000);
tt.Dispose();
other method, no class
PWM servo = new PWM(PWMChannels.PWM_PIN_D5, 20000, 1500, PWM.ScaleFactor.Microseconds, false);
uint firstPosition = 1000; //Minimum pulse width of 1msD:\mydocuments\C#_Leap_Netduino\Servo_API\Servo_API\Program.cs
uint lastPosition = 2500; //Maximum pulse width of 2 ms // move through the full range of positions
for (uint currentPosition = firstPosition;
currentPosition <= lastPosition;
currentPosition += 10)
{ // move the servo to the new position.
servo.Duration = currentPosition;
servo.Period = 20000;
servo.Start();
Thread.Sleep(20); //refresh the pulse every 20 milliseconds. This can be servo dependant
} // return to first position and wait a half second.
servo.DutyCycle = 1;
servo.Duration = firstPosition; // duração do pulso
servo.Period = 20000; //periodo do pulso
servo.Start();
/*
* Servo NETMF Driver
* Coded by Chris Seto August 2010
* <chris@chrisseto.com>
*
* Use this code for whatveer you want. Modify it, redistribute it, I don't care.
* I do ask that you please keep this header intact, however.
* If you modfy the driver, please include your contribution below:
*
* Chris Seto: Inital release (1.0)
* Chris Seto: Netduino port (1.0 -> Netduino branch)
* Chris Seto: bool pin state fix (1.1 -> Netduino branch)
*
*
* */
using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
namespace Servo_API
{
public class Servo : IDisposable
{
/// <summary>
/// PWM handle
/// </summary>
private PWM servo;
/// <summary>
/// Timings range
/// </summary>
private int[] range = new int[2];
/// <summary>
/// Set servo inversion
/// </summary>
public bool inverted = false;
/// <summary>
/// Create the PWM Channel, set it low and configure timings
/// </summary>
/// <param name="pin"></param>
public Servo(Cpu.PWMChannel channelPin)
{
// Init the PWM pin
servo = new PWM((Cpu.PWMChannel)channelPin, 20000, 1500, PWM.ScaleFactor.Microseconds, false);
servo.DutyCycle = 0;
// Typical settings
range[0] = 1000;
range[1] = 2000;
}
public void Dispose()
{
disengage();
servo.Dispose();
}
/// <summary>
/// Allow the user to set cutom timings
/// </summary>
/// <param name="fullLeft"></param>
/// <param name="fullRight"></param>
public void setRange(int fullLeft, int fullRight)
{
range[1] = fullLeft;
range[0] = fullRight;
}
/// <summary>
/// Disengage the servo.
/// The servo motor will stop trying to maintain an angle
/// </summary>
public void disengage()
{
// See what the Netduino team say about this...
servo.DutyCycle = 0; //SetDutyCycle(0);
}
/// <summary>
/// Set the servo degree
/// </summary>
public double Degree
{
set
{
/// Range checks
if (value > 180)
value = 180;
if (value < 0)
value = 0;
// Are we inverted?
if (inverted)
value = 180 - value;
// Set the pulse
//servo.SetPulse(20000, (uint)map((long)value, 0, 180, range[0], range[1]));
servo.Duration = (uint)map((long)value, 0, 180, range[0], range[1]);
}
}
/// <summary>
/// Used internally to map a value of one scale to another
/// </summary>
/// <param name="x"></param>
/// <param name="in_min"></param>
/// <param name="in_max"></param>
/// <param name="out_min"></param>
/// <param name="out_max"></param>
/// <returns></returns>
private long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
}
}
Servo servo = new Servo(PWMChannels.PWM_PIN_D5);
servo.Degree = 30; // Change 'While' to 'For' to limit how many time it repeats
for (int j = 0; j < 3; j++)
{
for (int i = 0; i <= 180; i++)
{
servo.Degree = i;
Thread.Sleep(10);
}
for (int i = 180; i >= 0; i--)
{
servo.Degree = i;
Thread.Sleep(10);
}
}
. Start () and minor modifications to work in the new 4.3.1
Netduino 2 plus - servo generic hobby king
using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
namespace Servo_API
{
public class Servo : IDisposable
{
/// <summary>
/// PWM handle
/// </summary>
private PWM servo;
/// <summary>
/// Timings range
/// </summary>
private int[] range = new int[2];
/// <summary>
/// Set servo inversion
/// </summary>
public bool inverted = false;
/// <summary>
/// Create the PWM Channel, set it low and configure timings
/// </summary>
/// <param name="pin"></param>
public Servo(Cpu.PWMChannel channelPin)
{
// Init the PWM pin
// servo = new PWM((Cpu.PWMChannel)channelPin, 20000, 1500, PWM.ScaleFactor.Microseconds, false);
servo = new PWM(PWMChannels.PWM_PIN_D5, 20000, 1500, Microsoft.SPOT.Hardware.PWM.ScaleFactor.Microseconds, false);
servo.Period = 20000;
// Typical settings
range[0] = 1000;
range[1] = 2000;
}
public void Dispose()
{
disengage();
servo.Dispose();
}
/// <summary>
/// Allow the user to set cutom timings
/// </summary>
/// <param name="fullLeft"></param>
/// <param name="fullRight"></param>
public void setRange(int fullLeft, int fullRight)
{
range[1] = fullLeft;
range[0] = fullRight;
}
/// <summary>
/// Disengage the servo.
/// The servo motor will stop trying to maintain an angle
/// </summary>
public void disengage()
{
// See what the Netduino team say about this...
servo.DutyCycle = 0; //SetDutyCycle(0);
}
/// <summary>
/// Set the servo degree
/// </summary>
public double Degree
{
set
{
/// Range checks
if (value > 180)
value = 180;
if (value < 0)
value = 0;
// Are we inverted?
if (inverted)
value = 180 - value;
// Set the pulse
//servo.SetPulse(20000, (uint)map((long)value, 0, 180, range[0], range[1]));
servo.Duration = (uint)map((long)value, 0, 180, range[0], range[1]);
servo.Start();
}
}
private long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
}
}
i call
Servo tt = new Servo(Cpu.PWMChannel.PWM_5);
tt.Degree = 30;
tt.setRange(1000, 2000);
tt.Dispose();
other method, no class
PWM servo = new PWM(PWMChannels.PWM_PIN_D5, 20000, 1500, PWM.ScaleFactor.Microseconds, false);
uint firstPosition = 1000; //Minimum pulse width of 1msD:\mydocuments\C#_Leap_Netduino\Servo_API\Servo_API\Program.cs
uint lastPosition = 2500; //Maximum pulse width of 2 ms // move through the full range of positions
for (uint currentPosition = firstPosition;
currentPosition <= lastPosition;
currentPosition += 10)
{ // move the servo to the new position.
servo.Duration = currentPosition;
servo.Period = 20000;
servo.Start();
Thread.Sleep(20); //refresh the pulse every 20 milliseconds. This can be servo dependant
} // return to first position and wait a half second.
servo.DutyCycle = 1;
servo.Duration = firstPosition; // duração do pulso
servo.Period = 20000; //periodo do pulso
servo.Start();