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.

Pak0loko

Member Since 12 Sep 2012
Offline Last Active Dec 05 2012 02:05 AM
-----

Posts I've Made

In Topic: Netduino servo class

26 September 2012 - 07:05 PM

Hi Guys.
I´m new on this kind of thigs like programing using netduino and even on the use of c# :S.
I´ve been trying a lot to make this code works on firmware 4.2, you know the PWM changes and some other things.
Can anyone of you please help me on this?
I´ll appreciate it a lot.
Thanks in Advance.

This is a class I use on my other NETMF hardware to run my RC car based robot. It took very little effort to port to the Netduino, hopefully someone find it useful :)

/*
 * 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.Hardware;
using SecretLabs.NETMF.Hardware;

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 pin, set it low and configure timings
		/// </summary>
		/// <param name="pin"></param>
		public Servo(Cpu.Pin pin)
		{
			// Init the PWM pin
			servo = new PWM((Cpu.Pin)pin);

			servo.SetDutyCycle(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.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]));
			}
		}

		/// <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;
		}
	}
}

Example code:
using System.Threading;
using SecretLabs.NETMF.Hardware.Netduino;
using Servo_API;

namespace NetduinoServoDemo
{
	public class Program
	{
		public static void Main()
		{
			Servo servo = new Servo(Pins.GPIO_PIN_D9);

			while (true)
			{
				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);
				}
			}
		}

	}
}


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.