| 
				
					|  | 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: 4710
 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: 1283
 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.
 
 |  |