ULN2803 in Verbindung mit Arduino für LEDLauflicht

  • Guten morgen liebes Forum,
    dies hier ist mein erster Beitrag nachdem ich mich hier ein wenig einlesen konnte, jedoch sind zu meinem Projekt einige Fragen offen geblieben die ich mir aus den bestehenden Theards nicht beantworten konnte und ich hoffe jetzt auf eure Hilfe.


    Ich habe momentan ein Projekt, das besteht aus zwei unabhängig voneinander arbeitenden Schaltungen. Meine Schaltungen werden mit einem Arduino Mini Pro betrieben, dies hat die Aufgabe je nach Schaltung 7 bis 12 Leds als Lauflicht zu schalten.
    Jeder Pin am Arduino hat seine eigene Led, da die Leds aber mit 150mA arbeiten kam für mich beim Bau der Schaltung nur ein Transistor pro Led in Frage.
    Die LEDs schalten fleißig nach Masse und die Schaltung funktioniert bisher tadellos, obwohl ich sagen muss, dass das Programm sehr sehr einfach geschrieben ist.
    Da ich die Schaltungen optimieren möchte und etwas verkleineren möchte habe ich gelesen, dass ein ULN2803 keine schlechte Wahl ist. Dieser ULN2803 ist ja nichts Anderes als eine Anreihung von Transistoren die nach Masse schalten und dies kommt mir aufgrund Platzmangel sehr gelegen. Der Platzmangel ist nicht der einzige Faktor, ich finde es angenehmer statt 14 Bauteile (Transistoren und deren Vorwiderstände) nur 1 zu Nutzen (ULN2803).
    Die LEDs werden alle nacheinander mit einer Verzögerung von 50ms geschalten und bleiben gemeinsam ca. 1000ms an, dies Wiederholt sich bis zu 10 mal bis das Programm fertig ist.
    Die LEDs und der Arduino werden durch einen StepDown Converter mit einer Ausgangsspannung von 5V gespeist. Aufgrund der vielen LEDs würde ich auch 2 ULN2803 schalten, die Strommenge pro LED würde ich zwischen 100mA und 150mA beibehalten wollen.
    Jetzt kenne ich mich nicht mit dem ULN2803 aus und ich brauche Hilfe beim Bau meiner Schaltung, anbei habe ich mal auf die schnelle eine Skizze meiner Schaltung als Schaltplan gemacht, wie ich sie momentan habe und wie diese gerne haben wollen würde.
    Mein Programm ist wie gesagt sehr einfach aufgebaut, ungefähr so:
    "Pin1 - High
    delay 50
    Pin2 - High
    delay 50
    Pin3 - High
    usw. "diese Programmstrucktur würde ich gerne beibehalten wollen, falls dies möglich ist mit dem ULN2803.


    Hoffe, dass dies schon als Vorinformation ausreicht, bin momentan im Anfang für diese Schaltung.


    Vielen Dank Reddix :)

  • Hi reddix,

    Der Platzmangel ist nicht der einzige Faktor, ich finde es angenehmer statt 14 Bauteile (Transistoren und deren Vorwiderstände) nur 1 zu Nutzen (ULN2803)


    Dazu kommt noch, dass es auch günstiger ist.


    Aufgrund der vielen LEDs würde ich auch 2 ULN2803 schalten, die Strommenge pro LED würde ich zwischen 100mA und 150mA beibehalten wollen.


    Der Baustein kann zwar einen einzelnen Ausgang bis zu 500mA treiben, allerdings gibt hier zwei wesentliche Dinge zu beachten:
    a) Die Sättigungsspannung bei diesen Bausteinen ist relativ hoch, da fällt zwischen Collector-Emitter gut ein ganzes Volt ab. Diese Uce Spannung muss man beim Berechnen des LED-Stroms mit beachten. Bei einer weissen LED fällt also ca. auch ein Volt am Vorwiderstand der LED ab.


    b) Die Verlustleistung ist wegen dieser hohen Uce auch ziemlich hoch, bei 8 belastende Ausgänge mit 150mA dürfte der IC zu heiß werden. 100mA dürften aber so gehen. Ein kleiner Kühlkörper draufgeklebt kann nicht schaden.


    Gruß Gerd

  • Danke für deine Antwort Gerd_ ,


    so habe ich mir das vorgestellt.
    Das Programm läuft maximal 1Minute lang, über die Hitze mache ich mir jetzt keine all zu großen Gedanken.
    jetzt habe ich zwei Verständnisfragen, wenn die Led eine Versorgungspannung von 2,6V hat und die Ausgangsspannung 5V Neträgt, benötige ich bei einer 100mA Led keinen Vorwiderstand von 27 Ohm sondern einen von 15 Ohm weil die Versorgungsspannung durch den Abfall von 1V beträgt und somit die Versorgungsspannung der LED von 2,6V auf 3,6V erhöht werden muss, richtig??


    Und was ist mit dem Vorwiderstand zwischen IC Pin und dem Pin vom ULN2803? Fällt der weg?


    kann ich vom Arduino weiterhin auf "high" schalten, oder muss ich beim Programm etwas berücksichtigen?



    gruss


    reddix

  • Hi,


    bei 100mA ist die Sättigungsspannung von Uce beim ULN typischerweise ca. 0,85V (Figure1 im Datenblatt).
    Bei 5V Systemspannung fallen also an der LED und dem Treiber ULN gesammt 3,45V ab > bleiben also am Vorwiderstand der für die LED 1,55V.
    Nach ohmschen Gesetz kommt man also auf 15,5 Ohm, somit hast du schon richtig gerechnet.


    Zwischen Arduino-Ausgangspin und dem ULN2803 muss kein Widerstand, der Basiswiderstand sitzt bereits im ULN drin (sieht man auch im Funktional Block Diagramm im Datasheet)


    Gruß Gerd

  • Ich finde, der ULN hat sich technisch überholt (ist ca. 20 Jahre alt, das Ding).
    Preislich kann man sich ebenfalls streiten. Bedrahteter Widerstand 2-3 Cent das Stück, wenn man 100'er Packs kauft. SMD oder in Sortimenten wirds noch billiger. Ein TO92 Transistor, oder SMD was im SOT23 kostet 4 Cent rum. Ich habe eine angefangene 1000'er Tüte - kein Tippfehler! Wovon noch ca. 900 da sind. Sind SC206 DDR-Transistoren mit 100mA max. Kollektorstrom. Da verheize ich erst mal die :D
    Auch strommäßig machst du mit dem ULN nichts gut. Der kann zwar pro Ausgang max. 500mA, in Gesamtsumme p. IC aber nur maximal 800mA.
    Eine weitere Möglichkeit wäre ein LogicLevel MOSFET. Entweder ein IRLZ 24/34 oder 44, oder auch SMD "Vogelfutter". Oder vom 74HC595 gibt es auch Varianten, die einen Treiber gleich mit drin haben.
    Mit dem Code kann ich dir was schicken, sobald ich wieder zu Hause bin.
    Habe da mal was Ähnliches gemacht. Ein Werbeschild, wo ich 7 oder 8 Ausgänge angesteuert habe.
    Met mit einem Pfeil. Das ging M, ME, MET MET 3x blinken dann zu MET >>>> die Pfeilspitzen als Lauflicht, dann zu MET ---> den Pfeil blinken lassen :)
    Nach etwas Denkanstoß durch das Arduinoforum habe ich dann mit Arrys gearbeitet, so das ich pro Zustand nur das LED Muster und die Zeit angeben brauchte.
    Habe das Ganze aus 4 parallelgeschalteten 18650 LiPo Zellen gespeist. Den Controller direkt aus der Zelle und mit einem LM2577 StepUp auf 12V dann Segmente aus LED Stripes. Das IC bekam einen kleinen Kühlkörper, weil aus dem LiPo schon mal sportliche 2A kurzzeitig gezogen wurden. Ein Akkupack hielt ca. 4h durch. Von den Akkus habe ich genug, da es mal bei Pollin gebrauchte Laptop-Akkus billig zum schlachten gab.

  • Hi,
    nun ja alt ist der Baustein sicher, allerdings wird er immer noch produziert.
    Für Neuentwicklungen in kommerziellen Produkten würde ich ihn allerdings auch nicht einsetzen.
    Ein 2803 kostet bei Reich... grad mal 34cent, wohlgemerkt ein einzelner keine im 1000er Pack.
    Für reddix projekt reicht der also gut.


    Bei der Variante mit den LogigLevel MOSFET könnte man auch bei SMD auf zweifach Typen gehen in SO8 (dual n-channel)


    Gruß Gerd





  • Also ich muss sagen, dass ich den ULN2803 wegen seiner kompakten Größe ziemlich interessant finde, der kommt mir echt gelegen. Ich hatte meine Prototypschaltung damals mit Transistoren gebaut, und die war echt aufwendig, vorallem hatte ich nicht soviel Platz auf der Platine, musste alles zusammenrücken. war echt eng.
    Also für ein Programm wäre ich aufjedenfall sehr dankbar. Ein kleiner Tipp wie man so ein Programm schreiben kann würde mir echt gelegen kommen, vorallem weil ich so ein ähnliches Vorhaben habe wie du. :)

  • Ich habe eine Verständnisfrage:


    ich würde gerne mein Arduino Mini Pro in der oberen Schaltung mit dem Attiny ULN2803 tauschen.
    Die Spannungsversorgung wird über einen Step-Down Auf 9V geregelt.
    Wie müsste der Attiny gesichert werden am VCC? Ich habe gedacht mit einem Spannungsregler auf 3.3V und einem 100nF Keramikkondensator.
    Die soll im Fahrzeug getestet werden, die Spannungspitzen dürften ja durch den Regler bereits absobiert werden.
    Jemand ein Tipp für mich?
    ahja der Spannungsregler ist ein XL4015. Der regelt nur die Spannung, keinen Strom.
    Die 9V brauche ich für die Leds es werden immer 2x 2.2V Leds geschalten.



    Gruß


    reddix

  • Prinzipiell liegst du schon mal richtig. Die Massen werden verbunden. Ich würde, wenns is KFZ soll, noch eine Sicherung in die Boardspannungsleitung setzen und eine 15V Transieldiode dahinter, die die Spannungsspitzen killt. Sowas hier: http://www.tme.eu/de/katalog/h…ams=243%3A24611%3B&page=1
    Gibts auch als SMD, wenn du Platz sparen willst ;)
    Die 9V willst du für die LEDs, pro Strang 100-150 mA, bei 16 Strängen kann da schon ein bisschen was an Strom zusammenkommen. Als 9V Regler würde ich deshalb einen Schaltregler verwenden, da ein Linearregler die Spannungsdifferenz mal den durchfließenden Strom verheitzen muß. Das wären im KFZ bei laufendem Motor 14V - 9V macht 5V x 1,5-2A. Für einen Liearregler schon heftig viel und ohne KK nicht mehr zu stemmen. Für den Pro Mini, oder was du nehmen wolltest, langt ein Linearregler. Pass aber auf, die Ansteuerströme für die Eingänge des ULN können sich auch läppern, so das der 3,3V Linearregler. Habe gerade mal ins Datenblatt vom ULN geguckt, Eingangsstrom um die 1mA p. Eingang. Da kommen also nur maximal 16-20mA zusammen, plus nochmal die selbe Größenordnung für den Arduino, das schafft der Linearregler noch zu verheizen. Anders sähe es aus, wenn da p. Eingang z.B. 10 mA reinrauschen würden, dann wäre der kleine Linearregler in der Summe überfordert :D
    Aber wenn du Die LEDs über die 9V Zwischenspannung speisen willst, würde ich zusehen, das ich die Zwischenspannung noch weiter runternehme, z.B. auf 6V. Der 3,3V Regler wird 1,5-2V Drop rum brauchen, also langen als Zwischenspannung auch 6V. Dann mußt du an den LED Vorwiderständen nicht so viel Leistung verheizen. Bei einem Schaltregler reduziert sich bekanntlich der Eingangsstrom, da die Leistung abzüglich der Schaltverluste transformiert wird. Das Boardspannungsnetz wird also nicht mit 1,5-2A belastet, sondern mit unter 1A und den Wirkungsgrad erhöhst du, indem die Vorwiderstände der LEDs weniger verheizen müssen.

  • Ich hatte ja versprochen, das ich den Code noch posten wollte, was hiermit geschieht :)



    Zunächst habe ich alle möglichen Kombinationen, die ich verwende, in ein Arry gepackt. In void shift595 wurde dann die Funktion definiert, wo man die Arryzelle und die Darstellungszeit definiert. Prinzipiell ließe sich sogar noch das hier statisch verwendete analogWrite mit einflechten und dann als dritter Parameter aufrufen.