Search code examples
c#.net-micro-frameworknetduino

Netduino - Class Servo - 4.3.1


I'm using the new version of the class of 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);
             }
         }

I connecting servo in 3.3v gnd port 5 digital in Netduino

my servo is: http://www.hobbyking.com/hobbyking/store/_14458_hobbyking_939mg_metal_gear_servo_2_5kg_12_5g_0_14sec.html

not working! why? someone has already done something that works?


Solution

  • Missed .start()

    My Class, working 100% Netduino - servo class, .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;
            }
        }
    }
    

    and I call this:

       Servo tt = new Servo(Cpu.PWMChannel.PWM_5);
                tt.Degree = 30;
                tt.setRange(1000, 2000);
                tt.Dispose();
            }