Inspired by these two cool videos on YouTube: here and here.
Assumes a NXT robot configuration alike the TriBot,
and a HiTecnic compass sensor attached to port 4.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using NKH.MindSqualls;
namespace NxtCompass1
{
public partial class Form1: Form
{
private NxtBrick brick;
private NxtMotorSync motorPair;
private HiTechnicCompassSensor compassSensor;
public Form1()
{
InitializeComponent();
this.Text = "Disconnected";
}
private void btnConnect_Click(object sender, EventArgs e)
{
try
{
byte comPort = byte.Parse(this.txtComPort.Text);
brick = new NxtBrick(comPort);
brick.MotorB = new NxtMotor();
brick.MotorC = new NxtMotor();
motorPair = new NxtMotorSync(brick.MotorB, brick.MotorC);
compassSensor = new HiTechnicCompassSensor();
brick.Sensor4 = compassSensor;
compassSensor.PollInterval = 50;
compassSensor.OnPolled += new Polled(compassSensor_OnPolled);
brick.Connect();
this.Text = "Connected: " + brick.Name;
}
catch
{
Disconnect();
}
}
private void btnDisconnect_Click(object sender, EventArgs e)
{
Disconnect();
}
private void Idle()
{
if (brick != null && brick.IsConnected)
motorPair.Idle();
}
private void Disconnect()
{
Idle();
System.Threading.Thread.Sleep(1000);
if (brick != null && brick.IsConnected)
brick.Disconnect();
brick = null;
motorPair = null;
this.Text = "Disconnected";
}
void compassSensor_OnPolled(NxtPollable polledItem)
{
Int16 heading = compassSensor.Heading;
sbyte turnRatio = (sbyte) ((heading > 180) ? 100 : -100);
sbyte power = (sbyte) Math.Min(100, 180 - Math.Abs(heading - 180));
motorPair.Run(power, 0, turnRatio);
}
}
}
Have a closer look at the compassSensor_OnPolled eventhandler. It is
the one that does the trick.