Entwickler-Ecke

Sonstiges (Delphi) - PC mit Elektromotor verbinden


01Detlef - Mi 07.08.02 17:43
Titel: PC mit Elektromotor verbinden
hi,
vielleicht hat einer ne idee oder kann mir sagen, wo ich darüber etwas finden kann?

Also ich programmiere mit Delphi und habe einen kleinen Elektromotor gebastelt, dazu möchte ich jetzt ein Programm schreiben, um den Motor an -bzw. auszuschalten.
Doch ich habe eine Frage und zwar, wie muss denn die procedure aussehen, der Rechner muss doch wissen wohin das Signal soll????

Vielleicht hat noch einer Ahnung wie ich das einrichten kann, also den PC mit dem Motor verbinden??(über den Druckerport, habe ich gehört und, wenn ja, wie geht das?)

Detlef


Ex0rzist - Mi 07.08.02 18:13

Hallo 01Detlef,

da hast du dir ja einiges vorgenommen.
Ich bin absolut kein Spezialist auf dem Gebiet, aber wie ich gehört habe, muss man erstmal einen Treiber für das Gerät schreiben. Das soll schonmal unter Delphi gar nicht bzw. nur über Umwege (Assembler) möglich sein.
Wenn du deinen Treiber hast, dann benutzt du dessen Prozeduren, um dein Gerät zu kontrollieren.
Sorry, aber um das zu bewerkstelligen, muss man schon sehr tief in die Materie eintauchen.

Schau mal in den Thread hier [http://www.auq.de/viewtopic.php?t=1218]

Gruß,
Ex0rzist

P.S.: Falls du es doch hinbekommen solltest, kannst du es ja dann hier posten.


Klabautermann - Mi 07.08.02 18:34

Hallo,

ich bin zwar auch kein Hardware bastler halte den Aufwand aber für etwas geringer als Ex0rzist.

Einen Treiber wirdst du dir nicht schreiben müssen, denn du musst ja nur Daten auf einen Port legen für den es schon Treiber gibt.
Welcher Port der geeignetste ist und wie den Anschluss baust kann ich dir auch nicht sagen.

Gruß
Klabautermann


Ex0rzist - Mi 07.08.02 18:40

Klabautermann hat folgendes geschrieben:
Einen Treiber wirdst du dir nicht schreiben müssen, denn du musst ja nur Daten auf einen Port legen für den es schon Treiber gibt


Aber wie ist das zum Beispiel mit Druckern? Der Druckerport hat ja auch schon Treiber, aber trotzdem muss man für den Drucker spezielle Treiber installieren. Oder irre ich mich? :?:

Gruß,
Ex0rzist


t-ob-i - Mi 07.08.02 18:59

Zitat:
Aber wie ist das zum Beispiel mit Druckern? Der Druckerport hat ja auch schon Treiber, aber trotzdem muss man für den Drucker spezielle Treiber installieren. Oder irre ich mich?


Ja aber dieser Treiber dient dazu das die Dokumente in der richtigen Sprache an den Drucker geben werden. Schließlich muss er initialisierungs Befehle etc. verstehen und da es keine einhaltliche Kommunikation halt die Treiber. Genauso kannst dich dich aber auch zum Druckerport connecten und auf ihm schreiben. So sollte der Drucker dein geschreibsel ausgeben. Ganz ohne Treiber :D

Also für deinen Motorproblem würde ich persönlich den Nullmodemport und ein Relai nehmen. Wenn der Motor aber schon auf 9V läuft kannst du ihn auch direkt an das Kabel anklemmen. Ansonten schaltet sich das Relai in selbsterhaltung sobalt ein Signal ankommt und der Motor läuft. Kommt dagegen auf einem anderen Kabel ein Signal hebt ein anderes Relai die Selbsterhaltung wieder auf.

Ein Nullmodemkabel besteht im übrigen aus 9 verschiedenen Kabel. Für Signale sollte das bei einem Motor ausreichen.

Tobias


Ex0rzist - Mi 07.08.02 19:10

Oh, so ist das also.

Naja, ich hatte ja schon vorgwarnt, dass ich nicht so´n Hardwarespezi bin. :wink:

Gruß,
Ex0rzist


Henry - Mi 07.08.02 19:18

Hi

Mit dem direkten anschliessen eines Relais an eine PC-Schnittstelle wäre ich vorsichtig, denn beim abschalten der Relaisspule wird eine hohe Spannung induziert die Dir den Port zerschießen könnte.

Mein Tip:
Trenn die Spule galvanisch vom port (z.B. mit Optokoppler oder Transistor)
und eine Freilaufdiode ist dabei auch noch wichtig.


t-ob-i - Mi 07.08.02 20:29

Zitat:
Mit dem direkten anschliessen eines Relais an eine PC-Schnittstelle wäre ich vorsichtig, denn beim abschalten der Relaisspule wird eine hohe Spannung induziert die Dir den Port zerschießen könnte.


Das musst du mir einmal erklären. Ich habe doch nur die angelegte Spannung von 9V? Die Spannung die durch die Feldlinien der Spule erzeugt wird ist doch dabei nicht von Bedeutung!

Tobias


matze - Mi 07.08.02 20:32

Also ich hab jetzt nicht genau die Daten des Seriellen Ports im Kopf... aber ich würe mal sagen du solltst dir auf alle Fälle mal ausrechnen, was du für Vorwiderstand brauchst, denn wenn das releais ne zu hohe strosäre erzeugt und dir dann mal so 1A übers Motherboard laufen, dann ist das nicht wirklich der Hit.

Ich würde mir so eine Art Switchpack bauen. Also über die serielle Schnittstelle ein Releais oder eine Triag ansteuern.

Am besten du quälst mal Google.


Henry - Mi 07.08.02 20:43

Zitat:
Das musst du mir einmal erklären. Ich habe doch nur die angelegte Spannung von 9V? Die Spannung die durch die Feldlinien der Spule erzeugt wird ist doch dabei nicht von Bedeutung!


Wenn Du an die Relaisspule deine 9V legst, dann wird ein Magnetfeld erzeugt. Wenn Du die 9V wieder wegnimmst, dann bricht das Magnetfeld wieder zusammen. Dabei wird durch die durcheinanderfallenden elektronen im Eisenkern eine Spannug in der Spule induziert. Diese spannung ist wesendlich höher als die angelegte. Diese kann dir deinen Port zerstören.
Eine Freilaufdiode müßte das auch schon verhindern, aber ich denke es ist sicherer noch einen Optokoppler zu verwenden (Freilaufdiode trotzdem erforderlich), denn ein optokoppler ist günstigere als ein neues MotherBoard :-)

Hoffe es war einigermaßen verständlich


t-ob-i - Mi 07.08.02 20:48

Zitat:
Wenn Du an die Relaisspule deine 9V legst, dann wird ein Magnetfeld erzeugt. Wenn Du die 9V wieder wegnimmst, dann bricht das Magnetfeld wieder zusammen. Dabei wird durch die durcheinanderfallenden elektronen im Eisenkern eine Spannug in der Spule induziert. Diese spannung ist wesendlich höher als die angelegte. Diese kann dir deinen Port zerstoren.


Natürlich war es verständlich. Nur hätte ich nicht gedacht das die Feldspulenänderung eine solch hohe Wirkung hat.

Tobias


matze - Mi 07.08.02 20:50

Henry hat folgendes geschrieben:
Wenn Du an die Relaisspule deine 9V legst, dann wird ein Magnetfeld erzeugt. Wenn Du die 9V wieder wegnimmst, dann bricht das Magnetfeld wieder zusammen. Dabei wird durch die durcheinanderfallenden elektronen im Eisenkern eine Spannug in der Spule induziert. Diese spannung ist wesendlich höher als die angelegte. Diese kann dir deinen Port zerstören.
Eine Freilaufdiode müßte das auch schon verhindern, aber ich denke es ist sicherer noch einen Optokoppler zu verwenden (Freilaufdiode trotzdem erforderlich), denn ein optokoppler ist günstigere als ein neues MotherBoard :-)Hoffe es war einigermaßen verständlich


Das denke ich nicht !!! Denn wenn du die Spannung wegnimmts wird sich der Anker weiterdrehen, der wirkt dann wie ein generator entgegen der normalen stromrichtung (energieerhaltungssatz !! sonst hättest du ein Perpetuummobile). Dieser induzierte neue Strom ist garantiert nicht so hoch, dass er deinen Port schrottet !!!

Achja: Der Serielle Port hat folgende Daten: ein HI Signal hat +5V mit 20mA damit scheidet schonmal aus den Motor direkt an die schnittstelle zu hängen !!!


Henry - Mi 07.08.02 20:52

Halbleiter sind manchmal etwas empfindlich :-))
Kann natürlich auch sein, das es eine weile gut geht. Aber früher oder später denke ich das es schief geht.


Henry - Mi 07.08.02 21:01

Hi matze

Wenn Du nochmal liest was ich geschrieben habe, dann wir Dir auffallen, das da die Rede von einer Relaisspule war.
Und da dreht sich sicher kein Anker weiter. Oder? :-)
Denn ich denke es ist klar, das ein Motor nicht direkt an die Schnittstelle angeschlossen werden kann.
Weiter oben war nämlich schon die Rede von einem Relais
(Post von t-ob-i)


matze - Mi 07.08.02 21:03

uuuuups.... da hast du natürlich recht !!! :oops:


Henry - Mi 07.08.02 21:07

Kein Problem :lol:

Wir wollen doch alle versuchen zu helfen.


Renegade - Mi 07.08.02 21:11

Moin erstmal.

Also: Vorweg gesagt das ist nicht so 100% mein Thema!

Aber ich kann folgendes dazu sagen: Wir haben vor Jahren im Rahmen eines Projektes in der Schule eine Disko-Lichtanlage gebaut. Wir haben über Relais, denen eine Diode (Leuchtdiode) vorgeschaltet war 500 Watt Hallo's angesteuert. Angeschlossen wurde die ganze Sache an dem Parallel-Port. Das funzte noch bei meinem Schulabschluß (wie gesagt - Jahre her). Die Software dazu habe ich damals in TurboBasic geschrieben. Das war unter DOS und daher kein großer Aufhänger.

Naja, wie das unter Delphi zu proggen ist, weiß ich leider nicht (noch nicht) :cry: - aber Hardwaretechnisch sollte das kein Problem sein :) (obwohl ich keine Garantien geben kann :evil: ).

Gruß


Cashels - Mi 07.08.02 21:35

Hi Detlef,

mal ne Frage zu deinem Motor.Was hat denn der für eine Leistungsaufnahme. Wenn du über die serielle Schnittstelle deinen Motor direkt anschliesst, bis du auf 5V und 20mA begrenzt.

Die Lösung mit dem Relais ist sicherlich am sichersten. Nur wirst du den Relais alleine mit den 20mA der seriellen Schnittstelle nicht schalten können. Du kommst also um ne Lösung mit Optokoppler wahrscheinlich nicht drumrum.

Gruss,
Tom


01Detlef - Do 08.08.02 16:14

Hallo,
das reicht schon mit 5Volt und 20mA, aber mein viel größeres Problem liegt darin, diesen Druckerport zu benutzen!
Ich muss ja Befehle wissen, damit auf Buttonklick die Signale ankommen, also, wie bekomme ich das mit dem Druckerport hin?
Kennt dazu jemand ein gutes Tutorial?

Der Motor ist völlig "nutzlos" ich möchte erstmal ausprobieren, wenn es erfolgreich ist, optimiere ich noch alles, aber zum Anfang!!!!

Also mein größtest Problem ist diese Sache mit dem Benutzen des Druckerports, davon habe ich noch keine Ahnung!!

Danke Detlef


Henry - Do 08.08.02 16:53

Hi

Schau mal hier [http://www.b-kainka.de/download.htm] vorbei.
Das ist die Seite von einem Buchautor (Burkhard Kainka) der hat da eine DLL (RSAPI.dll) die ist glaube ich zum ansteuern der Schnittstellen. Ich weis nicht ob die jetz auch für den Druckerport ist, abe die RS232 müsste damit ansteuerbar sein.

Ansonsten kann ich das Buch (vom oben genannten Autor) empfehlen

"PC-Schnittstellen unter Windows"
ISBN 3-89576-086-2
hat mal ca. 79 DM gekostet (in Euro weiß ich jetz nich)

Darin ist auch ne DLL zur ansteuerung sämtlicher Schnittstellen
Allerdings (glaube ich) nicht unter NT.
Is aber ein super Buch

Ich hoffe das hilft.


zero - Fr 09.08.02 07:40

was seit ihr doch alles für grobmotiriker :wink: wieso denn gleich relais ?? ich würde erstmal transistoren benutzen und wenn es DANN um höhere volt/ampere zahlen geht mal nen relai dahinter setzen...

naja wie auch immer jedenfalls würde ich den drückerport nehmen da hast du 8 datenleitungen die du an/aus setzen kannst.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
{$IFDEF Win32}
FUNCTION PortIn(Addr: WORD): BYTE; Assembler; StdCall;
  ASM
    mov dx, Addr // Adresse ins DX-Register schreiben
    in al, dx    // Port lesen. (AL entspricht Result)  
  END;
{$ELSE}
FUNCTION PortIn(Addr: WORD): BYTE;
BEGIN
  Portin := Port[Addr];
END;
{$ENDIF}

{$IFDEF Win32}
PROCEDURE PortOut(Addr: Word; Data: Byte); Assembler; StdCall;
  ASM
    mov dx, Addr    // Adresse nach DX
    mov al, Data    // Datenbyte nach AL
    out dx, al      // Port schreiben
  END;
{$ELSE}
PROCEDURE PortOut(Addr: WORD; Data: BYTE);
BEGIN
  Port[Addr] := Data;
END;
{$ENDIF}


de code hier sollte dir unter delphi die portsteuerung ermöglichen, leider nur unter 95,98,ME vür NT systeme bräuchtest du dann doch eine kleinen "treiber" da da nix ist mit direktem portzugirff :(

naja jedenfalls könntest du


Quelltext
1:
PortOut($378,256);                    


dann sind glaube ich alle 8 datenleitungen aktiv, war mir doch so ist schon etwas länger her als ich sowas gemacht habe :)

1
2
4
8
16
32
64
128
256

hmm ja was gibts dazu noch zu sagen eigentlich nichts weiter :) hoffe das hilft dir etwas :)


Cashels - Fr 09.08.02 08:35

Hallo,

was die Port Ansteuerung angeht, hatt ich mal ne Freeware Komponente, die angeblich auch unter NT läuft. Ich kann dir die gerne mailen bei Bedarf.

@zero:
Zur Sache mit dem Relais hab ich aber jetzt auch noch ne grundsätzliche Frage. Denn wie willst du ausser mit einem Relais schalten können, wenn dir die Leistung am Port nicht ausreicht. Da muss doch dann ein stärkerer Stromkreis (sprich äußere Spannungsquelle) ins Spiel, oder?

Gruss,
Tom


MathiasH - Fr 09.08.02 13:23

die dann wohl über einen Transistor, einen Optokoppler oder ähnliches laufen müsste, wofür du in jedem Fall einen Zweiten Stromkreis brauchst, den du aber vielleicht dem Rechner Netzteil klauen könntest :wink:

Ich mach das lieber über meine IO-Karte (st-Pio-48) :wink: , durch die Active-x-controls so schön einfach zu steuern, aber im Moment binn ich noch am basteln, wie ich Geschwindigkeit und Richtung ändern kann, vielleicht doch ein Schrittmotor(mist zu langsam) :wink:

MathiasH


01Detlef - Fr 09.08.02 18:59

Danke für die Antworten, es hat mir schon einiges klarer gemacht, aber das mit dem Quelltext, um den Port zu steuern, verstehe ich nicht.Auf welches Ereignis reagiert denn das Programm und liest den Port????

Aber auch dann, wenn ich den Port ausgelesen habe, wie kann ich dann die richtigen Ereignisse in mein Programm nehmen um den Motor zu steuern?

Muss man den Port nicht auch ohne solch ein Programm auslesen können?

Detlef


Cashels - Fr 09.08.02 19:16

Hallo Detlef,

ich versteh nicht ganz was du meinst. Es handelt sich dabei um eine Funktion, nicht um ein Ereignis.

Oder hab ich da was nicht verstanden?

Gruss,
Tom


tommie-lie - Sa 10.08.02 16:36

Hallo,

Das ganze Unterfangen ist ja mittlerweile zu einer Debatte um den richtigen Anschluß geworden.
Hier mal etwas, was direkt zur Lösung von Detlef's Problem beisteuern kann:

Ich würde nie irgendwelche "fremden" Sachen direkt an den Computer anschließen. Die heutigen Boards unterscheiden sich in der Konstruktion teilweise dermaßen, daß es bei einem ohne weiteres funktioniert, während bei dem anderen die Spannung aus der Relais-Spule den Tot für den Controller bedeuten würde. Da der Controller nicht mehr wie früher in Steckkarten sitzt, sondern im Chipsatz auf dem Board, wäre in einem solchen Fall gleich ein neues Board fällig.

Für das Problem gibt es eine "selbstgebastelte" und eine "professionelle" Lösung.
Die selbstgebastelte verstößt genau gegen das, was ich einen Absatz vorher gesagt habe, also empfehle ich hier NICHTS, denn ich will nachher nicht derjenige sein, der Detlefs neues Board bezahlen muss.

Man kann für den Anschluß des Motors alle Ports nehmen, da ist man nicht auf COM und LPT beschränkt. Am bequemsten geht es wahrscheinlich mit dem USB-Port, aber man kann beispielsweise auch den MIDI-Port (orange) benutzen, oder sagor den VGA-Anschluss.
Man schnappt sich ein entsprechendes Kabel (Patch-Kabel für USB, Nullmodemkabel für LPT und COM, Monitorkabel für VGA, ...). Die Dinger gibt's in jedem schlechten Computerfachgeschäft und kosten je nach Schnittstelle und Länge zwischen 10 und 40 Euro. Von dem schneidet man das eine Ende ab. Dann entfernt man mit einem scharfen Messer vorsichtig die (ganz) äußere Ummantelung, ohne die Isolierung der dünnen Drähte im Innern zu verletzen. Die Ummantelung sollte mindestens 3cm abgemacht werden, je mehr desto besser ist es für Grobmotoriker, aber mehr als 5-6cm sollte man nicht entfernen. Dann entisoliert man die beiden Drähte, die die Spannung liefern mit eine Ent-Isolierzange. Diese Drähte findet man heraus, indem man die Spezifikationen der jeweiligen Schnittstelle durchblättert. Teilweise findet man die beim IEEE, teilweise auch woanders im I-Net. Für USb wäre das Anschluß 3 und 4 mit den Farben Weiß und Grün. Die Kabelfarben können sich aber unterscheiden, also verlasst euch nicht auf mein Wort! Die beiden Kabel verbindet man dann mit den Anschlüssen des Motors, wobei Anschluss 2 der -Pol ist, und 3 der +Pol. Die Spannung beträgt bei USB 3,3 Volt, die maximale Stromstärke kenne ich nicht. Man kann dabei aber nciht die 5V/500mA-Leitung nehmen, durch die die Geräte Strom bekommen (einige PDA-Cradles, Mäuse, Tastaturen) da diese immer Strom führen, und nicht ein- und aus-geschaltet werden können. Hat man den Motor angeschloßen, schreibt man sich sein Programm. Die Beiden Anschlüsse (2, 3) führen jeweils dann Strom in der richtigen Richtung, wenn das Signal logisch "1" ist. Wie man sowas programmiert, habe ich zwar hier zu Hause in einem Buch stehen, aber so richtig verstanden habe ich es nicht. Es handelt sich nämlich um eine Art Schieberegister, das die entsprechenden Signal-Bits immer "reihum" addressiert und die entsprechenden Befehle an den Controller schickt. Der Nachteil der ganzen USB-Geschichte ist, daß man den Motor nicht aus bekommt. "1" ist nämlich der Strom in der einen Richtung, und bei "0" wird umgepolt. Damti kann man also den Motor nur in der Drehrichtung umschalten. Natürlich ist es theoretisch möglich, die Signale so schnell zu wechescheln, das der Anker gar nicht anfängt sich zu drehen. Das kann aber auf Dauer sowohl den Motor (Festmagnete) und den Computer (Controller) zerstören. Also ist davon abzuraten, wenn man ihn wirklich AUS schalten will.

Da bildet der COM-Anschluss eine Alternative. Da kann man beispielsweise die Signale "DTR" und "Common" (Signalmasse) benutzen. Startet man dann ein Terminal-Programm, wird das DTR-Bit auf "1" gesetzt. Der Motor dreht sich. Beendet man das Terminal-Programm wieder, so stoppt auch der Motor. Das ist allerdings nicht wirklich hilfreich, da einige Modem-Treiber und Betriebsystem-Einstellungen das DTR-Signal schon beim Booten setzen. Empfehlenswerter wäre hier das Signal "RTS". Dies kann man setzen und der Motor dreht sich. Das "RTS"-Signal wird (normalerweise) immer nur dann gesetzt, wenn Daten gesendet werden wollen, es bleibt also generell aus. Der Pin des RTS-Signals ist "7" bei 9-Pin-D-Sub und "4" bei 25-Pin-D-Sub. Die 25-Pin-Variante wird heute nicht mehr eingesetzt, da die Computer-Benutzer immer dümmer werden und schonmal LPT mit COM verwechselt haben. Daher hat man ihn abgeschafft. Man sollte also auf allen Boards nach 96/97 nur noch 9-Pin-Anschlüsse finden.
Das COM-Signal läßt sich per DOS-Interrupt "21h" ansteuern. Das macht man idealerweise per Assembler-Befehl. DOS schränkt aber die Funktionen etwas ein. Für die Leute, die diesen Thread also wegen "richtiger" Datenübertragung lesen: Der BIOS-Interrupt "14h" bietet die volle Funktionalität der Schnittstelle. Wie man diese Interrupt anspricht, und welche schneller sind, kann ich nicht sagen. Aber wenn es eine Bibliothek für Delphi gibt, die die Signale für COM einzeln setzen kann, dann sollte man diese Verwenden, da gerade bei "hardware-naher" Programmierung oft Fehler vorkommen können, die nicht immer Harmlos sind (ein falsches Register könnte das BIOS ernsthaft schädigen!!!)
Man kann, wenn man zwei Signale gleichzeitg nutzt, auch die Laufrichtung umschalten. Das benötigt aber eine elektrische Schaltung, über die ich mir hier keine Gedanken machen wollte.
Das Kabel bearbeitet man bei COM genauso wie bei USB. Nur das hier die Auswahl an Drähten etwas größer ist. Welcher Draht der richtige ist, kann ich nicht sagen, denn die Farben unterscheiden sich von Kabel zu Kabel, selbst beim gleichen Hersteller (je nach Serie). Am besten man nimmt einen Durchgangsprüfer und sucht das Kabel, welches den Pin "7", oder "4" darstellt. Die "Common"-Leitung ist übrigens auf Pin "5" (9-Pin), bzw. auf Pin "7" (25-Pin) gelegt.

Die VGA-Schnittstelle hat eine ganz entscheidende Möglichkeit:
Mit ihr kann man die Laufgeschwindigkeit des Motors verändern. Da hier die Signale als analog als Spannung herauskommen, und nicht digital (an oder aus) hat man die Möglichkeit durch Variation der Spannung auch eine Variation der Drehgeschwiindigkeit hervorzurufen. Die VGA-Schnittstelle ist jedoch in den meisten Fällen zu schade für eine solche Anwendung. Ausserdem kenne ich die Belegung nicht, und auch nciht, wie man die Signale ansteuern kann.


Die "professionelle" Lösung führt zuerst zum PC-Fachhandel. Dort gibt es so genannte "Schaltkarten" für ISA, oder manchmal auch für PCI-Slots. Diese werden zusammen mit einem Schaltkasten verbunden und in den Computer gesteckt. An diesen externen Schaltkasten kann man seinen Motor anschließen. Einige Exemplare verzichten auch auf einen solchen Kasten und lassen den Motor direkt an der Karte anschließen. Nach der Installation der (mitgelieferten) Treiber und Steuerprogramme lassen sich nun die einzelnen Anschlüsse ansteuern. Programmier oder Bastel-Aufwand beschränkt sich hierbei auf den Einbau einer Steckkarte und die Installation des Programmes. Allerdings sind solche Karten nicht ganz billig. Die Preise gehen je nach Funktionsumfang von 70Euro bis mehr als 200Euro, für entstörte, super-funktionale, hochleistungs-Profikarten.


Reicht die Spannung und die Stromstärke, die für die jeweilige Schnittstelle zulässig ist, nicht für den Motor, sollte sich keiner auf Experimente einlassen. Am besten man trennt generell immer die Schnittstelle galvanisch vom Motor. Da auch im Motor Spulen drin sind, besteht immer die Gefahr einer Unregelmäßigkeit (iwe das bei fließenden Magnerfelder nun mal der Fall ist). Diese Trennung geschieht am besten durch einen Optokoppler. Wenn man ein Relais einsetzt ist der Optokoppler sogar besonders wichtig. Zusätzlich sollte man noch Rücklaufdioden verwenden damit keine Hardware zerstört werden KANN. Sicherheit ist gerade heute wichtiger als vor 10 Jahren. Während fürher die Leiterbahnen noch relativ grob waren und auch mal mehr vetrugen, als angegeben, sind heute die Dinger so fein, das einige schon bei wenigen MicroAmpere über der Vorschrift den Geist aufegeben könnten. Und da heute die Controller alle auf dem Board sind, wird es teuer.

Tschüß
tommie-lie


01Detlef - Sa 10.08.02 19:56

Danke schön deine Anleitung hat mich um einiges weiter gebracht, mir sind viele Dinge klar geworden!!
Wie heißt denn das buch, von dem du gesprochen hast?
Kannste mir das empfehlen?

Die Anleitung hat mit die Möglichkeiten der verscheiden Ports gut verständlich erklärt und damit werde ich hoffentlich auch keine Probleme mehr haben, aber ich muss immer noch zu geben, das ich Probleme habe einen Port mit meinem eigenen Programm anzusteuern!
Das habe ich noch nicht verstanden,
aber ihr habt euch wirklich schon viel mühe gegeben, das weiss ich zu schätzen und ich versuche das auch irgendwann zurück zu geben!!

Danke Detlef


Thunder00 - So 29.12.02 18:39

*hüstel* HALLO?

Das is ja alles schön und gut...aber ihr seid ALLE am Thema vorbei! 01Detlef will nen Port ansteuern über Delphi...und ihr landet bei Zusammebruch eines Magnetfeldes einer Spule und der Strom, der dabei durch die Elektronen entsteht...und noch irgendwas mit Halbleitern...

Aber keiner hat geschrieben, wie man den Druckerport ansteuert! Was mich auch mal intressieren würde ...

Grüße,
Andreas


Black Lightning - So 29.12.02 20:05

genau nach dieser Antwort suche ich auch schon eine Ewigkeit.
Ich weiss nur soviel dass es seit NT nicht mehr über Assambler geht, sondern über von Windows verwaltete Funktionen.
Wie aber heissen diese Funktionen ??
Im Grunde braucht man doch keine extra komponente oder dll oder so überflüssig kompliziertes Zeug...einfach nur eine Funktion bei der man Portadresse und Wert eingibt.


bash - So 05.01.03 02:56

Hi,

also wer auf einfache art und weise mal eben über ein port was steuern oder nur so ausgeben will (vielleicht nen lichtsignal über eine kleine led) kann dafür die serielle schnittstelle verwenden.
dafür gibt es in der active-x bibliothek ein geeignetes steuerelemtent von microsoft, heißt Microsoft Comm Control (o.ä.). damit seit ihr sofort in der lage, schnell und einfach nen paar leitungen der seriellen zu schalten.

hoffe das ding wird euch für's erste erst einmal weiterhelfen. mehr kann ich euch auch´noch nicht sagen, da ich mich mit diesem thema noch nicht wirklich so recht beschäftigt habe (hatte es eigentlich mal vor... :-))

viel spaß noch beim basteln...
bash


Ecthelion - So 05.01.03 15:29

Hallo,

Ich will ne LED ansteuern, hat 7 Zeilen, d.h. ich komm mit 8-Bit-Signal gut hin, die hat nen LPT-Anschluss, ich will also über Druckerport rangehen (s. aktueller Thread von mir).

Bekomm ich das mit den von Zero vorgestellten Modulen hin? Wie genau?


Fiesta - Mo 06.01.03 02:20
Titel: Ich könnte es in Vb :-(
Hallo, ich habe in VB5 ein Programm geschrieben, das auf den parallelen Port schreibt und auch vom Port liest. Das Ganze funkt unter verschiedenen Windows Versionen und auch unter Win2K.

Ich verwende dazu die dlportio.dll. Die hat eingebaute Routinen um den parallelen Port zu "bearbeiten". Leider habe ich keine (!) Ahnung von Delphi und weiss nicht, ob man die funktionen aus einer bestehenden dll von Delphi aus aufrufen kann :-(. Meine Definitionen in VB sehen dann in etwa so aus.

' Port I/O variables
Public Declare Function DlPortReadPortUchar Lib "dlportio.dll" (ByVal Port As Long) As Byte
Public Declare Sub DlPortWritePortUshort Lib "dlportio.dll" (ByVal Port As Long, ByVal Value As Integer)

Portprogrammierung geht dann z.B. so:

DlPortWritePortUshort Val(Parportwritead), LPTByte

Wenn so etwas auch unter Delphi geht, würd ich ggf. gern mein eigenes Programm irgendwann mal in Delphi "umstricken" .....


Schöne Grüsse

Fiesta :twisted:


Matthias - Mo 06.01.03 10:03

Hy,

@Ecthelion

Ja, solange Du nicht Windows 2K oder XP verwendest, ansonsten hilft nur ein Treiber weiter.

Hier [http://www.torry.net/portaccess.htm] findest Du einige Treiber. Manche davon sind Freeware mit Source.

ciao
Matthias


Ecthelion - Mo 06.01.03 11:19

Nein, benutze Win98. Soll zwar u.U. auch Win2k laufen, aber das hat keine Priorität.


Ecthelion - Mo 06.01.03 19:57

Wie erkenne ich die "Adresse" des Druckerports?


Thunder00 - Mo 06.01.03 20:24
Titel: SO GEHTS !!
In irgendeinem Forum (glaub [url]http://www.delphi-treff.de[/url] oder [url]http://www.pc-magazin.de[/url]) hat einer mal das gepostet, wer kann mir das mal erklären, also die genaue Funktionsweiße:

Zitat:

naja wie auch immer jedenfalls würde ich den drückerport nehmen da hast du 8 datenleitungen die du an/aus setzen kannst.

Code:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
{$IFDEF Win32} 
FUNCTION PortIn(Addr: WORD): BYTE; Assembler; StdCall; 
  ASM 
    mov dx, Addr // Adresse ins DX-Register schreiben 
    in al, dx    // Port lesen. (AL entspricht Result)  
  END; 
{$ELSE} 
FUNCTION PortIn(Addr: WORD): BYTE; 
BEGIN 
  Portin := Port[Addr]; 
END; 
{$ENDIF} 

{$IFDEF Win32} 
PROCEDURE PortOut(Addr: Word; Data: Byte); Assembler; StdCall; 
  ASM 
    mov dx, Addr    // Adresse nach DX 
    mov al, Data    // Datenbyte nach AL 
    out dx, al      // Port schreiben 
  END; 
{$ELSE} 
PROCEDURE PortOut(Addr: WORD; Data: BYTE); 
BEGIN 
  Port[Addr] := Data; 
END; 
{$ENDIF}




de code hier sollte dir unter delphi die portsteuerung ermöglichen, leider nur unter 95,98,ME vür NT systeme bräuchtest du dann doch eine kleinen "treiber" da da nix ist mit direktem portzugirff

naja jedenfalls könntest du

Code:

Quelltext
1:
PortOut($378,256);                    




dann sind glaube ich alle 8 datenleitungen aktiv, war mir doch so ist schon etwas länger her als ich sowas gemacht habe

1
2
4
8
16
32
64
128
256


Hmm...was hat es mit den Adressen auf sich?? Auf jeden Fall haben wir hier schonmal eine gute Lösung

Leider habe ich WindowsXP. Ma schauen was Torry ([url]http://www.torry.net[/url] zu bieten hat).


bis11 - Di 07.01.03 12:43

Hi,

Zitat:

dann sind glaube ich alle 8 datenleitungen aktiv, war mir doch so ist schon etwas länger her als ich sowas gemacht habe

1
2
4
8
16
32
64
128
256


Mit diesen Zahlen, kannst Du einzeln die 8 Leitungen ansteuern.

Das heißt, wenn Du schreibst :

Quelltext
1:
PortOut($378,1);                    

dann wird nur auf die erste Leitung ein Signal gelegt. Wenn Du jetzt statt der 1 eine 3 einträgst, wird die erste und die zweite Leitung geschaltet.


Ecthelion - Di 07.01.03 17:21

Und $378 ist also der LPT?


bis11 - Di 07.01.03 18:03

Hi,

das ist LPT1. Die Adresse kannste über den Hardware-Manager herausbekommen.


DerKrasseHans - Di 07.01.03 18:58

Moinsen,

Erstmal: ja, $378 ist die Adresse des LPT1 (siehe Geräte-Manager->LPT1->Ressourcen->E/A-Bereich

Und: Code für die Ansteuerung hast du ja auch schon (siehe PortIn/PortOut-Befehl)
Um jetzt Bit 1-8 ansteuern zu können, muss man wissen, dass ein Byte aus 8 Bit besteht wobei jedes genau den Status einer Leitung repräsentiert. Mit Bit-Shifting oder Bit-Masken kannst du dabei einzelne Leitungen ansteuern, hier ein kleiner Code:

Quelltext
1:
2:
3:
4:
function Leitungen(l1, l2, l3, l4, l5, l6, l7, l8: Byte): Byte;
begin
  result := l1 or (l2 shl 1) or (l3 shl 2) or (l4 shl 3) or (l5 shl 4) or (l6 shl 5) or (l7 shl 6) or (l8 shl 7);
end;

Du kannst jetzt einfach diese Funktion in den PortOut-Befehl Data-Parameter übergeben, wobei eine 1 für AN und eine 0 für AUS (wie könnte es anders sein) der einzelnen Leitungen steht:

Quelltext
1:
PortOut($378, Leitungen(0, 0, 1, 0, 0, 1, 0, 1));                    

Dieser Befehl setzt nun die Leitungen:
1, 2, 4, 5, 7 auf AUS und...
3, 6, 8 auf AN

Zitat:
Der Nachteil der ganzen USB-Geschichte ist, daß man den Motor nicht aus bekommt. "1" ist nämlich der Strom in der einen Richtung, und bei "0" wird umgepolt. Damti kann man also den Motor nur in der Drehrichtung umschalten.

Schalt doch einfach eine Diode zwischen Verbraucher und Port, genau in die Richting des bei "1" fließenden Stroms, dann fließt bei "0" der Strom nich in die andere Richtung, sondern gar nich mehr.

Jungs, kurze Anmerkung:
Könnt ihr nicht zählen? :wink:
Zitat:
dann sind glaube ich alle 8 datenleitungen aktiv, war mir doch so ist schon etwas länger her als ich sowas gemacht habe

1
2
4
8
16
32
64
128
256

Das sind 9 geshiftete Zahlenwerte für Leitungsadressierung, man hat aber nur 8.


Ecthelion - Di 07.01.03 19:08

Die Funktion Leitungen sieht ja nett aus, aber:

1. Müssen die Parameter nicht vom Bit-Typ sein? Immerhin rechnest du boolsch mit ihnen und belegst sie mit 1 und 0.

2. Was ist SHL, und was hat die jeweilige Zahl dahinter zu bedeuten?


Brueggendiek - Di 07.01.03 22:51

Hallo!

Ein ganz wichtiger Hinweis:

Ohne fundierte Kenntnisse sollten Bastler sowieso die Finger von USB-Port lassen!

USB ist keine einfache Schnittstelle, sondern ein hochkomplexes System aus Hardware und Treibersoftware. "Einfach so" ein USB-Gerät zu entwickeln ist nicht möglich. Es braucht das entsprechende Bus-Interface und den Treiber.

An einer standardmäßig belegten seriellen Schnittstelle finden wir übrigens auch nicht 0 oder 5 Volt, sondern -15 oder +15 Volt (heutzutage wohl eher -12 oder +12 - Netzteil!) - da läuft dann ohne Dioden nichts.

Gruß

Dietmar Brüggendiek


Ecthelion - Do 09.01.03 17:30

Hallo,

das mit dem Assembler für den Port funktioniert alles ganz toll, aber eben nur ne gewisse Zeit lang, dann hängt sich das System auf. Hab in der Delphi-Hilfe gelesen, dass Port-Adressierung via Assembler auch nich zulässig is, also musses da noch andre Möglichkeiten geben. Gibt es denn keine Delphi-internen Portfunktionen?


Thunder00 - Fr 10.01.03 14:45
Titel: ...
Hey,

Ich hab das nur aus einem anderem Forum kopiert. Ich bin nicht dafür verantwortlich.

Gruß,
Andreas


DerKrasseHans - Fr 10.01.03 19:33

Zitat:
1. Müssen die Parameter nicht vom Bit-Typ sein? Immerhin rechnest du boolsch mit ihnen und belegst sie mit 1 und 0.

Eigentlich hast du recht, erst wollte ich sie auch als Bool'sch definieren, nur müsste dann an jeder Stelle, an der mit l1, l2, ... gerechtnet wird, ein Ord(l1), Ord(l2), ... stehen. Als ich die mit dem Gedanken spielte, Bool'sche- statt Byte-Parameter zu verwenden, überwog meine Faulheit gestützt durch das Vertrauen, dass derjenige, der die Funktion Leitungen() benutzt nicht irgendeinen Quatsch übergiben würde, daher die Wahl des Typs Byte!

Zitat:
2. Was ist SHL, und was hat die jeweilige Zahl dahinter zu bedeuten?

SHL = SHift Left
Betrachtet man einen l-Wert als eine Kette von Bits, so verschiebt "SHL c" alle Bits im Wert um "c" Bits nach links (und füllt mit Nullen nach):
also 00000001 SHL 3 = 00001000

Die Routine konvertiert auch eigentlich nur die einzelnen Bit-Status' l1-l8 in einen Byte-Wert, mehr macht sie nicht! Sie dient eigentlich nur der Vereinfachung und macht den Code übersichtlicher.


Pierre - Sa 11.01.03 00:27

Hallo,

Du kannst fast mit jeder Schnittstelle am Computer einen Motor betreiben. I.d.R. muß Du jedoch zwei Stromkreise aufbauen: 1x einen Schaltstromkreis, welcher von der Schnittstellte gesteuert wird und den Leistungsstromkreis steuert 1x einen Leistungsstromkreis, welcher den Motor antreibt

Die Verbindung zwischen diesen Stromkreisläufen machst Du mit einem Reed-Relais.

Die COM - Schnittstellen arbeiten auf 12V bipolar und die PAR /GAME auf 5V TTL. Alle vertragen ca. 10mA Leistung. Die COM ist gegen Kurzschluß gesichert und eignet sich daher gut für Experimente.

schau mal hier vorbei: http://www.delphi-roboter.de. Für die nötigen DLLs, um die Port anzusteuern, oder wie man sie selbst mit einem Inlineassembler schreibt, für den Aufbau der Schnittstellen, für Delphi-Prg - Bsp, für Schaltungsbeispiele usw.

Gruß Pierre


Alex - Di 04.02.03 18:33

hab da zufällig bei Ebay ein Buch enddeckt das heißt:

Messen, Steuern, Regeln mit Delphi Pc&Elektro

möglicherweise hilft das weiter


EAGLE> - Mi 05.03.03 13:45
Titel: mögliche leiterbahnen
DerKrasseHans hat folgendes geschrieben:
Moinsen,

Erstmal: ja, $378 ist die Adresse des LPT1 (siehe Geräte-Manager->LPT1->Ressourcen->E/A-Bereich

Und: Code für die Ansteuerung hast du ja auch schon (siehe PortIn/PortOut-Befehl)
Um jetzt Bit 1-8 ansteuern zu können, muss man wissen, dass ein Byte aus 8 Bit besteht wobei jedes genau den Status einer Leitung repräsentiert. Mit Bit-Shifting oder Bit-Masken kannst du dabei einzelne Leitungen ansteuern, hier ein kleiner Code:

Quelltext
1:
2:
3:
4:
function Leitungen(l1, l2, l3, l4, l5, l6, l7, l8: Byte): Byte;
begin
  result := l1 or (l2 shl 1) or (l3 shl 2) or (l4 shl 3) or (l5 shl 4) or (l6 shl 5) or (l7 shl 6) or (l8 shl 7);
end;

Du kannst jetzt einfach diese Funktion in den PortOut-Befehl Data-Parameter übergeben, wobei eine 1 für AN und eine 0 für AUS (wie könnte es anders sein) der einzelnen Leitungen steht:

Quelltext
1:
PortOut($378, Leitungen(0, 0, 1, 0, 0, 1, 0, 1));                    

Dieser Befehl setzt nun die Leitungen:
1, 2, 4, 5, 7 auf AUS und...
3, 6, 8 auf AN

Zitat:
Der Nachteil der ganzen USB-Geschichte ist, daß man den Motor nicht aus bekommt. "1" ist nämlich der Strom in der einen Richtung, und bei "0" wird umgepolt. Damti kann man also den Motor nur in der Drehrichtung umschalten.

Schalt doch einfach eine Diode zwischen Verbraucher und Port, genau in die Richting des bei "1" fließenden Stroms, dann fließt bei "0" der Strom nich in die andere Richtung, sondern gar nich mehr.

Jungs, kurze Anmerkung:
Könnt ihr nicht zählen? :wink:
Zitat:
dann sind glaube ich alle 8 datenleitungen aktiv, war mir doch so ist schon etwas länger her als ich sowas gemacht habe

1
2
4
8
16
32
64
128
256

Das sind 9 geshiftete Zahlenwerte für Leitungsadressierung, man hat aber nur 8.



stimmt aber man hat mit 8 leitungen 256 möglichkeiten deswegen vieleicht ?? ich frage aus dem grundichbräuchte für den unterricht nämlich mal ne erklärung zwarhab ich schon mal ne "hilfe" bekommen die bestan leider nur auf ein verweiß aufein anderes posting von einer Motorsteuerung dies ist aber etwas anderes bei einer motorsteuerung braucht man den ausgang vorrängig ich bräuchte eher den portin befehle ..


also ich fragemich wie ich genau die ports abfragn kann sozusagen :

Editfeld = der wert vom port (umgerechnet)

d.h. ich will im editfeld oder im label"gans einfach also" ausgeben welchen wert der port hat und dann kann man des ja umrechnen problem ist halt WIE KANN MAN DIE PORTS ABFRAGEN


mit IF PORT$378 =0 then ... sogeht des mit sicherheit ned... also wär nettwenns da ma ne hilfreiche NED ausm buch abgeschriebene LÖSUNG gibt thx..


ps ich weiß das es nur 5 eingänge gibt oder zumindest nur 5 die ich abfragen kann .