dulone
24.05.2014, 21:20
Hallo Zusammen,
ich habe ein kleines Problem und hoffe sehr das ihr mir weiterhelfen könnt. Konkret geht es darum, dass ich Joystickeingaben (Cyborg Evo) per Visual Basic Express 2010 einlese und diese dann über den Serial Port an einen Arduino Mega sende, um dort Servos zu bewegen. Das funktioniert solange wunderbar, solange ich nur 2 Werte übergebe. Also X und Y Achse oder Y und Z Achse und so weiter. Sobald ich versuche 3 Servos anzusteuern wird meine Z Achse ignoriert.
Hier mal die meiner Meinung nach wichtigsten Teile des Visual Basic Codes:
Public Class Form1
Private myJoystick As joystick
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
myJoystick = New joystick(Me.Handle, -1000, 0, 0, 100) 'erstellt eine neue Instanz der Joystick-Klasse
Catch ex As Exception
MsgBox(ex.Message)
End Try
SerialPort1.Open()
End Sub
Private Sub pollingTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pollingTimer.Tick
Try
myJoystick.poll()
SerialPort1.Write(myJoystick.StatusInformation.Pos ition.Y.ToString - 1500 & myJoystick.StatusInformation.Rotation - 2501 & myJoystick.StatusInformation.Position.X.ToString) 'hier liegt mein Problem!!
Catch ex As Exception
Label7.Text = "" + ex.Message.ToString
End Try
End Sub
In der Zeile "SerialPort1.Write..." liegt auch das Problem Position.X und Position.Y werden übergeben, "Rotation" aber nicht.
Wobei auch alle Paarkombinationen funktionieren (siehe oben) also es nicht an der Übergabe von "Rotation" an sich liegen kann sondern eben wahrscheinlich am Einlesen am Arduino.
polling Timer fragt alle 100ms
und hier der Arduino Code:
#include <Servo.h>
Servo Servo1;
Servo Servo2;
Servo Servo3;
void setup (){
Servo1.attach(9);
Servo2.attach(10);
Servo3.attach(11);
Serial.begin(9600);
}
void loop()
{
int i;
char X_buffer[4]; //Max. Zahl "9999"
int incomingpos = 0;
while(incomingpos == 0)
{
if (Serial.available())
{
Serial.flush();
delay(5);
i=0;
while(i<5)
{
X_buffer[i] = Serial.read();
i++;
}
Serial.flush();
incomingpos = atoi(X_buffer);
Serial.println(incomingpos);
//Servo Lenkung
if ((incomingpos >= -1000) && (incomingpos <= 0))
{
incomingpos = map(incomingpos, -1000, 0, 0, 179); // x Achse
Servo1.write(incomingpos);
delay(10);
}
// Regler Beschleunigung
else if ((incomingpos <= -1501) && (incomingpos >= -2500))
{
incomingpos = map(incomingpos, -1501, -2501, 0, 179); // y Achse
Servo2.write(incomingpos);
delay(10);
}
// Servo Lenkung parralell (z-Achese)
else if ((incomingpos <= 2501) && (incomingpos >=3500))
{
incomingpos = map(incomingpos, -2501, -3501, 0, 179); // z Achse
Servo3.write(incomingpos);
delay(10);
}
}
incomingpos = 0;
}
}
Wäre super wenn sich jemand die Zeit nimmt um den Code zu checken. Komme seit einer Woche nicht voran.
Über jeden Hinweis bin ich sehr dankbar und falls noch Infos fehlen gerne laut schreien.
Grüße
dulone
ich habe ein kleines Problem und hoffe sehr das ihr mir weiterhelfen könnt. Konkret geht es darum, dass ich Joystickeingaben (Cyborg Evo) per Visual Basic Express 2010 einlese und diese dann über den Serial Port an einen Arduino Mega sende, um dort Servos zu bewegen. Das funktioniert solange wunderbar, solange ich nur 2 Werte übergebe. Also X und Y Achse oder Y und Z Achse und so weiter. Sobald ich versuche 3 Servos anzusteuern wird meine Z Achse ignoriert.
Hier mal die meiner Meinung nach wichtigsten Teile des Visual Basic Codes:
Public Class Form1
Private myJoystick As joystick
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
myJoystick = New joystick(Me.Handle, -1000, 0, 0, 100) 'erstellt eine neue Instanz der Joystick-Klasse
Catch ex As Exception
MsgBox(ex.Message)
End Try
SerialPort1.Open()
End Sub
Private Sub pollingTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pollingTimer.Tick
Try
myJoystick.poll()
SerialPort1.Write(myJoystick.StatusInformation.Pos ition.Y.ToString - 1500 & myJoystick.StatusInformation.Rotation - 2501 & myJoystick.StatusInformation.Position.X.ToString) 'hier liegt mein Problem!!
Catch ex As Exception
Label7.Text = "" + ex.Message.ToString
End Try
End Sub
In der Zeile "SerialPort1.Write..." liegt auch das Problem Position.X und Position.Y werden übergeben, "Rotation" aber nicht.
Wobei auch alle Paarkombinationen funktionieren (siehe oben) also es nicht an der Übergabe von "Rotation" an sich liegen kann sondern eben wahrscheinlich am Einlesen am Arduino.
polling Timer fragt alle 100ms
und hier der Arduino Code:
#include <Servo.h>
Servo Servo1;
Servo Servo2;
Servo Servo3;
void setup (){
Servo1.attach(9);
Servo2.attach(10);
Servo3.attach(11);
Serial.begin(9600);
}
void loop()
{
int i;
char X_buffer[4]; //Max. Zahl "9999"
int incomingpos = 0;
while(incomingpos == 0)
{
if (Serial.available())
{
Serial.flush();
delay(5);
i=0;
while(i<5)
{
X_buffer[i] = Serial.read();
i++;
}
Serial.flush();
incomingpos = atoi(X_buffer);
Serial.println(incomingpos);
//Servo Lenkung
if ((incomingpos >= -1000) && (incomingpos <= 0))
{
incomingpos = map(incomingpos, -1000, 0, 0, 179); // x Achse
Servo1.write(incomingpos);
delay(10);
}
// Regler Beschleunigung
else if ((incomingpos <= -1501) && (incomingpos >= -2500))
{
incomingpos = map(incomingpos, -1501, -2501, 0, 179); // y Achse
Servo2.write(incomingpos);
delay(10);
}
// Servo Lenkung parralell (z-Achese)
else if ((incomingpos <= 2501) && (incomingpos >=3500))
{
incomingpos = map(incomingpos, -2501, -3501, 0, 179); // z Achse
Servo3.write(incomingpos);
delay(10);
}
}
incomingpos = 0;
}
}
Wäre super wenn sich jemand die Zeit nimmt um den Code zu checken. Komme seit einer Woche nicht voran.
Über jeden Hinweis bin ich sehr dankbar und falls noch Infos fehlen gerne laut schreien.
Grüße
dulone