Forum: Mikrocontroller und Digitale Elektronik Arduino Siebensegmentanzeige


von Felix (Gast)


Angehängte Dateien:

Lesenswert?

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

von Peter R. (pnu)


Lesenswert?

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.

von chris (Gast)


Lesenswert?


von Leonard (Gast)


Lesenswert?

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.

von Gusti (Gast)


Lesenswert?

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.

von Felix (Gast)


Angehängte Dateien:

Lesenswert?

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
}

von Felix (Gast)


Lesenswert?

kurzer Nachtrag: momentan laufen nur 3 Digits, da ich nur 3 Transistoren 
in meinem Bestand habe :)

von Karl H. (kbuchegg)


Lesenswert?

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)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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);

von franz (Gast)


Lesenswert?

>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 )

von Norbert H. (lapster)


Lesenswert?

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
Noch kein Account? Hier anmelden.