Witam szanownych forumowiczów!!
Mam taki problem. Otóż mam sobie robota który ma w sobie arduino i sterowniki. Łączę się za pomocą portu COM i mogę mu wysyłać polecenia żeby np. jechał prost przez 2m. Na tym robocie mam zamontowany kinect jako kamerka i za pomocą niego sprawdzam aktualną głębokość czyli odległość od np. ściany. Moim problemem jest to że silniki mam krokowe i żeby przejechał te dwa 2m to muszę mu podać tą liczbę (w milimetrach :D ) albo jeśli podam mu np. wartość 20cm to muszę nacisnąć button 10razy żeby przejechał te 2m. Moje pytanie to jak zrobić w c# żebym mógł mu puścić pętle z tymi 20cm aż do tych 2m tak żeby mi nie zawieszał programu bo jak mu nacisnę jedź to po prostu zawiesza mi sie widok z kamerki kinect i nawet nie mogę wymusić mu żeby się robot zatrzymał. Kodzik funkcji jaką zrobiłem:
public string Connect()
{
string Status;
mySerialPort = new SerialPort("COM4", 115200);
if (mySerialPort.IsOpen != true)
{
mySerialPort.Open();
}
IsOn = mySerialPort.IsOpen;
if (IsOn == true)
{
Status = "Connect";
}
else
{
Status = "Disconnect";
}
return Status;
}
public void SendCommand(string _command)
{
mySerialPort.WriteLine(_command.ToString());
}
i funkcja która to robi:
private void Gogo_Click(object sender, RoutedEventArgs e) //Watki()
{
double distance = 0;
int depth22 = 0, af = 0, _distans = 2000;
bool check = true;
//Thread watek;
string nowy = "D+200";
while (check)
{
distance = 260 + (200 * _kinect.DepthFrameSource.FrameDescription.Width);
af = (int)distance;
depth22 = _depthData[af];
//watek = new Thread(new ParameterizedThreadStart(Commands.SendCommand1));
if (depth22 >= _distans || depth22 > 700)
{
//watek.Start(nowy);
//watek.Join();
//watek.Abort();
Commands.SendCommand(nowy);
}
else
{
//watek.Join();
//watek.Abort();
Commands.SendCommand("H");
check = false;
Thread.Sleep(5000);
}
}
}
Oczywiście pewne rzeczy mam utworzone w innych miejsca ale generalnie chodzi o tą ostatnią funkcję gdzie próbuje w pętli wysłać komendę do robota jedź(czyli ta ostania gdzie string=="D+200" gdzie D+ to jedź do przodu o 20cm i Commands.SendCommand(nowy);). Myślałem żeby to na wątkach zrobić ale nie bardzo umiem tych wątków bo próbowałem parę opcji ale efekt był taki że i tak się zawieszało wszystko.
Nie znalazłem tego problemu nigdzie indziej a jak coś było to u mnie nie działało... Proszę o jakieś pomysły jak to rozwiązać bo z racji mojej małej wiedzy na temat wątków ciężko mi coś wymyślić... (depth22 to jest aktualna odległość od przeszkody..)
Pozdrawiam