Liebe Foristen habe die in der Spezifikation rot markierte Siebensegmentanzeige mit 4 Digits, gemeinsamer Kathode und insg. 7 Anoden für die 7 Segmente. Jede Zahl wird über einen Transistor mit Basenwiderstand 1kOhm in rascher Folge an 0/5V an der Kathode angeschlossen und so die jeweils gewünschte Zahl dargestellt (Multiplexing?). Jedes Segment versorgt somit gleichzeitig immer nur ein Digit, daher stellen die Grenzen des Digital Output des Arduino (5V u. 40mA) und die Spezifikationen der Leuchtdioden (2V u. 10mA) kein Problem dar. Der Vorwiderstand ist bei 5V Versorgungsspannung entsprechend U=R*I => 5-2V=3V=U, I=10mA ==> R=U/I=3V/10mA=300Ohm. oberes Limit liegt bei 15mA bei den Dioden, daher liege ich mit 187Ohm unter 3V/15mA=200Ohm und muss hier also auf 200-300Ohm gehen. Jedoch steht im Datenblatt auch, dass maximal 60mA bei einer Pulsbreite von 1ms und Duty (Cycle) von 1/5 akzeptabel sind, das würde ja bedeuten, dass meine ~16mA (3V/187Ohm) bei einem Delay von 1ms und 3-4 Digits also einem Duty Cycle von 1/3 bis 1/4 vermutlich kein Problem darstellen? Hoffe ich habe die Ohm-Zahl richtig gelesen, habe 1500 im Set gekauft, da sind teilweise etwas seltsame Werte dabei (siehe Anhang). Wenn ich alle 4 Digits parallel anschalte, dann erhalte ich ja bei 10mA * 4 parallel =40mA Gesamstrom an jedem Digitalausgang und bin hier schon im kritischen Bereich des Arduino. Wenn ich eine Anzeige mit gemeinsamer Anode verwenden würde, dann bestünde dieses (theoretische) Problem nicht, da ich dann als Spannungslieferant den 5V Ausgang des Arduino nutze, der ~200mA liefern könnte, korrekt? Was spricht eigentlich prinzipiell dagegen die gemeinsamen Kathoden der Ziffern statt über Digital Pin > Basis des Transistor direkt über DigitalPins anzusteuern (0V/5V)? Vielen Dank, beschäftige mich jetzt seit rund einer Woche mit dem Thema Arduino + Schaltkreise und frische etwas die noch begrenzt vorhandenen Physik LK Kentnisse auf, bitte also darum meinen bescheidenen Wissensstand zu entschuldigen :) Wäre super, wenn mir jemand meine Überlegungen bestätigen oder widerlegen + erklären könnte. Bei Fritzing ist die Schaltung exemplarisch für 2 Digits dargestellt. Der laufende Code: http://codepad.org/XW81ImLn Falls jemand einen Tipp hat wie ich evtl. das schwache Leuchten eigtl. nicht aktiver Segmente vermeiden kann, wäre dankbar :) Felix
Beim Multiplexen wird die Stelle im 1-aus-4-Takt geschaltet, hier über Transistoren. Im worst case sind sieben Segmente aktiv, 70mA je Stelle, damit wäre der Digitalausgang ohne Transistorhilfe überlastet. Beim Segmentstrom sind die Segmente im worst case (8888 als Anzeige) bei allen vier Stellen aktiv, der Digitalausgang verträgt die 40mA gerade. Problem wird dann der Gesamtstromverbrauch des Kontrollers (280mA). Bei Wechsel auf gemeinsame Anode ändert sich das Problem nicht, außer die pins vertragen einen stärkeren sink- als einen source-Strom. Bessere Lösung wäre, die Vorwiderstände für einen kleineren Strom zu bemessen. Falls die Helligkeit dann nicht ausreicht, wäre der nächste Schritt die Wahl eines Display mit besonders gutem Wirkungsgrad. Das schwache Leuchten der nicht aktiven Segmente dürfte wohl an der Software liegen. Entweder sind die internen pull-ups noch aktiv. Oder es besteht ein Programmfehler: Prinzipiell muss nach der Aktivzeit einer Stelle Alles auf dunkel geschaltet werden und erst nach Anlegen der richtigen Segmentspannung darf die folgende Stelle eingeschaltet werden. btw: Ich liebe diese mehrstelligen Anzeigen. Sie vereinfachen den Druckstockentwurf gegenüber Einzelstellen erheblich. Nur bekommt man sie oft mit exotischer Verschaltung, besonders die Dezimalpunkte sind sehr individuell ausgelegt.
Es geht auch ohne Vorwiderstand: http://hackaday.com/2009/03/21/64pixels-are-enough/ https://sites.google.com/site/tinymatrix/
Womit zegeigt wird, das auch hackaday und Co. die Weisheit nicht gerade mit Löffeln gefressen haben. LED ohne Vorwiderstand ist NIE eine gute Idee.
Felix schrieb: > Jede Zahl wird über einen Transistor mit Basenwiderstand 1kOhm in rascher > Folge an 0/5V an der Kathode angeschlossen und so die jeweils gewünschte > Zahl dargestellt (Multiplexing?). Ja sollte so funktionieren. Wirst so auch keine Probleme mti dem Strom haben. So was habe ich auch schon gemacht. Warum kein FET? Da kannst du dir den Basiswiderstand sparen. Felix schrieb: > Wenn ich alle 4 Digits parallel anschalte, dann erhalte ich ja bei 10mA > * 4 parallel =40mA Gesamstrom an jedem Digitalausgang und bin hier schon > im kritischen Bereich des Arduino. Wenn ich eine Anzeige mit gemeinsamer > Anode verwenden würde, dann bestünde dieses (theoretische) Problem > nicht, da ich dann als Spannungslieferant den 5V Ausgang des Arduino > nutze, der ~200mA liefern könnte, korrekt? Bei jeder anderen Zahl musst du Multiplexen. Ich würde daher immer multiplexen, so umgehst du dieses Problem. Das kannst du nur machen, wenn alle Segmente den gleichen Wert haben. Daher würde ich es weglassen. Macht auch den Code nur noch komplizierter. Dass der Adruino 200mA liefert glaub ich nicht. Hier müsstest du auch einen PNP Transistor einsetzen. Felix schrieb: > Was spricht eigentlich prinzipiell dagegen die gemeinsamen Kathoden der > Ziffern statt über Digital Pin > Basis des Transistor direkt über > DigitalPins anzusteuern (0V/5V)? Würd ich nicht machen, da du sonst im Schlechtesten Fall 10mA * 7 Segmente = 70mA hast und das übersteigt wahrscheinlich die Spezifikation des Adrunio. Das solltest du aber besser wissen, da du damit arbeitest.
Erstmal vielen Dank für die schnellen Antworten! Wieso ich den Transistor nutzen muss um auf 5V/0V schalten zu können habe ich jetzt verstanden, da 70mA > 40mA. Dass insgesamt 70mA*4=280mA > sind als die 200mA, die der Arduino liefern kann, ist jetzt auch angekommen, hier müsste dann gegebenenfalls eine extra Stromquelle heran, die dann von dem Arduino nur über Transistoren oder ähnliches gesteuert wird, korrekt? Sehe gerade, dass evtl. doch bis zu 800mA max möglich sind, aber wohl jeweils aufgeteilt auf verschiedene Pingruppen. http://playground.arduino.cc/Main/ArduinoPinCurrentLimitations; dennoch iwie alles recht knapp bemessen für mehr als 40 DigitalPins. Vielen dank für die Bemerkung bzgl. sink/source, eigtl. logisch dass das Limit für den Strom in beide Richtungen gilt, dass war auch der Grund für meinen Denkfehler evtl. die Digits direkt an einen DigitalPin anzuschließen. Wieso keine FET? :) War mir als Bauteil nicht bekannt, da kann man den Vorwiderstand weglassen und direkt mit 5V/0V an die Basis? Werde es mir gleich mal anschauen :) Bzgl. des Leuchtens (zahl==-1 => alle Segmente werden ausgeschaltet), eigentlich werden immer alle entsprechenden Digits angeschaltet/ausgeschaltet, habe auch versucht hier ein Delay einzubauen, keine Besserung, eine Idee?
1 | digitalWrite(transistorpin2, LOW); |
2 | digitalWrite(transistorpin1, HIGH); |
3 | digitalWrite(transistorpin3, HIGH); |
4 | delay(2); |
5 | if (zahl==-1) |
6 | ansteuerung(10); |
7 | else
|
8 | ansteuerung(einer); |
9 | |
10 | |
11 | digitalWrite(transistorpin2, HIGH); |
12 | digitalWrite(transistorpin3, HIGH); |
13 | digitalWrite(transistorpin1, LOW); |
14 | delay(2); |
15 | if (zahl==-1) |
16 | ansteuerung(10); |
17 | else
|
18 | ansteuerung(zehner); |
19 | |
20 | |
21 | digitalWrite(transistorpin2, HIGH); |
22 | digitalWrite(transistorpin1, HIGH); |
23 | digitalWrite(transistorpin3, LOW); |
24 | delay(2); |
25 | if (zahl==-1) |
26 | ansteuerung(10); |
27 | else
|
28 | ansteuerung(hunderter); |
29 | |
30 | void ansteuerung(int a) { |
31 | delay(5); |
32 | for (int j=6; j>=0; j--) |
33 | digitalWrite(pin[6-j], bitRead(segmente2[a], j)==1?HIGH:LOW); |
34 | |
35 | }
|
kurzer Nachtrag: momentan laufen nur 3 Digits, da ich nur 3 Transistoren in meinem Bestand habe :)
Felix schrieb: > Bzgl. des Leuchtens (zahl==-1 => alle Segmente werden ausgeschaltet), > eigentlich werden immer alle entsprechenden Digits > angeschaltet/ausgeschaltet, habe auch versucht hier ein Delay > einzubauen, keine Besserung, eine Idee? Delay ist der falsche Weg. Multiplexing läuft immer über Timer und zugehöriger Interrupt Routine (und somit im Hintergrund der eigentlichen Anwendung)
Was passiert hier
1 | digitalWrite(transistorpin2, LOW); |
2 | digitalWrite(transistorpin1, HIGH); |
3 | digitalWrite(transistorpin3, HIGH); |
4 | delay(2); |
5 | if (zahl==-1) |
6 | ansteuerung(10); |
7 | else
|
8 | ansteuerung(einer); |
9 | |
10 | |
11 | digitalWrite(transistorpin2, HIGH); |
12 | digitalWrite(transistorpin3, HIGH); |
13 | digitalWrite(transistorpin1, LOW); |
du schaltest die Einerstelle frei und gibst dann das Muster aus. Danach schaltest du um auf die Zehnerstelle. Aber! Deswegen liegt ja immer noch das Muster aus der Einerstelle an! D.h. für ganz kurze Zeit zeigt die Zehnerstelle das LED-Muster der Einerstelle an. Und genau das siehst du in Form dieses Geisterleuchtens. d.h. deine Reihenfolge muss sein * sicherstellen dass nichts leuchtet und auch nicht leuchten kann (alle Transistorpins auf 'aus' schalten) * Muster ändern * die zugehörige Stelle einschalten Aber wie gesagt: das alles macht man nicht so, sondern in einem Timer-Interrupt, so dass reihum bei jedem Interrupt Aufruf die nächste Stelle eingestellt und angezeigt wird. Dieses Stelle leuchtet dann so lange, bis der nächste Interrupt Aufruf kommt, in dem dann auf die jeweils nächste Stelle weitergeschaltet wird. -> du musst dich damit beschäftigen, wie man im Arduino System Timer benutzt und eine Interrupt Service Routine an sie bindet.
Um dir trotzdem mal was zum Anschauen zu geben
1 | // alles aus
|
2 | digitalWrite(transistorpin1, HIGH); |
3 | digitalWrite(transistorpin2, HIGH); |
4 | digitalWrite(transistorpin3, HIGH); |
5 | |
6 | // Einer einstellen und ausgeben
|
7 | if (zahl==-1) |
8 | ansteuerung(10); |
9 | else
|
10 | ansteuerung(einer); |
11 | |
12 | // Saft auf diese Stelle - jetzt leuchten die LED dieser Stelle
|
13 | digitalWrite(transistorpin1, LOW); |
14 | |
15 | // leuchten lassen
|
16 | delay(2); |
17 | |
18 | // und wieder aus
|
19 | digitalWrite(transistorpin1, HIGH); |
20 | |
21 | // Jetzt die Zehner. Da alle Transistorpins HIGH sind,
|
22 | // KANN zum jetzigen Zeitpunkt nichts leuchten.
|
23 | if (zahl==-1) |
24 | ansteuerung(10); |
25 | else
|
26 | ansteuerung(zehner); |
27 | |
28 | digitalWrite(transistorpin2, LOW); |
29 | delay(2); |
30 | digitalWrite(transistorpin2, HIGH); |
31 | |
32 | // und noch die Hunderter
|
33 | if (zahl==-1) |
34 | ansteuerung(10); |
35 | else
|
36 | ansteuerung(hunderter); |
37 | |
38 | digitalWrite(transistorpin3, LOW); |
39 | delay(2); |
40 | digitalWrite(transistorpin3, HIGH); |
>Womit zegeigt wird, das auch hackaday und Co. die Weisheit nicht gerade >mit Löffeln gefressen haben. LED ohne Vorwiderstand ist NIE eine gute >Idee. Dazu fällt mir folgendes ein: Nichts auf der Welt ist so gerecht verteilt wie der Verstand Denn jedermann ist überzeugt, daß er genug davon habe (Rene Descartes )
Dein Beitrag hier war äusserst hilfreich für mich und mein Vorhaben, da auch ich zunächst angenommen hatte daß solche mehrstelligen LED 7 Segmentdisplays per Digital I/O Pin des Arduino (in meinem Fall der MEGA 2560 in der Rev- 3.0) durchaus über nur einem dieser I/O Pins des Arduino ansteuerbar wären. Allerdings verstehe ich zur Zeit immer noch nicht alles ! (denn auch das von mir verwendete 4 stellig 7 Segmentdisplay), entspricht exakt dem LED-Display hier http://www.pollin.de/shop/dt/OTUxOTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LED_Anzeige_ROHM_LC_204VL_4_stellig_rot.html Ich habe diesbezüglichst einen weiteren Beitrag hier erstellt, und es wäre nett insofern du dir diesen einmal durchlesen würdest und mir so eventuell einige Tips posten könntest, da ich der vollkommene NEWBIE in Sachen Schaltungsplanung bin. Mittlerweile lese ich auf nachfolgender Webseite allerdings, wie man die unterschiedlichen NPN oder PNP-Transistoren im Normalfall, einsetzen soll und so langsam wird mir das Schaltungsprinzip auch allmählich klar. Ich lasse den Link hier mal, welcher das Schaltungsprinzip der unterschiedlichen Transistoren erläutert. https://www.elektronik-kompendium.de/sites/slt/0208031.htm Für mich wäre es auch interessant zu wissen, in wie weit dieses Projekt im allgemeinen vorgeschritten ist, denn somit könnte ich mein Wissenspektrum erweitern, zumal ich das gleiche Led-Display, verwende. Zum Schluss hier noch der weitere von mir erstellte Post, insofern mal diese Posts zusammen legen möchte. Beitrag "7 Segmentanzeige (4stellig) am Arduino Mega 2560 Rev.3" Gruss: Lapster
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.