Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Pfeiltastendrücke speichern

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
srsgp



Anmeldungsdatum: 30.01.2013
Beiträge: 15

BeitragVerfasst am: 13.03.2013, 08:18    Titel: Pfeiltastendrücke speichern Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 13.03.2013, 13:40    Titel: Antworten mit Zitat

Ich bin zwar kein Moderator, antworte aber trotzdem einmal. happy

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
Benutzer-Profile anzeigen Private Nachricht senden
srsgp



Anmeldungsdatum: 30.01.2013
Beiträge: 15

BeitragVerfasst am: 14.03.2013, 15:17    Titel: Pfeiltastendrücke speichern Antworten mit Zitat

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. happy

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.
Zitat:
Code:
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 05.04.2013, 11:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz