Servo class in 4.3.1 - General Discussion - Netduino Forums
   
Netduino home hardware projects downloads community

Jump to content


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.
Photo

Servo class in 4.3.1


Best Answer dorathoto, 27 March 2014 - 09:51 PM

follows my current class, for those who need!

 

missing codes: 
. 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();     
Go to the full post


  • Please log in to reply
2 replies to this topic

#1 dorathoto

dorathoto

    Member

  • Members
  • PipPip
  • 12 posts

Posted 26 March 2014 - 08:50 PM

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
 
my servo is:
 
not working!
 
I tried as Chris Walker's book, 
but I realized that everything changed from 4.1 to 4.3 
Thus it greatly hinders learning.

 



#2 dorathoto

dorathoto

    Member

  • Members
  • PipPip
  • 12 posts

Posted 27 March 2014 - 09:51 PM   Best Answer

follows my current class, for those who need!

 

missing codes: 
. 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();     


#3 Chris Walker

Chris Walker

    Secret Labs Staff

  • Moderators
  • 7767 posts
  • LocationNew York, NY

Posted 28 March 2014 - 03:09 AM

Hi dorathoto,

Thanks for sharing the code updates with us!

Chris




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

home    hardware    projects    downloads    community    where to buy    contact Copyright © 2016 Wilderness Labs Inc.  |  Legal   |   CC BY-SA
This webpage is licensed under a Creative Commons Attribution-ShareAlike License.