Willa (Diskussion | Beiträge) |
Willa (Diskussion | Beiträge) (fertig gemacht) |
||
Zeile 1: | Zeile 1: | ||
− | + | [[Bild:joytest.jpg]] | |
== Was braucht man hierfür? == | == Was braucht man hierfür? == | ||
* RN-Control Board | * RN-Control Board | ||
− | * USB -> COM | + | * USB -> COM-port Adapter (wenn man keinen COM port mehr am PC hat) |
* ISP Programmierkabel (wenn man nicht den Bootloader nutzt) | * ISP Programmierkabel (wenn man nicht den Bootloader nutzt) | ||
* PC | * PC | ||
Zeile 12: | Zeile 12: | ||
== Einleitung == | == Einleitung == | ||
− | Ein Roboter (auf Basis eines RN-Control Boards) kann über einen am PC angeschlossenen Joystick sehr einfach kontrolliert werden. In diesem Beispiel benutzen wir SharpDevelop als Entwicklungsumgebung ( | + | Ein Roboter (auf Basis eines RN-Control Boards) kann über einen am PC angeschlossenen Joystick sehr einfach kontrolliert werden. In diesem Beispiel benutzen wir SharpDevelop als Entwicklungsumgebung ([http://www.sharpdevelop.net SharpDevelop OpenSource Webseite]) für eine Windows VB.Net Applikation (ein Computerprogramm). Die Positionsdaten des Joysticks werden schliesslich über die RS232 Schnittstelle an den µC übertragen. Auch wenn du totaler Programmierneuling sein solltest kann dir diese Anleitung helfen. Einfach den Code kopieren und wie beschrieben einfügen. Dann sollte dein RN-Control Board auf Joystick-Befehle hören. |
− | Es wird Directinput benutzt um den Joystick zu erkennen und abzufragen. Deswegen muss das .NET Framework installiert sein | + | Es wird Directinput benutzt um den Joystick zu erkennen und abzufragen. Deswegen muss das .NET Framework installiert sein [http://www.microsoft.com/downloads/details.aspx?displaylang=de&FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5 .NET Framework @ Microsoft]. Die Kommunikation zwischen PC und µC findet - wie bereits erwähnt - über die RS232 Schnittstelle statt. Das Programm auf dem PC sendet alle 100 ms (oder schneller/ langsamer, je nach Wunsch) die aktuelle Joystick Position an den µC. Dieser liest die Werte für X und Y Achse ein und kann dann entsprechend darauf reagieren. |
== Beispielhafter Quellcode für BASCOM == | == Beispielhafter Quellcode für BASCOM == | ||
Zeile 39: | Zeile 39: | ||
'Die Variablen umskalieren | 'Die Variablen umskalieren | ||
− | X1 = X + | + | X1 = X + 20 |
X2 = X1 * 40 | X2 = X1 * 40 | ||
− | Y1 = Y + | + | Y1 = Y + 20 |
Y2 = Y1 * 40 | Y2 = Y1 * 40 | ||
'Einen Ton (Tonhöhe = Joystick Position) ausgeben | 'Einen Ton (Tonhöhe = Joystick Position) ausgeben | ||
Zeile 50: | Zeile 50: | ||
</pre> | </pre> | ||
− | |||
− | |||
== Quellcode in VB.NET (SharpDevelop) == | == Quellcode in VB.NET (SharpDevelop) == | ||
− | - | + | Da sich dieser Artikel wieder einmal an Anfänger richtet, gebe ich auch hier eine Schritt für Schritt Anleitung für SharpDevelop. |
+ | Als erstes klickt man auf ''Datei -> Neu -> Projektmappe -> VBNet -> Windowsanwendungen -> Windows-Anwendung''. | ||
+ | Nun muss man unserem Programm zwei Verweise zu DirectX und DirectInput hinzufügen. Dazu wählt man im Menü ''Projekt -> Referenz hinzufügen'' und fügt ''Microsoft.DirectX'' und ''Microsoft.DirectX.Directinput'' hinzu. <p> | ||
+ | |||
+ | Unter dem Code-Fenster klickt man auf "Design". Links bei den Tools klickt man auf "Components" und zieht dann den ''Serialport'' in sein Programmfenster. Rechts öffnen sich dann die Eigenschaften des ''Serialport1'', hier gibt man den COM-Port etc ein. Falls die ganzen Daten nicht zur Hand sind kann man einfach die Daten seines (funktionierenden) Terminalprogramms übernehmen. Ich musste nur den richtigen COM Port auswählen, der Rest stimmte. | ||
+ | |||
+ | Jetzt klickt man nochmal auf "Quellcode" um den Code des Programms zu bearbeiten. Ganz oben, als erste Befehle schreiben wir | ||
+ | <pre> | ||
+ | Imports System | ||
+ | Imports System.Windows.Forms | ||
+ | Imports Microsoft.DirectX.DirectInput | ||
+ | Imports Microsoft.DirectX | ||
+ | </pre> | ||
+ | Damit erklären wir unserem Programm dass wir u.a. DirectX und Directinput benutzen wollen. | ||
+ | |||
+ | Unter die Zeile ''Me.InitializeComponent()'' schreibt man einfach ''serialport1.open''. Dadurch wird eine Verbindung zum serialport hergestellt sobald man sein eigenes Programm öffnet. | ||
+ | |||
+ | Unter das ''End Sub'' vom ''Public Sub New()'' schreiben wir folgenden Code um den Joystick einzubinden: | ||
+ | <pre> | ||
+ | Private applicationDevice As Device = Nothing | ||
+ | Public Shared state As New JoystickState() | ||
+ | |||
+ | Public Function InitDirectInput() As Boolean 'wir erstellen eine Funktion die die Verbindung zum Joystick herstellt | ||
+ | |||
+ | |||
+ | dim instance As DeviceInstance | ||
+ | For Each instance In Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly) | ||
+ | applicationDevice = New Device(instance.InstanceGuid) | ||
+ | Exit For | ||
+ | Next instance | ||
+ | |||
+ | applicationDevice.SetDataFormat(DeviceDataFormat.Joystick) | ||
+ | applicationDevice.SetCooperativeLevel(Me, CooperativeLevelFlags.Exclusive Or CooperativeLevelFlags.Foreground) | ||
+ | Dim d As DeviceObjectInstance | ||
+ | For Each d In applicationDevice.Objects | ||
+ | If 0 <> (d.ObjectId And CInt(DeviceObjectTypeFlags.Axis)) Then | ||
+ | ' Set the range for the axis. | ||
+ | applicationDevice.Properties.SetRange(ParameterHow.ById, d.ObjectId, New InputRange(-10, +10)) 'hier kann man die Auflösung des Joysticks beliebig einstellen | ||
+ | End If | ||
+ | Next d | ||
+ | Return True | ||
+ | End Function 'InitDirectInput | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | Damit weiß unser Programm schonmal mit wem es zu tun hat. Jetzt schreiben wir noch ein Sub mit dem der Status des Joysticks abgefragt werden kann (einfach unter dem eben eingefügten Text einfügen): | ||
+ | |||
+ | <pre> | ||
+ | Public Sub GetData() | ||
+ | If Nothing Is applicationDevice Then | ||
+ | Return | ||
+ | End If | ||
+ | Try | ||
+ | applicationDevice.Poll() | ||
+ | Catch inputex As InputException | ||
+ | If TypeOf inputex Is NotAcquiredException Or TypeOf inputex Is InputLostException Then | ||
+ | Try | ||
+ | applicationDevice.Acquire() | ||
+ | Catch | ||
+ | Return | ||
+ | End Try | ||
+ | End If | ||
+ | End Try | ||
+ | Try | ||
+ | state = applicationDevice.CurrentJoystickState | ||
+ | Catch | ||
+ | Return | ||
+ | End Try | ||
+ | End Sub 'GetData | ||
+ | </pre> | ||
+ | |||
+ | Wir wollen unseren Joystick periodisch alle 100 ms abfragen, deswegen fügen wir unserem Programm jetzt einen Timer hinzu (''Tools -> Windows Forms -> Timer''). Bei den Eigenschaften des Timers stellt man "Enabled" auf ''True'', und den Intervall auf ''100ms''. Außerdem wollen wir uns die Joystickposition noch schriftlich anzeigen lassen, also fügen wir ein Label ein (''Tools -> Windows Forms -> Label''). | ||
+ | |||
+ | Im Design-Modus fügen wir außerdem jetzt noch einen Button hinzu (''Tools -> Windows Forms -> Button''). Wenn man auf den Button doppelt klickt kann man einstellen was passieren soll. Wir legen die Aktion ''InitDirectInput'' auf den Button. Sobald er geklickt wird, sucht unser Programm nach einem Joystick und stellt eine Verbindung zu ihm her. | ||
+ | |||
+ | Wir gehen zurück in den Designmodus und klicken doppelt auf den Timer. Der Timer soll folgenden Code ausführen: | ||
+ | <pre> | ||
+ | GetData() 'Joystick Position erfassen | ||
+ | label1.Text="Joystick: X = "+state.X.ToString()+" Y = "+state.Y.ToString() ' Anzeigen wo der Joystick grad ist | ||
+ | if serialport1.IsOpen then 'folgenden Code nur ausführen wenn auch eine Verbindung besteht | ||
+ | SerialPort1.Write(state.X) 'per RS232 die aktuelle Joystick X Position senden | ||
+ | serialPort1.Write(chr(13)) ' "Enter drücken" | ||
+ | SerialPort1.Write(state.Y) 'per RS232 die aktuelle Joystick Y Position senden | ||
+ | serialPort1.Write(chr(13)) ' "Enter drücken" | ||
+ | end if | ||
+ | </pre> | ||
+ | |||
+ | Jetzt ist unser Programm erstmal fertig und kann per Joystick mit dem RN-Control Board kommunizieren. | ||
+ | |||
+ | |||
== Beispielprogramm == | == Beispielprogramm == | ||
− | - | + | Ein Beispielprogramm kann hier herunter geladen werden: |
+ | [http://www.villalachouette.de/william/krims/JoystickTest.zip Joystick -> RS232 Test Programm] <br> | ||
+ | '''Ich übernehme keinerlei Haftung für Schäden oder Probleme die das Programm verursacht!''' <br> | ||
+ | Viel Spaß! | ||
+ | [[Kategorie:Microcontroller]] | ||
+ | [[Kategorie:Software]] | ||
+ | [[Kategorie:Grundlagen]] | ||
+ | [[Kategorie:Robotikeinstieg]] | ||
+ | [[Kategorie:Praxis]] | ||
+ | |||
+ | [[Kategorie:Quellcode Bascom]] |
Version vom 8. November 2007, 17:48 Uhr
Inhaltsverzeichnis
Was braucht man hierfür?
- RN-Control Board
- USB -> COM-port Adapter (wenn man keinen COM port mehr am PC hat)
- ISP Programmierkabel (wenn man nicht den Bootloader nutzt)
- PC
- USB-Joystick
- Netzgerät (+-12V)
- Evtl. 2 kleine Motörchem um das ganze zu testen
Einleitung
Ein Roboter (auf Basis eines RN-Control Boards) kann über einen am PC angeschlossenen Joystick sehr einfach kontrolliert werden. In diesem Beispiel benutzen wir SharpDevelop als Entwicklungsumgebung (SharpDevelop OpenSource Webseite) für eine Windows VB.Net Applikation (ein Computerprogramm). Die Positionsdaten des Joysticks werden schliesslich über die RS232 Schnittstelle an den µC übertragen. Auch wenn du totaler Programmierneuling sein solltest kann dir diese Anleitung helfen. Einfach den Code kopieren und wie beschrieben einfügen. Dann sollte dein RN-Control Board auf Joystick-Befehle hören. Es wird Directinput benutzt um den Joystick zu erkennen und abzufragen. Deswegen muss das .NET Framework installiert sein .NET Framework @ Microsoft. Die Kommunikation zwischen PC und µC findet - wie bereits erwähnt - über die RS232 Schnittstelle statt. Das Programm auf dem PC sendet alle 100 ms (oder schneller/ langsamer, je nach Wunsch) die aktuelle Joystick Position an den µC. Dieser liest die Werte für X und Y Achse ein und kann dann entsprechend darauf reagieren.
Beispielhafter Quellcode für BASCOM
In folgendem Beispiel wartet der µC ganz einfach darauf dass die Variablen X und Y nacheinander per RS232 an ihn gesendet werden. Sobald er Werte empfangen hat skaliert er die so wie er soll und gibt einen Ton entsprechend der Joystick Position aus. Sofort danach wartet er wieder darauf eine neue Joystick Position zu empfangen.
$regfile = "m32def.dat" $framesize = 32 $swstack = 32 $hwstack = 64 $crystal = 16000000 $baud = 9600 Dim X As Integer Dim Y As Integer Dim X1 As Word Dim X2 As Word Dim Y1 As Word Dim Y2 As Word Do 'Darauf warten dass irgendwas gesendet wird Input "" , X Input "" , Y 'Die Variablen umskalieren X1 = X + 20 X2 = X1 * 40 Y1 = Y + 20 Y2 = Y1 * 40 'Einen Ton (Tonhöhe = Joystick Position) ausgeben Sound Portd.7 , 10 , X2 Sound Portd.7 , 10 , Y2 Loop
Quellcode in VB.NET (SharpDevelop)
Da sich dieser Artikel wieder einmal an Anfänger richtet, gebe ich auch hier eine Schritt für Schritt Anleitung für SharpDevelop. Als erstes klickt man auf Datei -> Neu -> Projektmappe -> VBNet -> Windowsanwendungen -> Windows-Anwendung.
Nun muss man unserem Programm zwei Verweise zu DirectX und DirectInput hinzufügen. Dazu wählt man im Menü Projekt -> Referenz hinzufügen und fügt Microsoft.DirectX und Microsoft.DirectX.Directinput hinzu.Unter dem Code-Fenster klickt man auf "Design". Links bei den Tools klickt man auf "Components" und zieht dann den Serialport in sein Programmfenster. Rechts öffnen sich dann die Eigenschaften des Serialport1, hier gibt man den COM-Port etc ein. Falls die ganzen Daten nicht zur Hand sind kann man einfach die Daten seines (funktionierenden) Terminalprogramms übernehmen. Ich musste nur den richtigen COM Port auswählen, der Rest stimmte. Jetzt klickt man nochmal auf "Quellcode" um den Code des Programms zu bearbeiten. Ganz oben, als erste Befehle schreiben wir
Imports System Imports System.Windows.Forms Imports Microsoft.DirectX.DirectInput Imports Microsoft.DirectX
Damit erklären wir unserem Programm dass wir u.a. DirectX und Directinput benutzen wollen.
Unter die Zeile Me.InitializeComponent() schreibt man einfach serialport1.open. Dadurch wird eine Verbindung zum serialport hergestellt sobald man sein eigenes Programm öffnet.
Unter das End Sub vom Public Sub New() schreiben wir folgenden Code um den Joystick einzubinden:
Private applicationDevice As Device = Nothing Public Shared state As New JoystickState() Public Function InitDirectInput() As Boolean 'wir erstellen eine Funktion die die Verbindung zum Joystick herstellt dim instance As DeviceInstance For Each instance In Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly) applicationDevice = New Device(instance.InstanceGuid) Exit For Next instance applicationDevice.SetDataFormat(DeviceDataFormat.Joystick) applicationDevice.SetCooperativeLevel(Me, CooperativeLevelFlags.Exclusive Or CooperativeLevelFlags.Foreground) Dim d As DeviceObjectInstance For Each d In applicationDevice.Objects If 0 <> (d.ObjectId And CInt(DeviceObjectTypeFlags.Axis)) Then ' Set the range for the axis. applicationDevice.Properties.SetRange(ParameterHow.ById, d.ObjectId, New InputRange(-10, +10)) 'hier kann man die Auflösung des Joysticks beliebig einstellen End If Next d Return True End Function 'InitDirectInput
Damit weiß unser Programm schonmal mit wem es zu tun hat. Jetzt schreiben wir noch ein Sub mit dem der Status des Joysticks abgefragt werden kann (einfach unter dem eben eingefügten Text einfügen):
Public Sub GetData() If Nothing Is applicationDevice Then Return End If Try applicationDevice.Poll() Catch inputex As InputException If TypeOf inputex Is NotAcquiredException Or TypeOf inputex Is InputLostException Then Try applicationDevice.Acquire() Catch Return End Try End If End Try Try state = applicationDevice.CurrentJoystickState Catch Return End Try End Sub 'GetData
Wir wollen unseren Joystick periodisch alle 100 ms abfragen, deswegen fügen wir unserem Programm jetzt einen Timer hinzu (Tools -> Windows Forms -> Timer). Bei den Eigenschaften des Timers stellt man "Enabled" auf True, und den Intervall auf 100ms. Außerdem wollen wir uns die Joystickposition noch schriftlich anzeigen lassen, also fügen wir ein Label ein (Tools -> Windows Forms -> Label).
Im Design-Modus fügen wir außerdem jetzt noch einen Button hinzu (Tools -> Windows Forms -> Button). Wenn man auf den Button doppelt klickt kann man einstellen was passieren soll. Wir legen die Aktion InitDirectInput auf den Button. Sobald er geklickt wird, sucht unser Programm nach einem Joystick und stellt eine Verbindung zu ihm her.
Wir gehen zurück in den Designmodus und klicken doppelt auf den Timer. Der Timer soll folgenden Code ausführen:
GetData() 'Joystick Position erfassen label1.Text="Joystick: X = "+state.X.ToString()+" Y = "+state.Y.ToString() ' Anzeigen wo der Joystick grad ist if serialport1.IsOpen then 'folgenden Code nur ausführen wenn auch eine Verbindung besteht SerialPort1.Write(state.X) 'per RS232 die aktuelle Joystick X Position senden serialPort1.Write(chr(13)) ' "Enter drücken" SerialPort1.Write(state.Y) 'per RS232 die aktuelle Joystick Y Position senden serialPort1.Write(chr(13)) ' "Enter drücken" end if
Jetzt ist unser Programm erstmal fertig und kann per Joystick mit dem RN-Control Board kommunizieren.
Beispielprogramm
Ein Beispielprogramm kann hier herunter geladen werden:
Joystick -> RS232 Test Programm
Ich übernehme keinerlei Haftung für Schäden oder Probleme die das Programm verursacht!