Eingänge mit 12V oder Masse auf 3.3 Logiklevel bringen

Hallo zusammen,

ich möchte die Kontroll-Leuchten eines älteren Fahrzeug-Tachos mit dem Arduino "einlesen".
Manche Kontroll-Leuchten liegen an Masse und werden mit 12V angesteuert, andere liegen an 12V und werden fahrzeugseitig auf Masse geschaltet.

Ich möchte beide Varianten erkennen und mitloggen.

Aufbau:
16fach Portexpander (MCP23S17) an SPI-Bus des Arduino Due.
7 Ports sollen als Input 12V erkennen, 7 Ports sollen als Input anliegende Masse erkennen, 2 Ports sollen als Output 12V schalten (um damit extern eine Leuchte oder wahrscheinlicher ein Relais zu schalten).

Nun hapert es an der Umsetzung Fahrzeug 12V bzw. Fahrzeug Masse -> Logiklevel (3.3V) am Portexpander-Eingang.


Für den 12V-Teil dachte ich nach langer Sucherei an einen (vermutlich überdimensionierten, aber leicht zu bekommenden) ULN2003A und habe mir folgende Schaltung überlegt:

Die invertiert zwar, aber das wäre letzten Endes egal.
Gedanke: Alle MCPx Eingänge werden per PullUp (10k) auf HIGH gezogen. Wenn am ULNx Eingang 12V anliegen, schaltet der Ausgang und zieht den MCPx Eingang auf LOW.


Für die Masse-Seite würde ich spontan das gleiche machen, aber die Eingänge des ULN2003A mit einem PullUp hoch ziehen. Wenn die Leitung dann auf Masse gelegt wird, schaltet der Ausgang am ULN ab und der Eingang des MCP wird per Pullup HIGH gezogen. Das invertiert dann auch nicht.


Die beiden geplanten Schaltausgänge (Logik 3.3V auf 12V Schaltausgang) würden wohl idealerweise auch über den ULN laufen, nehme ich an?

Geht das so oder habe ich einen kompletten Denkfehler? Gibt es eine (sinnvollere und/oder nicht invertierende) Alternative?

Ich habe mir das Datenblatte vom ULN2003A und einiger anderer "Transistor-Arrays" jetzt xmal angeschaut, aber ich bin einfach nicht sicher und hoffe, dass ich hier Hilfe finde.

Ich würde - gerade in Fahrzeugen - immer den Weg über Optokoppler machen.

Klaus_ww:
Ich würde - gerade in Fahrzeugen - immer den Weg über Optokoppler machen.

Das sehe ich genau so. Und eine Extrabehandlung ob 12 Volt oder GND anliegt brauchst du in der Hardware auch nicht.
Das wird über die Abfrage im Arduino gelöst.
Wenn du dann noch die internen Pullups verwendest, sparst du die externen Widerstände.

Edit:
Sorry, die Pullups brauchst du schon, hatte das mit den Eingängen am Arduino verwechselt.

Klaus_ww:
Ich würde - gerade in Fahrzeugen - immer den Weg über Optokoppler machen.

Okay. Begriff bekannt, aber Bauteil noch nie benutzt. Gibt es da einen Vorschlag für ein bestimmtes Bauteil? Mit mehreren "Kanälen" idealerweise. Ich suche mal...

HotSystems:
Das sehe ich genau so. Und eine Extrabehandlung ob 12 Volt oder GND anliegt brauchst du in der Hardware auch nicht.
(...)
Edit:
Sorry, die Pullups brauchst du schon, hatte das mit den Eingängen am Arduino verwechselt.

Mir ist eben eingefallen, dass der MCP23S17 auch interne, schaltbare 100k Pullups hat, die externen könnte ich dann wohl wirklich sparen.

Die Unterscheidung nach 12V/GND brauche ich schon, weil je nach Leuchte 12V ODER GND "an" bedeutet und die im ausgeschalteten Zustand teilweise offen sind, teilweise auf Masse liegen.

michibures:
Okay. Begriff bekannt, aber Bauteil noch nie benutzt. Gibt es da einen Vorschlag für ein bestimmtes Bauteil? Mit mehreren "Kanälen" idealerweise. Ich suche mal...
Mir ist eben eingefallen, dass der MCP23S17 auch interne, schaltbare 100k Pullups hat, die externen könnte ich dann wohl wirklich sparen.

Die Unterscheidung nach 12V/GND brauche ich schon, weil je nach Leuchte 12V ODER GND "an" bedeutet und die im ausgeschalteten Zustand teilweise offen sind, teilweise auf Masse liegen.

Z.B CNY74-4 ist ein 4fach Optokoppler.

Die notwendige Unterscheidung kannst du problemlos im Arduino machen.
Aber teilweise offen und auf Masse verstehe ich nicht.
Hier ist es doch immer entweder oder, ein oder aus und nichts dazwischen.

Such mal nach Optokoppler Array, da gibt's bestimmt was.

An sich ist es wurscht, wie die Lampe geschaltet ist.

Lampe an Plus, geschaltet über GND: an der Lampe liegt HIGH wenn aus, LOW wenn an.
Lampe an GND, geschaltet über Plus: an der Lampe liegt LOW wenn aus, HIGH wenn an.

Falls Du keine Lust auf selberlöten hast, gibt's auch fertige Module dafür: shop.cboden.de/Erweiterungen-Zubehoer/4fach-Optokoppler-Eingangsplatine.html Wobei die einiges an Overhead mitbringen, da auch gleich noch Kontroll-LED's damit angesteuert werden. Wenn Du es lieber selber machen willst: Optokoppler – Mikrocontroller.net Im Prinzip reicht pro Kanal ein Optokoppler + 2 Widerstände. Standard-Typen sind der CNY17-3 oder der 4N25. Das sind aber einkanalige Versionen. Ein Beispiel für ein 4kanaliges Exemplar hast Du ja schon bekommen. Grundsätzlich spricht aber außer dem etwas größeren Platzbedarf auch nichts gegen die 1kanaligen Dinger.

Missverständnis, ich habe ein Detail nicht ordentlich erklärt:

Die originalen Lampen werden durch den Arduino ersetzt. Ich kann also nicht einfach nur die Spannung auf der jeweiligen Leitung messen, sondern muss selbst dafür sorgen, dass der Stromkreis geschlossen wird und entsprechend zumindest noch einen Widerstand in die Leitung hängen.

mgcss:
Falls Du keine Lust auf selberlöten hast, (...) Ein Beispiel für ein 4kanaliges Exemplar hast Du ja schon bekommen. Grundsätzlich spricht aber außer dem etwas größeren Platzbedarf auch nichts gegen die 1kanaligen Dinger.

Vielen Dank für die Links. Ich muss auf jeden Fall selbst löten, dieses Thema ist nur ein kleines Teilstück des Gesamtprojekts und ich arbeite gerade noch daran, alle benötigte Hardware und Schaltungen zusammen zu tragen.

kein Problem. Lies Dir einfach den Mikrocontroller.net Artikel durch, dann wird das schon klappen mit den Optokopplern :wink:

Zum Schalten der Lampen: dafür kannst Du ja einfach kleine N-Channel oder P-Channel MOSFET verwenden, je nachdem, ob Du GND schalten musst oder +12V. Der Arduino gibt dann immer HIGH aus, wenn die Lampe leuchten soll. Du musst dann wie gesagt nur darauf achten, den jeweils richtigen MOSFET zu nehmen. Bei den P-Channel-Typen brauchst Du aber zusätzlich noch einen kleinen NPN Transistor zur Ansteuerung.

Den Optokopplern ist es wie gesagt egal, wie rum die Ansteuerung funktioniert. Nur auf der Ausgangsseite musst Du da aufpassen.

Und mgcss hat es ja nochmal deutlich gemacht.

Deinem Eingang am Arduino soll es egal sein, ob dieser gegen High oder Low schaltet, das kannst du alles in deiner Sofware (Sketch) ausgleichen.

HotSystems:
Deinem Eingang am Arduino soll es egal sein, ob dieser gegen High oder Low schaltet, das kannst du alles in deiner Sofware (Sketch) ausgleichen.

Ja, ihr habt natürlich recht.

Ich habe mich etwas umgesehen und einen 4fach-Optokoppler gefunden, der mir gefällt:
TCMT4100
Mir ist bewusst, dass das ein SMD-Teil ist. Alle bisher eingeplanten weiteren ICs sind im gleichen Package. Ich finde, das lässt sich schön löten. Ein guter Kompromiss aus Platzbedarf und Verarbeitungsaufwand.

Allerdings bin ich mir nach wie vor nicht sicher, ob das wirklich sein muss. Der Arduino mitsamt der restlichen Peripherie wird ohnehin vom Fahrzeug versorgt und teilt sich mit diversen Sensoren das Massepotential. Ist eine galvanische Trennung in dem Fall hier dann nicht unnötig?

Nicht falsch verstehen, der Ansatz leuchtet mir ein und war mir auch vorher nicht als Option bewusst. Ich bin für jede Hilfe und Hinweise immer sehr dankbar!

Wie sieht's denn alternativ mit z.B. folgendem Buffer-Chip aus, der bis zu 15 (max. 18) V eingangsseitig verträgt?
HEF4050B

Da du zuvor ein Transistor Array einsetzen wolltes, ist ein Optokoppler die bessere Wahl und verhindert noch zusätzlich das Störspitzen auf den Eingang der nachfolgenden Bauteile gelangen kann.
Was willst du denn mit dem HEF4050 machen ?

Daran denken, dass die Spannungsversorgung eines Arduino nicht den Anforderungen im KFZ entspricht. Hier wäre deutlich mehr Aufwand notwendig, wenn man es "regelkonform" machen möchte. Komponenten, die am Bordnetz betrieben werden müssen nämlich z. B. mit Spannungsspitzen bis 100 V und verschobenen Masse-Potentialen klar kommen. Aber das nur am Rande.

Als Alternative zu den Optokopplern kannst Du theoretisch auch einen Spannungsteiler nehmen. Gehen tut auch das :slight_smile:

HotSystems:
Da du zuvor ein Transistor Array einsetzen wolltes, ist ein Optokoppler die bessere Wahl und verhindert noch zusätzlich das Störspitzen auf den Eingang der nachfolgenden Bauteile gelangen kann.
Was willst du denn mit dem HEF4050 machen ?

Wenn man es weit genug abstrahiert (was sicher sinnvoll ist), möchte ich nur die 12V (+x), die im Auto auftreten, zuverlässig auf das Logiklevel meiner Hardware bringen, um abzufragen, ob eine Kontroll-Leuchte leuchtet oder nicht.
Daher auch der Gedanke an eine Art "Levelshifter", mehr ist es ja eigentlich nicht. Da habe ich spontan den HEF4050 gefunden und mich gefragt, ob das nicht auch funktionieren würde.

Die größere Unempfindlichkeit bzgl. Störspitzen ist sicher ein deutliches Argument für den Optokoppler!

Was die massegeschalteten Leuchten angeht, frage ich mich gerade sowieso, warum ich das so kompliziert gedacht habe: Die kann ich ja genauso (mit Pullup und Schutzdiode, falls doch mal versehentlich Spannung angeklemmt wird) auch direkt an den MCP23S17 hängen.

Bin wirklich dankbar für die ganzen Denkanstöße. Ich bin absolut kein Hardware-Mensch und lerne gerne dazu. Ich lese mich ungebremst durch alles durch, aber Input von außen bewahrt einen oft davor, sich in die falsche Richtung zu versteifen.

mgcss:
Daran denken, dass die Spannungsversorgung eines Arduino nicht den Anforderungen im KFZ entspricht. (...)

Das weiß ich. Der Arduino soll nicht direkt ans Bordnetz, die Versorgungsspannung soll vorher aufbereitet werden.

mgcss:
Als Alternative zu den Optokopplern kannst Du theoretisch auch einen Spannungsteiler nehmen. Gehen tut auch das :slight_smile:

Ja. Aber da komme ich ja alleine schon mit der Potentialdifferenz zwischen "leerer" Batterie und ladender Lichtmaschine soweit in Teufels Küche, dass ich nichtmals die 0.8-1xVDD Eingangsschwellen für das logische HIGH einhalten kann. So schlau glaube ich ja schon zu sein :wink:

Optokoppler ist meines Erachtens mit Kanonen auf Spatzen schiessen.

der MCP23S17 hat eingangsseitig 20mA Klemmdioden, die kann man zum Schutz verwenden.

Schaltungsvorschlag: vom 12V-Signal Spannungsteiler 22k/10k auf Masse. Von da über einen 10k auf den Eingangspin des MCP23S17 und noch einen 100n Kerko nach Masse.
Damit hast du Schaltschwellen von ca 2V und 8,5V.
Die Logik, ob der Schalter nun High oder Lowaktiv ist, macht man in Software.

In der Automobilindustrie verwendet kein Mensch Optokoppler, das wäre viel zu teuer.
Mehr augenmerk sollte man auf eine gut geschützte Versorgungsspannung legen.

Wenn man das Zeug kennt ist's wie immer einfach.

Guter Tipp, das Teil.

Okay, nachdem ich mich da wiederum versucht habe, einzulesen, kann ich dem Vorschlag folgen, danke!

Da im Auto bei laufendem Motor ja eher 14 - 14,4V herrschen, würde ich den Spannungsteiler umdimensionieren auf 33k/12k. Das ergibt eine Schaltschwelle von ca. 9,5V (wenn die Bordspannung da drunter fällt, habe ich andere Probleme...) und liegt bei Normalbetrieb noch gerade in der zulässigen Vdd(3,3V)+0,6V am Eingang des MCP23S17.
Darüber sprechen dann die Dioden im MCP an.

Ein Fall macht mir aber dabei noch Sorgen: Lichtmaschinenregler kaputt, kurzzeitig heftige Überspannung von z.B. 20V im Bordnetz. Beeinflusst mir das über die Schutzdioden des MCP die gesamte Betriebsspannung der Schaltung? Oder ist das bei dem durch die hohen Widerstände im Spannungsteiler + 10k in Serie am Eingangspin sehr geringen Strom vernachlässigbar?
Wenn nicht, sollte/könnte man das mit einer Zenerdiode auffangen?

Bezüglich der allgemeinen Spannungsversorgung der Schaltung werde ich noch ein eigenes Thema öffnen, sobald ich den Stromverbrauch der Schaltung genauer kenne.

Ja, im Auto herrscht rauhes Klima (zumindest im Bordnetz) und deine Annahmen mit "Überspannung: 20 Volt" würde ich durchaus als optimistisch bezeichnen :slight_smile:
Ich würde eher von 60 Volt oder mehr ausgehen...

Hier ein wenig Lesestoff:
de.sci.electronics-FAQ V3.60 Stand: 13.7.22 - das KFZ-Bordnetz
Kfz Spannungsspitzenkiller / Transientenschutz – Mikrocontroller.net

Auch hier im Forum wurde dieses Thema schon öffter aufgeworfen.

Hallo uxomm,

das ist mir relativ bewusst, die von dir genannten Links sind mir bekannt. Bei der Aufbereitung der Versorgungsspannung wollte/werde ich später u.a. auch darauf eingehen.

Die Frage ist jetzt eben: Muss ich jeden einzelnen Eingangspin, von dem ich nur LOW/HIGH wissen will, den fließenden Strom also extrem niedrig halten kann, so aufwändig schützen? Ich kann doch unmöglich 14 Stück 47µF Spulen auf die Platine bauen.

In dem Fall wäre der Optokoppler ja doch wieder plötzlich viel interessanter...