|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
srsgp
Anmeldungsdatum: 30.01.2013 Beiträge: 15
|
Verfasst am: 13.03.2013, 08:18 Titel: Pfeiltastendrücke speichern |
|
|
Wer kann helfen?
Ich arbeite mit XP und einem älteren PC mit Druckerport.
Wie kann ich die Abfolge einer Handsteuerung speichern und anschließend auf Knopfdruck automatisch ablaufen lassen.
Zum besseren Verständnis eine einfache Steuerung per Hand.
Ich möchte 3 Leuchtdioden ( rot, gelb,grün ) durch Druck auf die Pfeiltasten wild durcheinander, einzeln für 2 Sekunden, aufleuchten lassen.
Nach 2 Sekunden geht die LED aus.
Die Handsteuerung funktioniert einwandfrei. Die Leuchtdioden leuchten
2 Sekunden.
Ich möchte nun dass die Abfolge meiner Tastendrücke, also z.B. Pfeil oben-5 mal, Pfeil unten-2 mal, Pfeil rechts-9 mal, Pfeil unten-11 mal, Pfeil rechts 4 mal, usw. aufgezeichnet wird und anschließend genauso, auf Knopfdruck, abläuft. Die von Hand eingegebene Abfolge der LEDs und deren Wiederholungen also eingelernt wird.
Auch mein Ausgabebildschirm hat den Fehler, dass nur 3 Zeilen erscheinen in denen die Anzahl der Tastendrücke für eine LED Farbe gezeigt werden, nicht aber die Reihenfolge der LEDs, die ja über 3 hinausgehen kann.
Mein Programm:
#Lang "fblite"
OPTION GOSUB
dim taste as STRING
DO
DO
DO
DO
taste=INKEY
IF taste=CHR(255,72) then GOTO rot
IF taste=CHR(255,80) then GOTO gelb
IF taste=CHR(255,77) then GOTO gruen
LOOP
rot:
OUT 888,1 ' rot an
LOCATE 10,2,0
PRINT"rot eingeschaltet"
LOCATE 10,40,0
r=r+1 ' Zähler wie oft rot gedrückt wird
Print r
SLEEP 2000
OUT 888,0 ' rot aus
LOOP
gelb:
OUT 888,2 'gelb an
LOCATE 12,2,0
PRINT"gelb eingeschaltet"
LOCATE 12,40,0
ge=ge+1 'Zähler wie oft gelb gedrückt wird
PRINT ge
SLEEP 2000
OUT 888,0 ' gelb aus
LOOP
gruen:
OUT 888,4 ' grün an
LOCATE 14,2,0
PRINT"gruen eingeschaltet"
LOCATE 14,40,0
gr=gr+1 ' Zähler für grün
PRINT gr
SLEEP 2000
OUT 888,0 ' grün aus
LOOP
Danke für eine einfache Lösung
Hier meine ursprüngliche Beschreibung des Projekts!
Das Programm ist unter porticula Nopaste handsteuerung 2 hochgeladen
Ich habe für den Technikuntericht eine durch 2 Schrittmotore gesteuerte Maschine gebaut, die eine ankommende Stahlkugel(Ware) über einen Sensor(LDR) erkennt.
Ein Kranarm wird auf einer halbkreisförmigen Bahn mittels Schrittmotorantrieb über die Stahlkugel bewegt. Nun senkt der
2. Schrittmotor über ein Schraubengewinde einen am Ende der Gewindestange befestigten E-Magneten(Spule) ab. Der E-Magnet wird eingeschaltet, die Stahlkugel angezogen und der 1. Schrittmotor bewegt den Arm wieder halbkreisförmig zurück. Der E-Magnet wird ausgeschaltet, die Kugel fällt in eine Rinne und rollt weg, die Maschine wartet auf die nächste Kugel. Funktioniert alles sehr genau. Ich habe zur Ansteuerung der Schrittmotoren ein Programm geschrieben das auch die Schritte zählt, habe eine Schrittzahl über den Daumen gepeilt, ausprobiert, verändert, bis es gestimmt hat.
Beim Teach-In Verfahren steuert man z.B. mit den Pfeiltasten den Arm nach rechts, Magnet hoch, um einem Hinderniss auszuweichen, weiter nach rechts, nun den Magnet runter zur Kugel und wieder zurück.
Die Handsteuerung war kein Problem, siehe Programm, wie aber speichere ich die einzelnen Bewegungen in der richtigen Reihenfolge, mit den notwendigen Schrittzahlen so dass am Ende des teach-in, das Programm den genau gleichen Weg(nicht den kürzesten) steuert.
Kann man die Werte in Felder ,automatisch in der richtigen Reihenfolge einlesen?
Da ich vom Programmieren, wie Ihr sicherlich seht, keine große Ahnung habe, wäre ich für eine einfache verständliche Lösung sehr dankbar.
Gruß SRSGP
Zuletzt bearbeitet von srsgp am 13.03.2013, 15:25, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4663 Wohnort: ~/
|
Verfasst am: 13.03.2013, 13:40 Titel: |
|
|
Ich bin zwar kein Moderator, antworte aber trotzdem einmal.
Du könntest ein Array anlegen und in diesem die Abfolge der Tastendrücke speichern. Um das dann anschließend ablaufen zu lassen, musst du nur das Array wieder von vorn nach hinten durchlaufen.
Ein Punkt, über den du dir in diesem Zusammenhang Gedanken machen musst, ist, wie groß dieses Array sein soll, also ob z. B. maximal 100 Schritte zugelassen sind oder ob du das Array später dynamisch erweiterst. Ich bleibe erst einmal bei der einfacheren Variante mit fester maximaler Schrittzahl. Die dynamische Variante kann man später dann immer noch einbauen.
Code: | DIM abfolge(1 to 100) AS STRING ' maximal 100 Schritte
DIM anzahlSchritte AS INTEGER
' ...
taste = INKEY
SELECT CASE taste
CASE CHR(255, 72)
anzahlSchritte = anzahlSchritte + 1
abfolge(anzahlSchritte) = taste
GOTO rot
' besser ist es aber, stattdessen hier den Programmcode von 'rot:' einzufügen!
CASE CHR(255, 75)
' usw.
END SELECT |
Um die gespeicherten Tasten wieder abzurufen, nimmst du einfach eine Schleife von i=1 bis anzahlSchritte und liest statt von der Tastatur taste=INKEY die Werte aus dem Array: taste=abfolge(i)
Das ist jetzt noch nicht die schönste mögliche Lösung, sollte aber als Denkanstoß reichen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
srsgp
Anmeldungsdatum: 30.01.2013 Beiträge: 15
|
Verfasst am: 14.03.2013, 15:17 Titel: Pfeiltastendrücke speichern |
|
|
Danke Nemored
für deine schnelle Hilfe.
Bin gerade am Ausprobieren. Melde mich wenn ich noch Fragen habe.
Gruß srsgp
nemored hat Folgendes geschrieben: | Ich bin zwar kein Moderator, antworte aber trotzdem einmal.
Du könntest ein Array anlegen und in diesem die Abfolge der Tastendrücke speichern. Um das dann anschließend ablaufen zu lassen, musst du nur das Array wieder von vorn nach hinten durchlaufen.
Ein Punkt, über den du dir in diesem Zusammenhang Gedanken machen musst, ist, wie groß dieses Array sein soll, also ob z. B. maximal 100 Schritte zugelassen sind oder ob du das Array später dynamisch erweiterst. Ich bleibe erst einmal bei der einfacheren Variante mit fester maximaler Schrittzahl. Die dynamische Variante kann man später dann immer noch einbauen.
Code: | DIM abfolge(1 to 100) AS STRING ' maximal 100 Schritte
DIM anzahlSchritte AS INTEGER
' ...
taste = INKEY
SELECT CASE taste
CASE CHR(255, 72)
anzahlSchritte = anzahlSchritte + 1
abfolge(anzahlSchritte) = taste
GOTO rot
' besser ist es aber, stattdessen hier den Programmcode von 'rot:' einzufügen!
CASE CHR(255, 75)
' usw.
END SELECT |
Um die gespeicherten Tasten wieder abzurufen, nimmst du einfach eine Schleife von i=1 bis anzahlSchritte und liest statt von der Tastatur taste=INKEY die Werte aus dem Array: taste=abfolge(i)
Das ist jetzt noch nicht die schönste mögliche Lösung, sollte aber als Denkanstoß reichen. |
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1243 Wohnort: Ruhrpott
|
Verfasst am: 05.04.2013, 11:57 Titel: |
|
|
Hallo srsgp,
ich hoffe, daß du deinen Rechner noch nicht mit dem Vorschlaghammer bearbeitet hast, weil er sich standhaft weigert, irgendwelche Signale auf dem Parallelport auszugeben. Das ist nämlich seit XP nicht mehr so ohne weiteres möglich. Siehe hierzu
http://forum.qbasic.at/viewtopic.php?t=6197
Bei Teach-in-Anwendungen ist es sinnvoller, die Ablaufsequenz statt in einem Array in einer Datei zu speichern, und zwar nach Möglichkeit so, daß sie sich danach in einem Texteditor lesen und ggf. bearbeiten lässt, damit man nicht wegen jedes "Vertippers" die ganze Sequenz von vorne eingeben muß.
Ich habe mir einmal den Spaß gemacht, dein Beispielprogramm in modernes freeBasic umzuschreiben, insbesodere die abenteuerlich verschachtelten DO-Schleifen habe ich durch eine SELECT CASE-Struktur ersetzt. Es ist etwas spärlich kommentiert, aber ich hoffe, du steigst trotzdem durch. Es muß mit dem Parameter console kompiliert werden und setzt ein installiertes inpout32.dll voraus.
Die Ausgabe am Parallelport habe ich nicht kontrolliert, sie müsste aber eigentlich funktionieren.
Hier nun das Programm:
Code: |
Dim parallelport As Any Ptr
Dim Shared OUT32 As Sub (Adresse As integer, Wert As Integer)
Dim Shared INP32 As Function (Adresse As Integer ) As Integer
parallelport = DylibLoad("inpout32.dll") 'treiber laden
If parallelport Then 'neue befehle deklarieren
Out32 = DylibSymbol(parallelport, "Out32") 'byte ausgeben
Inp32 = DylibSymbol(parallelport, "Inp32") 'byte einlesen
Else 'fehler
Print "INPOUT32.dll nicht gefunden."
Sleep
End
EndIf
Declare Sub ausgabe(led As String)
Declare Sub aufzeichnen(led As String)
Dim Shared As Integer port
Dim As String taste, led
Dim Shared As String datei
port = 888
datei = ExePath + "\sequenz.txt"
Do
taste = InKey
Select Case taste
Case Chr(255,72) 'rot
led = "rot"
aufzeichnen(led)
Case Chr(255,80) 'gelb
led = "gelb"
aufzeichnen(led)
Case Chr(255,77) 'grün
led = "gruen"
aufzeichnen(led)
Case "n" 'neue datei
Kill(datei) 'löscht die bisherige Aufzeichnung, die Datei wird beim nächsten Druck auf
' eine Pfeiltaste neu angelegt
Cls
Case "d" 'datei ausführen
Cls
Open datei For Input As #1
Do 'führt die bislang aufgezeichnete Sequenz aus
Line Input #1,led
ausgabe(led)
Loop Until Eof(1)
Close #1
Case Chr(27) 'Esc
End 'Programm beenden
End Select
taste = ""
Loop
Sub aufzeichnen(led As String) 'hängt den nächsten Befehl an die Sequenzdatei an
Open datei For Append As #1
Print #1,led
Close #1
ausgabe(led)
End Sub
Sub ausgabe(led As String)
Dim As Integer zeile, spalte, farbe
Print led
zeile = CsrLin
spalte = Pos()
farbe = Color
Select Case led
Case "rot"
Locate 25,20,0
Color 0,12 'hellroter Hintergrund
OUT32(port,1)
Case "gelb"
Locate 25,21,0
Color 0,14 'gelber Hintergrund
OUT32(port,2)
Case "gruen"
Locate 25,22,0
Color 0,10 'hellgrüner Hintergrund
OUT32(port,4)
End Select
Print " "; 'LED auf dem Bildschirm simulieren
Sleep 2000,1
OUT32(port,0) 'LED ausschalten
Color LoWord(farbe),HiWord(farbe) 'alte Farbe wiederherstellen
Locate 25,20,0
Print " "; 'simulierte LED löschen
Locate zeile, spalte 'Cursor an die alte Position zurücksetzen
End Sub
|
Viel Spaß damit
grindstone |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|