PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Joystick + RN-Control



Torrentula
28.12.2010, 18:04
Dieser Artikel beschreibt, wie ich ein Windows Programm schreibe und dann mithilfe von BASCOM diese Daten dann weitervererbeite:

https://www.roboternetz.de/wissen/index.php/Joystick_am_PC_zur_Kontrolle_eines_Roboters

Nun habe ich eine Frage:

Mein Code sieht derzeit so aus:


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 16000000
$baud = 9600

Dim X As Integer

Config Portc = Output

Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portc.6 = 1
Portc.7 = 1

Do

'Darauf warten dass irgendwas gesendet wird
Input "" , X

'Joystick nach rechts

If X = 0 Then
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portc.6 = 1
Portc.7 = 1
End If

If X = 1 Then
Portc.3 = 0
Else
Portc.3 = 1
End If

For X = 1 To 2
Portc.3 = 0
Portc.2 = 0
Next X

For X = 1 To 3
Portc.3 = 0
Portc.2 = 0
Portc.1 = 0
Next X

For X = 1 To 4
Portc.3 = 0
Portc.2 = 0
Portc.1 = 0
Portc.0 = 0
Next X

'Joystick nach links

If X = 0 Then
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portc.6 = 1
Portc.7 = 1
End If

If X = -1 Then
Portc.4 = 0
Else
Portc.4 = 1
End If

For X = -1 To -2
Portc.4 = 0
Portc.5 = 0
Next X

For X = -1 To -3
Portc.4 = 0
Portc.5 = 0
Portc.6 = 0
Next X

For X = -1 To -4
Portc.4 = 0
Portc.5 = 0
Portc.6 = 0
Portc.7 = 0
Next X

Loop
End

Wenn ich nun mein Windows-Programm starte, leuchten die ersten 4 LED's, d.h. PORTC.0 bis PORTC.3 sind Low, obwohl eigentlich keine Daten gesendet werden.

Wenn dann die Positionsdaten des Joystick gesendet werden, tut sich nichts; die 4 LED's leuchten weiterhin.

Hat irgendjemand eine Idee was das Problem ist? Liegt es möglicherweise an den For-Schleifen?

Torrentula

Rage_Empire
28.12.2010, 18:54
Hallo,

wie sieht denn die Hardware aus?

TobiKa
28.12.2010, 19:40
For X = -1 To -4
Portc.4 = 0
Portc.5 = 0
Portc.6 = 0
Portc.7 = 0
Next X
Kann das so richtig sein?!

Torrentula
29.12.2010, 13:31
wie sieht denn die Hardware aus?

Ein USB-Joystick, einen USB-Serialadapter und das RN-Control (12 V Versorgungsspannung). Die Hardware und das Windows-Programm sind einwandfrei, es scheitert nur an dem eigenen BASIC-Programm, denn dieses Funktioniert:


$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




For X = -1 To -4
Portc.4 = 0
Portc.5 = 0
Portc.6 = 0
Portc.7 = 0
Next X

Kann das so richtig sein?!

Das ist doch die Frage die ich habe :D


Liegt es möglicherweise an den For-Schleifen?

BMS
29.12.2010, 13:49
Hallo,
die For-Schleifen sind da völlig fehl am Platz.
Ich vermute eher, dass du abhängig von der gesendeten Zahl die LEDs schalten möchstest, also bei "+1" eine LED, bei "+2" zwei LEDs usw. und für das negative wahrscheinlich entsprechend (nur in die andere Richtung).

Also auf gut Deutsch: große Auslenkung des Joysticks, viele LEDs an. Und das in beide Richtungen rechts/links. Liege ich da richtig?

Hab von Bascom zwar keine Ahnung (von Blitzplus, einem Basicdialekt aber schon, und C++), würde das so ähnlich lösen:


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 16000000
$baud = 9600

Dim X As Integer

Config Portc = Output

Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portc.6 = 1
Portc.7 = 1

Do

'Darauf warten dass irgendwas gesendet wird
Input "" , X


'Mittelstellung, aus
'-------------------

If X = 0 Then
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portc.6 = 1
Portc.7 = 1
End If


'Joystick nach rechts
'--------------------

If X > 0 Then
Portc.3 = 0
End If

If X > 1 Then
Portc.2 = 0
End If

If X > 2 Then
Portc.1 = 0
End If

If X > 3 Then
Portc.0 = 0
End If


'Joystick nach links
'-------------------

If X < 0 Then
Portc.4 = 0
End If

If X < -1 Then
Portc.5 = 0
End If

If X < -2 Then
Portc.6 = 0
End If

If X < -3 Then
Portc.7 = 0
End If

Loop
End

Hast dich mit dem "For" vielleicht am deutschen Sprachgebrauch zu sehr leiten lassen (Für X von -1 bis -4 mache dieses hier...), macht hier aber echt keinen Sinn.

Grüße,
Bernhard

Torrentula
29.12.2010, 13:54
Ich vermute eher, dass du abhängig von der gesendeten Zahl die LEDs schalten möchstest, also bei "+1" eine LED, bei "+2" zwei LEDs usw. und für das negative wahrscheinlich entsprechend (nur in die andere Richtung).

Also auf gut Deutsch: große Auslenkung des Joysticks, viele LEDs an. Und das in beide Richtungen rechts/links. Liege ich da richtig?

Du hasts erfasst! :D

Ich hatte vorher das Programm mit If gelöst aber da natürlich übersehen, dass die LED's IMMER dann leuchten wenn die Bedingung erfüllt ist. Denkfehler #-o

Vielen Dank

Torrentula

#Closed#

Thomas$
29.12.2010, 14:01
ich versteh nicht was der code machen soll
-1 to-4 step-1 ohne step -1 zählt der nur +1 und da wird das nie -4

wie gesagt wass soll das programm bei welcher joystickstelllung?

Torrentula
29.12.2010, 14:30
ich versteh nicht was der code machen soll

Wenn durch das Auswertungsprogramm des Computers dem RN-Control z.B. +2 übergeben wird, dann lässt der Code 2 LEDs auf der rechten Seite leuchten.

Das Auswertungsprogramm übergibt Zahlen im Wertebereich von -4 bis +4.
Die 8 LEDs auf dem RN-Control dienen als Anzeige. Die vier 4 LEDs rechts von der gedachten Mitte von +1 bis +4 und die anderen 4 LEDs links von der gedachten Mitte für den Bereich von -1 bis -4.

Eine positive Zahl bedeutet Aussteuerung des Joystick nach rechts, eine negative Aussteuerung nach links. Je weiter man den Stick in eine Richtung bewegt, desto größer/kleiner wird der übergebene Wert.


-1 to-4 step-1 ohne step -1 zählt der nur +1 und da wird das nie -4




If X < -3 Then
Portc.7 = 0
End If

WENN X kleiner als -3 ist (also: -4, -5, -6....), DANN soll die 4. linke LED leuchten.

Ich hoffe das ist verständlich :D

EDIT:

-1 to-4 step-1 ohne step -1 zählt der nur +1 und da wird das nie -4


#-o Achso du meinst das mit den For-Schleifen. Ja das funzt so nicht da hast du recht