News
11 Feb Eerste test met servo's
Vandaag heb ik een test gedaan met de Phidgets servo controller. Alles is zeer eenvoudig om te gebruken langs de software zijde. Hieronder een stuk van mijn code:
class Program
{
private Servo _servo1 = new Servo();
static void Main(string[] args)
{
new Program();
}
public Program()
{
_servo1.open();
while (true)
{
for (double angle = 0; angle < Math.PI * 2; angle+= Math.PI / 400)
{
PanTiltToServo(angle, Math.PI / 20);
System.Threading.Thread.Sleep(10);
}
}
}
private void PanTiltToServo(double pan, double tilt)
{
int mirror_radius = 30; // cm
SetServoPositionFromRopeLength(0, CalculateRopeLength(pan, tilt, mirror_radius, 0));
SetServoPositionFromRopeLength(1, CalculateRopeLength(pan, tilt, mirror_radius, Math.PI * 2 / 3));
SetServoPositionFromRopeLength(2, CalculateRopeLength(pan, tilt, mirror_radius, Math.PI * 4 / 3));
}
private double CalculateRopeLength(double pan, double tilt, double mirrorRadius, double ropeLocation)
{
return
-(mirrorRadius * Math.Cos(pan) * Math.Sin(tilt) * Math.Cos(ropeLocation) +
mirrorRadius * Math.Sin(pan) * Math.Sin(tilt) * Math.Sin(ropeLocation)) /
Math.Cos(tilt);
}
private void SetServoPositionFromRopeLength(int servo, double rope_length)
{
if (_servo1.servos.Count > servo)
{
Console.WriteLine("Serve }} rope length: }}, servo, rope_length);
int max_rope_length = 30; // -10 .. +10
ServoServo s = _servo1.servos[servo];
double proportion = (rope_length + max_rope_length) / (2 * max_rope_length);
s.Position = s.PositionMin + (s.PositionMax - s.PositionMin) * proportion;
}
}}

Comments