我正在使用Chris的新版本:
/*
* 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);
}
}
我连接伺服 3.3V GND Netduino的5端口数字
不工作!为什么?有人已经做了一些有用的事情吗?
答案 0 :(得分:0)
我没有使用过lib,但是伺服不应该由3.3v供电,你应该将它分别连接到5v引脚。
您可以尝试的另一件事是创建一个新的PWM:
PWM servo = new PWM(Pins.GPIO_PIN_D9);
另外,我们可以提供帮助,你应该描述它的行为......如果它抽搐,移动缓慢,某些东西......加上你连接它的方式(图表,照片)。
答案 1 :(得分:0)
错过.start()
我的班级,100%工作 Netduino - 伺服类,.NET 4.3.1
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;
}
}
}
我称之为:
Servo tt = new Servo(Cpu.PWMChannel.PWM_5);
tt.Degree = 30;
tt.setRange(1000, 2000);
tt.Dispose();
}