Seite 1 von 2

Externer Schalter soll zählen

Verfasst: 14.06.2006 16:04
von Ironsmurf
Hallo zusammen

Ich habe mir ein elektrisches CD-Regal gekauft, das über eine Relais-Karte angesteuert wird, das funktioniert auch tadellos, nun möchte ich aber die Position jeder einzelnen CD ermitteln.
Folgende Gedanken habe ich mir bis jetzt gemacht.

Ein angebrachter Schalter löst einen Kontakt aus wenn die CD vorbei fährt,
Die Variable Rack01 zählt 1 + 1 = 2 / usw.
wenn jetzt die CD YXZ Nr 99 gesucht wird, muss das CD-Regal nur solange weiterfahren bis der Zähler auf 99 steht und die Relais-Karte schaltet das Rack wieder aus. Position erreicht CD kann entnommen werden.
In der Theorie ganz OK, aber wie kann ich günstig externe Schalter abfragen ohne gleich ein Interface kaufen zu müssen, der Gedanke einen Joystick abzufragen lag nach lesen des Forums auf der Hand, meine Soundkarte hat auch noch solch einen Anschluß. Die Frage wieviele Schalter lassen sich auf diese Weise abfragen, ich benötige ca 20 solcher Abfragen, allerdings brauche ich nur die Werte Null oder Eins.

Vielen Dank im voraus für eure Mühle

Verfasst: 14.06.2006 17:25
von Kekskiller
Also ich als Elektronik-Anti-Experte würde sagen, dass du doch eigentlich nur jede Leitung des Schalters zu einer Bitreihe zusammenfassen brauchst. Jeder Schalter hat dann ein Bit, also kannst du dann z.b. über nen Parallelen Port das ganze als Bit-Reihe einlesen. Nur hab ich grad irgendwie nicht wirklich im Kopf, ob da 20 Bits auf den Port passen.

Verfasst: 14.06.2006 18:34
von Falko
Theoretisch könntest du 7 Minikontaktschalter unterbringen, die dann über der jeweiligen Bitstellung über Schaltnocken an den einzelnen CD-Fächern geschaltet werden. Damit kanns du max. 127 Fächer festlegen.
Das achte Bit müsstest du für die Relaisekarte haben um dann mittels Optokopplers parallel zum Handtaster den Antrieb im CD-Regal anzusteuern.
Somit könnte man ohne logische Schaltung direkt an LPT dieses erledigen.
Für die Schalterspannungen der 7 Schalter könntest du z.B. die 5V Steuerspannung aus den USB, aber auch direkt aus der LPT entnehmen.
Damit meine ich, 8 Datenleitungen für die 7 Schalter und einen für die Motoransteuerung und ein Signal für die Stromversorgung, z.B. aus dem
Controllregister.

Man könnte aber auf der Antriebswelle z.b. einen Nocken befestigen, und dort in der Nähe 2 Schalter anbringen. Der PC könnte dann die jeweiligen Impulse der Schalter zählen lassen, wenn sich jeweils ein Fach in der betreffenden Postion befindet. Damit das ganze nicht relativ irgendwo ausgewertet wird, müsste man noch einen 3. Schalter anbringen und am 1. Fach den passenden Schaltnocken anbringen. Somit lässt sich das CD-Fach auf das erste Fach fahren und gleichzeitig nullen, wenn dieser Schalter abgefragt wird. Übrigens die zwei Schalter für die Motorwelle aus dem Grund, damit man in beiden Richtungen verfahren und dieses vom PC ermitteln kann.
Bleibt dann nur noch die Ansteuerung deiner Relaiskarte übrig, was
soweit ich weis, mit dem Joystickport nicht möglich ist. Denn dieser ist nur für das Empfangen für digitale als auch analoge Signale zuständig.

Also wenn man das Steuern will sollte man schon auf LPT gehen oder aber
mittels Schieberegister RS232 nutzen.

Natürlich geht das auch mit zusätzlichen Logikbausteinen :) .

MfG Falko

Verfasst: 14.06.2006 18:52
von Ironsmurf
Die Relaiskarte ist schon da und ich brauche wirklich nur die Abfrage eines Tasters, da ich nicht so technisch begabt bin, wollte ich es mir einfach machen, der Taster löst den Impuls aus, den wiederum das Programm in einer Variablen mitzählt, wenn die Variable den Wert 99 hat, wird sie auf null zurück gesetzt, auch soll der Ständer nur in einer richtung fahren können und vor bendigung des Programmes eine Null Stellung ein nehmen, eben Position Null

Verfasst: 14.06.2006 19:05
von sharkpeter
Ähm, Kopfkratz.

Ich nehme meine CD noch mit der Hand aus dem Rack. :oops: Bin ich schon alt?

Aber im Ernst:

Stell doch mal ein Foto ein, damit man sich das vorstellen kann.

Ansonsten hat Falko ja schon jede Menge geschrieben. Ich würde es auch so
machen, das ich die Fächer codieren und das dann entsprechend weiterleiten
würde.

Gruß Jens

Verfasst: 14.06.2006 19:36
von Kekskiller
Da fällt mir doch glatt ein, dass man ja die Sache mit den Nummer der Schalter auch wie mit der Portbelegung innerhalb des PCs erledigne kann... Also schon mit Binärcode-Speicher und Daten übertragen.

Aber egal, is mit Sicherheit vollkommen am Thema vorbei.

Verfasst: 14.06.2006 20:23
von Falko
Wieso am Thema vorbei?

Man kann doch die DATENLEITUNGEN prüfen ob sie gesetzt oder nicht gesetzt sind, welches die 7 Schalter entweder auf An bzw. Aus schalten.

Ob Binär oder Dezimal abgefragt wird, ist egal. Der PC versteht intern sowieso nur Binärcodes.

Aussehen täten diese 7 Schalterstellungen wie folgt.

Code: Alles auswählen

For i=1 To 99
 Debug Str(i)+" : " + RSet(Bin(i),7,"0")
Next i
Eigendlich sehr simpel.

Und mit der IO32.DLL lässt sich das 8Bit des Datenregisters direkt setzen bzw. löschen, das dann den Motor über die Relaiskarte schalten soll. Die anderen Datenbits vom Datenregisters werden währenddessen nur abgefragt, welchen Zustand sie haben. Das kann man mittels Bin oder aber auch direkt dezimal machen.

Aber wie Jens schon sagte, wie sieht sowas aus und wie wird die Relaise-Karte gesteuert? Damit meine ich, ob ein Auf/Ab-Schalter manuell den Antrieb steuert, bis man das entsprechende Fach anhält, oder man nur kurz wie ein Taster tippt so das Fach automatsich in die nächste Position fährt. Eine Beschreibung von dem elektronischen CD-Rack wäre interessant zu sehen, wie er im Handbetrieb läuft ;)

MfG Falko

Verfasst: 15.06.2006 08:59
von Ironsmurf
Ich versuche es noch neu zu formulieren, also ich habe eine externe Relaiskarte von AK-Modul Bus Computer Gmbh, die Serial gesteuert wird.
Die Karte ist fertig aufgebaut und sofort einsatzbereit. Die Software wird über eine Batch automatisch geladen und bleibt im Hintergrund stehen.
Dank Kiffi habe ich einen Einzeiler in mein Programm integrieren können, so das sie direkt über PureBasic gesteuert werden kann.

Code: Alles auswählen

RunProgram ("SETRelay", "/device:InterfaceA /off:1", "", 2) : Delay (500)
RunProgram ("SETRelay", "/device:InterfaceA /off:2", "", 2) : Delay (500)
RunProgram ("SETRelay", "/device:InterfaceA /off:3", "", 2) : Delay (500)
RunProgram ("SETRelay", "/device:InterfaceA /off:4", "", 2) : Delay (500)
RunProgram ("SETRelay", "/device:InterfaceA /off:5", "", 2) : Delay (500)
RunProgram ("SETRelay", "/device:InterfaceA /off:6", "", 2) : Delay (500)
RunProgram ("SETRelay", "/device:InterfaceA /off:7", "", 2) : Delay (500)
RunProgram ("SETRelay", "/device:InterfaceA /off:8", "", 2) : Delay (500)

Gebe ich also in mein Konsolen Programm ein
"Lampe1" geht meine Schreibtischlampe an.
Suche ich einen Film gebe ich den Suchbegriff ein - Ergebnis ist
"00000  *  XYZ Film"
wird geprüft ob die USB Festplatte an ist oder nicht.

;PLAY / XYZ Film
If String ("00000") And RE6 = 1 : RunProgram ("T:\XYZ Film.avi") : EndIf
If String ("00000") And RE6 = 0 : RunProgram ("SETRelay", "/device:InterfaceA /on:6", "", 2)
Gosub startmovie : RunProgram ("T:\XYZ Film.avi") : RE6 = 1 : EndIf
startmovie:
PrintN ("")
ConsoleColor (15,0)
Print_s("Festplatte wird gestartet - Dies wird einige Sekunden dauern")
Delay (5000)
PrintN("")
Print_s ("Der Film wird nun gestartet - Viel Vergnügen ! ! !")
Delay (5000)
Return

Ist RE6 = 0 dann Relais startet Stromversorgung, Platte initialisiert sich, dauert max. 10 Sekunden bei 300 GB und Filmdatei startet Player dazu.

Ist RE6 = 1 dann starte Film gleich, weil die Platte bereits an ist.
Die Platte ist sortenrein heißt ( nur Filme drauf ) so erscheinen keine weiternen Menüs von Windows.
Alle Filme habe ich in CD-Hüllen archiviert und mir diesen Ständer bei PEARL gekauft Artikel Nr. PE3060
Er wird über ein Netzteil mit Strom versorgt und hat einen Drehschalter für beide Laufrichtungen.
Der Gedanke ist nun anahnd eines Zahlencodes den Film nicht nur auf dem
Rechner zu starten, sondern auch gleich passend dazu die richtige DVD zu bekommen, sprich das Regal wird über Relais eingeschaltet und fährt in die richtige Postion und AHA die DVD steht oben und kann entnommen werden

PS: Warum alles mit Relaiskarte, damit alle Verbraucher vom Netz genommen werden kommen, somit auch keine Stand-By Verbraucher mehr. Der CLOSE Befehl in meinem Programm nimmt alle Verbraucher direkt vom Netz ( alle Moni´s, alle USB-Platten usw. ), im Moment leider nur 8, aber die Karte ist Kaskadierungsfähig, so das einem weiternen Ausbau nichts im Wege steht.
Ich habe die Karte in einer Kiste eingebaut, diese ist mit 10 Steckdosen bestückt, 8 für die Relais, 1 für die Stromversorgung der Relaiskarte und 1 als Reserve, wenn mal eine zusätzliche Steckdose gebraucht wird, hat sich auch schon als nützlich erwiesen.

Danke für Zeit

Verfasst: 15.06.2006 17:58
von Falko
Eine Frage habe ich noch dazu. Zeigen Blinken die LED's so wie die DVD's
z.B. oben an einer bestimmten Stellung vorbei sausen?

Wenn ja, hast du quasi schon einen Geber für den Joystick, wobei man
dort ein kleines Relais benutzen kann, welches den Kontakt für den
Joystick abgibt.

Mit zwei Relaise, könntest du dann die Drehrichtung bestimmen und anhand der LEDs (Wenn eine DVD vorbeirauscht) die Position per PC hoch
oder runterzählen.

Eine weitere Frage habe ich noch zu deinem Runprogramm in PB. Ist bei
dem Programm zu deiner Relaiskarte keine DLL dabei? Dann könnte man
das evt. direkt ohne Umwege über PB steuern, ohne ein zweites
Programm starten und diesem Parameter übergen zu müssen.




Gruß Falko

Verfasst: 16.06.2006 08:47
von Ironsmurf
Die Zeile mit RunProgram schaltet das Relais über eine Batch, so war es gedacht, die reichliche software der Relaiskarte hat verschiedene Möglichkeiten, auch für Programmiersprachen, die genialste davon ist eben eine Batch zu scheiben, somit kann man die Karte von jeder Programmiersprache aus anstreuern.
Durch einen Zufall habe ich entdeckt, das die Batch garnicht gebraucht wird, das heißt der Treiber der Karte schaltet dank des Einzeilers von Kiffi die Relais auch ohne Batch.