5 x 7 DOT LED Matrix Verständnisfrage

Hallo Leute.

Seit einer Woche ca. spiele ich nun mit meinem neun Arduino rum und versuche alles zu verstehen, was ich bisher an Schaltungen gebaut habe. Das gelingt mir auch ziemlich gut. Ich arbeite da mit dem Buch vom Oreilly Verlag - Arduino Physical Computing. Nun bin ich bei dem Ersten Beispiel mit einer LED Matrix angelangt. Ich habe mir diese besorgt und auf eine Lochplatine gelötet. Das Datenblatt bekommt man hier: http://www.alldatasheet.com/datasheet-pdf/pdf/232968/KINGBRIGHT/TA20-11EWA.html Das Auflöten war kein Problem. An die PINs 1,2,5,7,8,9,14 habe ich jeweils einen 150Ohm Vorwiderstand gelötet. PIN 4 und 12 habe ich freigelassen, da diese ja doppelt belegt sind. So nun steht in meinem Buch, dass die Reihen (die Pins 1,2,5,7,8,9,14) an die Arduino Pins 1-7 angeschlossen gehören und die Spalten an die Arduino Pins 8-12. Dies widerspricht jedoch dem was ich bisher gelernt habe, das wenn ich eine LED habe Katode an GND angeschlossen gehört. Ich verstehe das ganze nicht und habe etwas angst, dass ich am Arduino etwas zerstöre. Irgendwie muss doch ein Stromfluss zusammen kommen und wie soll das geschehen, wenn ich keinen Anschluss an GND vornehmen, oder können die Digitalen eingänge des Arduinos auch als GND fungieren? Könne mir das jemand vielleicht kurz erklären, bevor ich die Matrix an den Arduino hänge? Danke!

Jeder digigitale Pin des Arduino bzw. des verwendeten Mikrocontrollers kann entweder High oder Low ausgeben. Dabei entspricht High nahezu 5V, Low 0V, ist also der Masse gleichzusetzen. Dass heißt, du kannst von einem Ausgangspin (High) zu einem Ausgangspin auf Low einen Strom fließen lassen.

Oh ok, so in etwa habe ich mir das schon gedacht. War mir nur nicht sicher und wollte nichts zerstören. Vielen Dank für die einfache Erklärung. Schade, dass dies nicht in dem Buch so beschrieben ist.

Ne frage noch:

Was passiert, wenn ich beispielsweise pin 1 und pin 2 am arduino auf HIGH schalte und beide zusammen schließe? Raucht dann was ab? normal nicht, oder?

Nun hab ich noch ein Problem mit dem Code. Wenn ich diesen Code aufspiele leuchten alle LEDs der Matrix, es sollten aber nur die LEDs leuchten, die in der 8Bit Variable auf 1 gesetzt sind. Was stimmt denn da nicht?

// definiere Zeilen und Spalten als Array vom Typ uint8_t 
uint8_t rows[7] = {1, 2, 3, 4, 5, 6, 7}; 
uint8_t columns[5] = {8, 9, 10, 11, 12}; 
void setup() {
for (int i = 0; i < 7; i++) { 
  pinMode(rows[i], OUTPUT);
} 
for (int i = 0; i < 5; i++) {
  pinMode(columns[i], OUTPUT);
  }
}

void loop() {
  showMatrix();
}
// Definiere eine 7x5-Matrix. uint8_t ist eine vorzeichenlose 8- 
// Bit-Integer-Variable. Setze das Muster so, dass eine Diagonale 
// angezeigt wird. 
uint8_t matrix[7][5] = {
{ 1, 0, 0, 0, 0}, 
{ 0, 1, 0, 0, 0}, 
{ 0, 1, 0, 0, 0}, 
{ 0, 0, 1, 0, 0}, 
{ 0, 0, 1, 0, 0}, 
{ 0, 0, 0, 1, 0}, 
{ 0, 0, 0, 0, 1},
};

void showMatrix() { 
  // durchlaufe alle fünf Spalten 
  for (int x = 0; x < 5; x++) {
    // setze vorherige Zeile auf 0 
    // für jede Zeile setze den Wert der Matrix auf den 
    //entsprechenden Pin 
    for (int y = 0; y < 7; y++) {
      digitalWrite(rows[y], !matrix[y][x]);
    }
  // setze aktuelle Spalte auf 1 
  digitalWrite(columns[x], 1); 
  delay(1); 
  // Lösche aktuelle Spalte 
  digitalWrite(columns[x], 0);
}
}

Ein Fehler im Programm ist mir gerade nicht aufgefallen. Funktioniert deine Matrix rihtig? also wenn du +5V an eine Spalte anlegst und mit 0V (Masse) an die einzelnen Zeilen? Prinzipiell würde ich immer zuerst die Hardware checken…

Wenn mann zwei Ausgange, die auf 5v geschaltet sind, beruhrs pasiert nichts.

Bei deinem code mussten rows immer auf LOW, 0V gesetzt sein, da du leds benuntz.

So hab die Hardware nochmals gecheckt, und einen Kontaktfehler behoben. Leider leuchten noch immer alle LEDs auf und nicht das bild wie in der Matrix Variable.

So, ich habe nun mal das invert Zeichen (!) aus der Zeile

digitalWrite(rows[y], !matrix[y][x]);

entfernt

digitalWrite(rows[y], matrix[y][x]);

Jetzt wird auf der Matrix endlich mal was einigermaßen richtiges angezeigt. Jedoch leuchten alle LEDs die nicht leuchten sollen. Normal sollten jedoch ja nur die LEDs leuchten, deren wert in der Matrix-Variable auf 1 gesetzt sind, oder? Dies sollte ja das Invert ! bewirken.

Nein, Du kannst keine Ausgänge des ATmega paralellschließen; so machst Du den Controller kaputt.
Grüße Uwe

Ähm, worauf bezog sich deine Antwort?

Meine Antwort bezog sich auf Reply #3 die Frage:

Was passiert, wenn ich beispielsweise pin 1 und pin 2 am arduino auf HIGH schalte und beide zusammen schließe? Raucht dann was ab? normal nicht, oder?

Grüße Uwe

@Uwe... verstehe ich nicht...was sollte denn kaputt gehen ??? Es besteht doch keine Potentialdifferenz !? (mal abgesehen von der grundsätzlichen Fragwürdigkeit die Ports zusammen zu schalten)

wenn man zwei Ausgänge gleichzeitig, absolut gleichzeitig´, auf HIGH schaltet, kann es gut gehen.

Das digitalWrite braucht einige Zyklen. Die Ausgänge werden mit hoher Wahrscheinlichkeit nicht gleichzeitig gleiches Potential erreichen.

Es wird nicht qualmen... Atmels sterben leise ;)

Uwe hat da absolut recht! Egal ob push-pull, totem-out oder was auch immer. Ausgänge zusammenschalten ist babba... NO GO... außer zu Silvester

(mal abgesehen von der grundsätzlichen Fragwürdigkeit die Ports zusammen zu schalten)

Natürlich ist das nicht sinnvoll, jedoch können ja auch Schaltungsfehler passieren, oder Programmierfehler. Deswegen habe ich mal nachgefragt, weil sowas wird grundsätzlich in keinem Buch erwähnt.

Hallo Alle zusammen

Die Paralellschaltung von Ausgängen (Transistoren) möglich aber etwas kritisch.

Man muß zwischen BipolarTransistoren BJT (bipolar junction transistor, PNP und NPN) und FET unterscheiden. Da Halbleiter niemals 100% gleich gefertigt werden können, sondern immer minimale Paramenterstreuung haben ist bei einer Paralellscheltung imer ein Element das mit mehr Strom durchflossen wird als das andere.

Bei BipolarTransistoren erwärmt sich das mit mehr Strom beaufschlagte Element mehr und wird dadurch niederohmiger - es fließt noch mehr Strom - wird noch heißer ecc bis es Durchbrennt.

Bei Paralellschaltungen von BipolarTransistoren müssen immer Widerstände in Collektor oder Emitterkreis vorgesehen sein, die dann den Strom durch jeden einzelnen Transistor begrenzen. Dadurch hat man größere Verluste, sodaß es besser, ist einen größeren, teureren Transistor zu nehmen als 2 kleinere und billigere.

Bei FETs ist es anders. Ich kann es nicht für alle Typen von FETS hier ausführen. Für MOSFETs kann ich sagen daß sie Paralell geschalten werden können da sie im gesamten einen positiven Temperaturkoefizienten haben und so bei Erwärmung hochohmiger werden und so den Strom begrenzen. Dies ist aber nur durch Teoretisches Wissen über die Natur des verwendeten Transitors 100% richtig zu entscheiden.

Bei ICs können Ausgäge paralellgeschaltet werden wenn sie: 1) Tristate Ausgänge sind. (haben außer HIGH, LOW noch eine Hochohmigen Zustand und alle Ausgange außer einem sind hochohmig). 2) es sind OpenCollektor oder OpenDrain - Ausgänge. Der Ausgangstransistor schaltet nur nach Masse und den High-Pegel ist durch einen Widerstand gegeben. Dabei ist wieder zu beachten daß dadurch nicht umbedingt der doppelte Stom eines einzelnen Ausgangs geschaltet werden kann. 3) es sind MOSFET- Ausgänge. Da es schwer ist als Elektroniklaie diese Information aus den Datenblättern zu estrahieren und dies einen Elektronikamateur schnell überfordert ist es besser diese Option zu vergessen.

Grüße Uwe