Shiftregister, Transistoren und Freilaufdioden und mehr

Hallo,

beim Bau meiner Gießanlage bin ich mit der Zeit auf einige Probleme gestoßen und statt sie einzeln zu posten habe ich gedacht, es wäre gescheiter, sie gesammelt hier zu posten - daher der lange Text - bitte entschuldigt :slight_smile:

Ich plane, mit meinem Arduino und einem 595 Shiftregister, 39 Druckluftventile (5000EN1, 12V/100mA) zu steuern. Dazu habe ich an die Ausgänge des Shiftregisters je einen BC548B Transistor angeschlossen und das geht auch soweit. Benötige ich hier an der Basis noch irgend einen Vorwiderstand? So wie ich das lese sind Vorwiderstände bei Transistoren üblich, aber ich gehe ja nur mit 5V in die Basis also müsste das passen oder?

Um die Ventile zu öffnen fließen dann 12V von einem extra Netzteil - allerdings funktioniert das Ventil ja mit Spule dh ich brauche wegen der Induktion eine Freilaufdiode wenn ich das richtig gelesen habe. Hier sollte eine 1N4148 ausreichen, oder?

Meine Hauptfrage ist allerings folgende: da das Gerät später dauerhaft laufen soll und auch einem Stromausfall oder anderem Fehler ausgesetzt sein könnte möchte ich die 12V für die Ventile nicht gleich von Anfang an verfügbar haben sondern nur bei Bedarf, dh. einem Öffnungsvorgang aktivieren.
Bei einem Stromausfall im Testlauf, bei dem LEDs statt Ventile angeschlossen waren (die Transistoren habe ich da nicht eingebaut gehabt) hat das Shiftregister für einen kurzen Zeitraum einfach alle Ausgänge auf HIGH gestellt. Wenn ich da jetzt 39 Ventile daran gehabt hätte, die je 100mA gezogen hätten wären das ja 3,9 A gewesen und mir wäre das Netzteil durchgebrannt. Jetzt habe ich gedacht, dass ich einen DigitalPin an die Basis eines weiteren Transistors hänge und dieser beim (neu)start des Gerätes die 12V sperrt, dh wenn das Shiftregister alles auf HIGH stellt sind zwar die Transistoren der Ventile aktiv, aber es fließt kein Strom weil nicht verfügbar - damit wäre der Schaden abgewendet, oder? Ich bin etwas besorgt, dass mein Halbwissen da irgendwas vernachlässigt…
Wenn das funktioniert muss ich alles praktisch folgendermaßen anschließen:
12V ----(+)Ventil(-)----(kollektor)BC548(emitter)----(kollektor)weiterer Transistor(emitter)----GND
|—(+)Ventil(-)----(kollektor)BC548(emitter)----(kollektor)weiterer Transistor(emitter)----GND
|—(+)Ventil(-)----(kollektor)BC548(emitter)----(kollektor)weiterer Transistor(emitter)----GND
und das eben mit allen Ventilen. Stimmt das so?
Und welchen Transistor benötige ich da, um die 12V zu sperren? Da müsste doch auch ein BC548 genügen, weil gleichzeitig nie mehr als 100mA fließen, richtig? (es ist vorgesehen, dass immer nur eins der Ventile gleichzeitig geöffnet ist) Oder wäre es gescheiter, sicherheitshalber etwas mehr zu nehmen, wie zB. 250mA?
Und da besagter Transistor dann direkt am Arduino hängt brauche ich definitiv einen Vorwiderstand - aber wie hoch? Ich habe auch etwas von Pullup-Widerständen gelesen, die ich da einfach aktivieren können soll, aber so wie ich das verstanden habe kann ich den Pullup doch nur bei pinMode(INPUT) aktivieren, oder?

Eine letzte Frage noch - der Arduino wird per Webinterface gesteuert, dh. habe ein ethernetshield angeschlossen und kann auf dem Interface die Ventil-Nummer eingeben, die dann für einen definierten Zeitraum aktiviert, dann wieder deaktiviert wird. Außerdem befindet sich auf der Seite eine Liste, die den Zeitpunkt der letzten Aktivierung jedes Ventils beinhaltet und ein paar kleinere Links mit Funktionen wie Reset/Refill/Refresh etc.
Das lief mit den LEDs perfekt - wenn ich aber jetzt ein Ventil mit Transistor aktiviere (momentan habe ich teils Ventile, teils LEDs an den Shiftregistern) ist es manchmal, aber nicht immer so, dass das Webinterface nicht mehr wie gewollt dargestellt wird, sondern ein haufen Zeichen, der hauptsächlich aus meinem HTML-Code des Webinterfaces besteht. Abhängig vom benutzten Browser wird das Webinterface auch in falscher Reihenfolge angezeigt (zB die Ventilliste vor der Eingabezeile für die Ventilnummer und Reset dazwischen) was aber nach einem neuen Aufrufen des Interfaces wieder beseitigt ist. Allerdings stürzt der Arduino nicht ab, was ich an einem Timer, der basierend auf millis() die Uptime anziegt, ausschließen kann. Weiß jemand, was ich hier falsch mache? Beeinflusst der Transistor in irgend einer Form das Ethernetshield oder so etwas in der Art? Im Prinzip könnte ich das schon so lassen aber irgendwann soll das Gerät meine Blumen gießen, wenn ich im Urlaub bin und da will ich alle Fehler und Gefahrenquellen ausschließen… will ja nicht, dass mir die Wohnung abbrennt.

Vielen Dank für eure Geduld - ich weiß das zu schätzen! In dem Gerät steckt Herzblut und mittlerweile 2 Jahre Lesen, Lernen und Verzweifeln :wink:

Hallo,
für die User des Forums wäre es doch schöner, wenn sie z.B. nach “Freilaufdiode” nicht das ganze Zeug über “Shiftregister” lesen müssen - und umgekehrt.

Warum versuchst Du nicht einfach drei geziehlte Fragen zu stellen?
Durch das abgrenzen der einzelnen Bereiche würdest vielen einen Gefallen tun - auch Dir, da dann mehr Antworten kommen würden.

Grüße,
Jürgen

Hmm so hab ich das noch nicht gesehen... dann versuch ich das wohl mal :)

Basis braucht Vorwiderstand, Relais immer Freilaufdiode. 1N4148 reicht da. Deine 12 Volt Logik hab ich nicht verstanden, sorry. Evtl. beim Start die Register per Reset ausgeschaltet halten bis alle Bits gesetzt sind. Text war mir auch bissel zu lange ...

Ein Basiswiderstand von ca. 1k und die Freilaufdiode sind unbedingt nötig!

Eine Alternative wären zwei ULN2065/2068. Das sind 4-fach Darlington-Arrays, die die Basiswiderstände und Dioden schon integriert haben. Es gibt mit dem ULN2803 auch ein 8-fach Array, aber das ist etwas über der Spezifikation wenn die 8 mal 100mA ständig fließen.

Schau dir auch mal das Datenblatt des Schieberegisters genau an. Das hat mit Pin 13 einen active low Output Enable Eingang. Wenn dieser High ist sind alle Ausgänge auf Tri-State, egal was an den anderen Eingängen anliegt. Wenn du dann an die Basis der Transistoren 10k Pull-Down Widerstände baust, sind diese sicher Low. Dann musst du nur dafür sorgen dass der Eingang auf High ist.

Ea hat keinen Sinn 2 Transistoren in Reihe zu schalten. Gib eine widerstand zwischen Basis und Masse so sperrt er sicher. Wert ca 10 x Basiswiderstand. Grüße Uwe

Basiswiderstand eiauen. Damit stellst du die "Übersteuerung" des Transistors ein, wenn du in als Schalter nutzt und hälst damit die Kollektor Emitter Spannung möglichst gering.

Die Schiftregister erst nach ordentlichen Programmmstart freigeben: Bis dahin die Ausgänge sperren. Gibt einen extra Pin dafür, den du dann übers Borad ansteuern kannst.

EDIT: Der Pin heißt (OutputEnable) OE mit dem Strich drüber.

panzerdampf:
Dazu habe ich an die Ausgänge des Shiftregisters je einen BC548B Transistor angeschlossen und das geht auch soweit. Benötige ich hier an der Basis noch irgend einen Vorwiderstand?

Das wurde ja schon beantwortet: Ja, du brauchst einen Vorwiderstand. Ohne Vorwiderstand funktioniert das nur, weil die Ausgänge des Schieberegisters nicht sofort kaputt gehen, wenn man sie kurzschliesst!
Ich würde hier ca. 500 Ohm bis 1k empfehlen.

panzerdampf:
Um die Ventile zu öffnen fließen dann 12V von einem extra Netzteil - allerdings funktioniert das Ventil ja mit Spule dh ich brauche wegen der Induktion eine Freilaufdiode wenn ich das richtig gelesen habe. Hier sollte eine 1N4148 ausreichen, oder?

Richtig. Wurde ja schon beantwortet.

panzerdampf:
… möchte ich die 12V für die Ventile nicht gleich von Anfang an verfügbar haben sondern nur bei Bedarf, dh. einem Öffnungsvorgang aktivieren.

Der Output enable wird hier nicht helfen, weil er ja invertiert ist.
Da wirst du die 12V schalten müssen, z.B. so:
Schalten_Ubatt_bipol.jpg
Mit dem PNP Transistor Q3 kannst du die 12V aktiv zu- oder abschalten. Der andere Transistor Q2 dient als Levelshifter und auch zum invertieren. Wenn die 5V des Arduino ausfällt, bleibt die 12V_Switch aus.
Diese Schaltung hat den Nachteil, dass, wenn du doch mal alle Ventile ansteuern solltest, der Transistor wahrscheinlich kaputt sein wird. Besser wäre hier ein P-Kanal Fet, dann würde die Schaltung etwas anders aussehen.

panzerdampf:
Beinflusst der Transistor in irgend einer Form das Ethernetshield oder so etwas in der Art?

Schalten von Spulen ist leider oft mit Störungen behaftet. Hier hilft vor allem ein sauberes Layout, also die räumliche Trennung von Spulenströmen und Signalleitungen. Wichtig auch, dass die Freilaufdioden möglichst nahe an den Spulen sind.

Achja... den Transistor für den OE habe ich vergessen :blush:

EDIT: Das Blinken im Video mache ich über den OE Pin. https://www.dropbox.com/s/jhsdhnqr7oye8i6/2013-09-15%2022.57.30.mp4 Zudem gebe ich den im Setup erst nach leeren der Register die Ausgänge frei. Das ganze über einen Pullup und einem Transistor

R1der: Bis dahin die Ausgänge sperren. Gibt einen extra Pin dafür, den du dann übers Borad ansteuern kannst.

Dabei ist aber zu beachten, dass OE die Ausgänge nicht Low schaltet, sondern in Tri-State. Das heißt wenn man damit andere ICs oder Transistoren ansteuert hängen deren Eingänge in der Luft. Deshalb sind da unbedingt Pulldowns erforderlich.

EDIT:

guntherb: Der Output enable wird hier nicht helfen, weil er ja invertiert ist.

Wenn der Pegel beim Einschalten ein Problem ist, kann man dann nicht einfach einen Transistor als Inverter nehmen?

Wäre einfacher als für jede Stufe noch einen Transistor zu verbauen.

Wow sehr viel Info - vielen Dank euch allen und auch für eure Geduld! Ich werde das jetzt mal alles auswerten und beim nächsten Mal gibts keine Wall of Text mehr :)

Ich wünsche euch ein schönes Wochenende.