Archiv verlassen und diese Seite im Standarddesign anzeigen : VB Joystick Steuerung
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
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
@ 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
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
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
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
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.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.