PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VB Joystick Steuerung



Wingman
08.08.2011, 09:30
Hallo

Ich habe vor Kurzem einen Roboterarm gebaut, aus Aluteilen und Servos (6 Achsen).
Die Bilder kann ich demnächst mal ins Forum stellen.
Jedenfalls wird er durch einen Maestro Servo Controller angesteuert.
Für den kann man wiederum mit Visual Basic kompliziertere Programme schreiben.
In die erste Version habe ich eine Steuerung per Maus eingebaut, was recht gut funktioniert.
Das stieß aber auch schon an die Grenzen meiner Programmierkentnisse.
Jetzt schwebt mir eben vor den Ganzen Roboter über einen Joystick zu steuern.
Ich hab erstmal das Internet nach ordentlichen Programmcodes durchforstet aber egal was
ich einsetzte spuckt das Programm Unmengen an Fehlercodes aus.
Also wie mache ich das am besten? Ich hab gesehen dass es irgendwie über DirectX geht.
Hat jemand einen funktionierenden Code??

Der Joystick ist ein CyborgX, ich arbeite mit VB 2010 und bin totaler Anfänger. :(

Günter49
08.08.2011, 13:38
Vielleicht hilft Dir das folgende Beispiel in C# (besonders das 2. Programm von „Ploetzi“):
http://www.mycsharp.de/wbb2/thread.php?postid=286490&sid=7c0f4d92a2c8fe5d58899d88c7ef0600#post286490

Wie man das C#-Programm in VB einbindet beschreibt „Ploetzi“ hier:
http://www.vbarchiv.net/forum/id31_i617t617_steuern-mit-dem-joystick-2-achsen-2-tasten.htm

Gruß, Günter

BastelWastel
08.08.2011, 15:53
Ich habe mal mit VB.net und DirectX ein Programm zusammen geflickt das dir weiterhelfen koennte..
Ich schau heute Abend ob ich da noch Quellcodes von habe.
(ist aber Bricolage ;))

Gruss, Andreas

Wingman
08.08.2011, 16:24
Danke für die Hilfe soweit!
Ich hab jetzt ein Programm gefunden, dass mit meinem Joystick funktioniert:
http://bienert-projects.de/blog/?p=90
Ich bin nur gerade am verzweifeln wie ich das in mein Programm einsetze.
Entweder geht nur der Joystick oder nur der Maestro, zusammen funktioniert es noch nicht.
Also das ist mein Programmcode:
Imports Pololu.UsbWrapper
Imports Pololu.Usc

Imports System
Imports System.Text
Imports System.ComponentModel




Public Class MainWindow



Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs)
TrySetTarget(0, TrackBar1.Value * 4) ' Richtet den Servo 0 nach dem Schieberegler aus.
End Sub
Sub Servo_0_up_down_ValueChanged(ByVal sender As Object, ByVal e As _
System.EventArgs)
TrySetTarget(0, Servo_0_up_down.Value * 4)
End Sub
''' <summary>
''' This function runs when the user clicks the Disable button.
''' </summary>
Sub ButtonDisable_Click(ByVal sender As Object, ByVal e As EventArgs)
' Set target of channel 0 to 0. This tells the Maestro to stop
' transmitting pulses on that channel. Any servo connected to it
' should stop trying to maintain its position.
TrySetTarget(0, 0)
End Sub








Private Sub TrackBar2_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs)
TrySetTarget(1, TrackBar2.Value * 4) ' Richtet den Servo 1 nach dem Schieberegler aus.
End Sub
Sub Servo_1_up_down_ValueChanged(ByVal sender As Object, ByVal e As _
System.EventArgs)
TrySetTarget(1, Servo_1_up_down.Value * 4)
End Sub
''' <summary>
''' This function runs when the user clicks the Disable button.
''' </summary>
Sub ButtonDisable2_Click(ByVal sender As Object, ByVal e As EventArgs)
' Set target of channel 1 to 0. This tells the Maestro to stop
' transmitting pulses on that channel. Any servo connected to it
' should stop trying to maintain its position.
TrySetTarget(1, 0)
End Sub









Private Sub TrackBar3_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs)
TrySetTarget(2, TrackBar1.Value * 4) ' Richtet den Servo 2 nach dem Schieberegler aus.
End Sub
Sub Servo_2_up_down_ValueChanged(ByVal sender As Object, ByVal e As _
System.EventArgs)
TrySetTarget(2, Servo_2_up_down.Value * 4)
End Sub
''' <summary>
''' This function runs when the user clicks the Disable button.
''' </summary>
Sub ButtonDisable3_Click(ByVal sender As Object, ByVal e As EventArgs)
' Set target of channel 2 to 0. This tells the Maestro to stop
' transmitting pulses on that channel. Any servo connected to it
' should stop trying to maintain its position.
TrySetTarget(2, 0)
End Sub








''' <summary>
''' Attempts to set the target of
''' </summary>
''' <param name="channel">Channel number from 0 to 23.</param>
''' <param name="target">
''' Target, in units of quarter microseconds. For typical servos,
''' 6000 is neutral and the acceptable range is 4000-8000.
''' </param>
Sub TrySetTarget(ByVal channel As Byte, ByVal target As UInt16)
Try
Using device As Usc = connectToDevice() ' Find a device and temporarily connect.
device.setTarget(channel, target)
' device.Dispose() is called automatically when the "Using" block ends,
' allowing other functions and processes to use the device.
End Using
Catch exception As Exception ' Handle exceptions by displaying them to the user.
displayException(exception)
End Try
End Sub

''' <summary>
''' Connects to a Maestro using native USB and returns the Usc object
''' representing that connection. When you are done with the
''' connection, you should close it using the Dispose() method so that
''' other processes or functions can connect to the device later. The
''' "Using" statement can do this automatically for you.
''' </summary>
Function connectToDevice() As Usc
' Get a list of all connected devices of this type.
Dim connectedDevices As List(Of DeviceListItem) = Usc.getConnectedDevices()

For Each dli As DeviceListItem In connectedDevices
' If you have multiple devices connected and want to select a particular
' device by serial number, you could simply add some code like this:
' If dli.serialNumber <> "00012345" Then
' Continue For
' End If

Dim device As Usc = New Usc(dli) ' Connect to the device.
Return device ' Return the device.
Next

Throw New Exception("Der Controller konnte nicht gefunden werden. Überprüfen Sie die USB-Verbindung! ")
End Function

''' <summary>
''' Displays an exception (error) to the user by popping up a message box.
''' </summary>
Sub displayException(ByVal exception As Exception)
Dim stringBuilder As StringBuilder = New StringBuilder()
Do
stringBuilder.Append(exception.Message & " ")
If TypeOf exception Is Win32Exception Then
Dim win32Exception As Win32Exception = DirectCast(exception, Win32Exception)
stringBuilder.Append("Error code 0x" + win32Exception.NativeErrorCode.ToString("x") + ". ")
End If
exception = exception.InnerException
Loop Until (exception Is Nothing)
MessageBox.Show(stringBuilder.ToString(), Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Sub

Sub Maus_Check(ByVal sender As System.Object, ByVal e As System.EventArgs)

If Maussteuerung.Checked = True Then
Maussteuerung.Text = "aktiviert"
Else
Maussteuerung.Text = "deaktiviert"
End If
End Sub

Sub XY_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
'Ausgabe des XY-Wertes der Maus
Dim xachse, yachse As String

xachse = e.Location.X
yachse = e.Location.Y

lbl_koord.Text = (500 + xachse * 3) & "-" & (400 + yachse * 2.7)
If Maussteuerung.Checked = True Then
TrySetTarget(0, (2000 - xachse * 2.8) * 4)
TrySetTarget(1, (400 + yachse * 2.7) * 4)
Else
End If








End Sub

Private Declare Function joyGetPos Lib "winmm.dll" (ByVal uJoyID As Integer, ByRef pji As JOYINFO) As Integer
Private Structure JOYINFO
Dim X As Integer
Dim Y As Integer
Dim Z As Integer
Dim Buttons As Integer
End Structure
Dim JInfo As JOYINFO

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
joyGetPos(0, JInfo) 'Joystick 0
TextBox1.Text = "B :" + Str$(JInfo.Buttons)
TextBox2.Text = "X :" + Str$(JInfo.X)
TextBox3.Text = "Y :" + Str$(JInfo.Y)
End Sub






End Class
Jetzt muss ich noch das andere Programm reinbasteln.
Nur bisher hat er entweder nicht reagiert oder irgendwelche sinnlosen Fehler angegeben.

BastelWastel
08.08.2011, 19:19
So..

[neuer Link unten]

Vllt. kannst du daraus ein paar Schnippsel brauchen. (alles was serialport ist kannst du ignorieren..war nur ein Test von mir)
Das verwendet DirectX.DirectInput, du brauchst dafür das DirectX SDK auf dem Rechner.
Auslesen kannst du damit alle DirectInput fähigen Geräte..USB Joysticks, Gamepads, Tastatur, Maus, etc..

Du darfst mich nur nix mehr darüber fragen..das ist ne kleine Ewigkeit her ;)

Gruss, Andreas

Wingman
08.08.2011, 19:25
@ BastelWastel: Vielen Dank für die Datei! Ich werde das gleich mal ausprobieren.
Nur für was brauche ich das DirectX SDK? Das Beispiel das ich im Internet gefunden habe geht auch so.
Die DirecX.Directimput ist irgendwo im Systemordner von meinem PC. Mein Programm spuckt jedenfalls immer diesen Fehler aus:
Die Datei oder Assembly "Microsoft.DirectX.DirectInput.dll" oder eine Abhängigkeit davon wurde nicht gefunden. ist keine zulässige Win32-Anwendung. (Ausnahme von HRESULT: 0x800700C1)
Die Datei ist aber wie ich schon geschrieben hab da. Kann das daran liegen dass ich ein 64-Bit System habe?
Und wenn ja wie kann ich das in Visual Basic umstellen.

BastelWastel
08.08.2011, 21:31
So , hab das Programm nochmal durchgenudelt..alten krams gelöscht und getestet..
https://rapidshare.com/files/3670361885/Joystick_test.rar

Bei mir läufts mit VB2010, mußte nur das .NET Framework auf 3.5 zurück stellen.
Das SDK brauchst du nichtmal..hatte das nur irgendwie noch im Hinterkopf..
Du mußt glaub ich 2 Verweise mit in dein Projekt einbinden..die DirectX.dll und die DirectInput.dll..weiß nicht ob die input allein reicht.

Mit 64bit OS hatte ich noch nichts zu tun ;)

Gruss, Andreas

Wirecam
19.04.2012, 14:19
Hallo,

ich habe zurzeit ein ähnliches Problem.

Wir müssen für ein Schulprojekt zwei Schrittmotoren welche mit einem Arduino an einen Computer angeschlossen ist fernsteuern. Der Computer ist mit einem weiteren Computer über Lan verbunden. Am zweiten Computer ist ein USB Joystick angeschlossen welcher die Geschwindigkeit des Schrittmotors regeln soll.

Joystick: Thrustmaster


wir bitten euch um eure Hilfe, da wir am verzweifeln sind!!!!
=(

mfg Wirecam

BastelWastel
19.04.2012, 14:38
wir bitten euch um eure Hilfe, da wir am verzweifeln sind!!!!

Hallo Wirecam,
bei was genau seid ihr am verzweifeln?
Bei den Schrittmotoren, Adruino, dem LAN oder auslesen des Joysticks?

Gruss

Wirecam
19.04.2012, 14:49
also das mit dem Arduino klapt schon sehr gut aber wir bräuchten einen Beispielcode mit dem man die Werte vom Joystick einlesen kann und dann über lan übermittelt!

mfg Wirecam

BastelWastel
19.04.2012, 15:17
Muss es eine besondere Sprache sein?
Ich hatte mal mit VB + DirectX mit sowas rumgespielt..wenn das gut genug ist kann ich zuhause mal schauen ob ich die Codeschnippsel noch irgendwo habe.
Ein TCP Socket dazu pfriemeln waere dann kein grosses Problem.

Gruss, Andreas

Wirecam
19.04.2012, 17:07
danke für deine Antwort

wäre echt voll cool wenn du die Codeschnippsel posten könntest !!

das mit dem TCP Socket dazu geben ist für uns dann das nächste Problem, da wir in VB absolute Anfänger sind!!!

BastelWastel
19.04.2012, 22:47
Hallo Wirecam,
ich hab dir das Programm rausgesucht und direkt bissl umgebaut.. (VB.NET 2010)
https://rapidshare.com/files/3461765914/Joystick_test.rar
Es kann jetzt auch die Daten vom Joystick via UDP posten..sollte für deine Anwendung völlig ausreichend sein.
Falls der Joystick nicht auf den standard Achsen ausgelesen wird oder du ein anderes Format für die Daten willst mußt du selbst Hand anlegen..

(Schau nicht zu genau hin..das is quick und dirty ^^)

Falls du Hilfe brauchst schrei einfach laut..

Gruß, Andreas

Wirecam
22.04.2012, 09:36
Hallo Andreas,

danke für das Programm. Doch wie kann man die vom Joystick über das UDP gesendeten Daten auf dem anderen Computer wieder auslesen?

mfg Wirecam

BastelWastel
23.04.2012, 08:42
Einfach einen UDP Socket oeffnen und lauschen was auf dem angegebenem Port daher kommt ;)
Das sollte man irgendwo als Tutorial Projekt finden.