Weekender: Blinkding

Hallo allerseits!

Wer mal wieder nicht weiß, was er mit seinem Wochenende anfangen soll, kann ein bisschen basteln.

Das Folgende basiert auf einem Irrtum: In einem Sonderangebots-/Restposten-Flyer habe ich Rot-Grüne-Duo-LEDs mit 10 mm Durchmesser entdeckt. Ich wusste zwar noch nicht, wofür ich sowas brauche (v. A. in dieser Größe), aber weil da etwas von 0,60 € stand, habe ich mal eine bestellt. Als das Ding hier eintraf, hatte ich auf einmal 9 St. zu viel, weil sich der Preis nicht auf ein Stück sondern auf ein Päckchen mit 10 Stück bezog.

Nunja, 9 ist 3 hoch 2 und weil ich immer ein paar Widerstände, Transistoren und Platinen sowie Reserve-Nanos auf Lager habe und gerne löte, habe ich mir eine 3x3-Matrix mit diesen Jumbo-LEDs gebastelt. Wenn ich genug damit gespielt habe, bekommt das mein Neffe, der zwar noch nichts von Elektronik versteht, aber schon entdeckt hat, dass man mit Arduinos viel Spaß haben kann. Außerdem kann man mit Duo-LEDs Farbspiele anstellen und Sachen wie PWM kennen lernen.

Den totalen Overkill kann man anrichten, wenn man sich für so eine Popel-Matrix auch noch eine Bibliothek schreibt. Aber sowas machen nur Kinder wie ich, nech.

Zur Schaltung: Eine LED ist sehr einfach anzuschließen. Man benötigt neben der LED nur einen Widerstand, um den Strom zu begrenzen. Meine Duo-LEDs haben drei Anschlüsse: Einen für jede der beiden Farben und einen für die gemeinsame Masse. Da je Farbe maximal 10 mA fließen dürfen, habe ich Widerstände mit 510 Ohm (R=U/I, 5V/0,01A=500) benutzt und diese in Serie mit der jeweiligen LED geschaltet:

Pin X o----\/\/\/\---->|-----o GND
          510 Ohm   LED

Wenn gerade keine Widerstände mit den richtigen Werten vorhanden sind, nimmt man welche mit höheren Werten. Die LEDs leuchten dann halt nicht so hell.

Die Software ist ebenso simpel. Man nehme das „blink“-Beispiel (https://www.arduino.cc/en/Tutorial/Blink oder in der IDE „Datei/Beispiele/01 Basics/blink“) und stricke es so um, dass statt einer LED zwei benutzt werden. Sodann kann eine Rot-Grün-LED in drei Farben leuchten: Rot, grün und gelb. Da bei meinen LEDs der Rot-Teil sehr dominant ist, wird aus Rot+Grün nicht Gelb, sondern ein ziemlich rotes Orange. Dementsprechend wird in meinem Programm in einer Schleife der Rot-Teil nur einmal ein- und wieder ausgeschaltet, während der Grün-Teil fünfmal so oft leuchten darf.

Was für Anfänger schwierig sein könnte, ist die Tatsache, dass in einer Matrix immer nur eine Zeile angesteuert werden kann. Damit ich die einzelnen Zeilen schalten kann, habe ich je Zeile noch einen Transistor und einen Widerstand verbaut. Der vollständige Schaltplan sieht so aus: http://test.szaktilla.de/matrix.jpg

Um eine Zeile leuchten zu lassen, stellt man zunächst die Pins ein, die die Spalten schalten (D7 bis D9 für rot, D10 bis D12 für grün) und schaltet dann die vollständige Zeile ein. Dann wartet man einen Moment, schaltet die Zeile wieder aus und setzt die Spaltenpins wieder auf Null. So schaltet man Zeile für Zeile erst ein, wartet einen Moment, und schaltet die Zeile dann wieder aus. Im Code sieht das zum Beispiel so aus:

void showLine(uint8_t line,
              bool led1red,
              bool led1green,
              bool led2red,
              bool led2green,
              bool led3red,
              bool led3green)
{
  // Werte der Zeile setzen
  digitalWrite(7,  led1red);
  digitalWrite(10, led1green);
  digitalWrite(8,  led1red);
  digitalWrite(11, led1green);
  digitalWrite(9,  led1red);
  digitalWrite(12, led1green);

  digitalWrite(line, HIGH); // Zeile einschalten
  delay(5);                 // einen Moment warten
  digitalWrite(line, LOW);  // Zeile ausschalten

  // Werte der Zeile wieder löschen
  digitalWrite(7,  LOW);
  digitalWrite(10, LOW);
  digitalWrite(8,  LOW);
  digitalWrite(11, LOW);
  digitalWrite(9,  LOW);
  digitalWrite(12, LOW);
}

Das LOW-setzen ist von der Logik her eigentlich nicht nötig, aber bei meinen Versuchen hat sich gezeigt, dass das Display ohne das LOW-setzen nicht wie erwartet funktioniert (es sieht dann so aus, als würden die Werte einer Zeile teilweise in die nächste „verschleppt“).

Die Funktion lässt die LEDs nur sehr kurz leuchten, d. h. dass man sie entsprechend häufig aufrufen muss, um es so aussehen zu lassen, als würden die LEDs permanent leuchten.

Das Leben kann man sich zusätzlich erleichtern, indem man die Funktion zum zeigen einer Zeile in eine Bibliothek packt. Wenn man obendrein eine Funktion schreibt, der man die Werte für alle LEDs auf einmal übergeben kann, muss man im Sketch nur Sachen wie diese schreiben:

 show(1, 0, 1, // Schachbrettmuster
     0, 1, 0,
     1, 0, 1);

Mit einer Funktion, die die Matrix invertiert, kann man sich das Leben weiter verschönern. Und falls Du keine Zeit oder Lust zum Basteln hast, kannst Du hier wenigstens sehen, wie mein Gebastel aussieht: http://test.szaktilla.de/film.mpeg

Wer sowas in ein nettes Gehäuse baut und an sein Relax-Rad schraubt bekommt ein Fleißbildchen.

Schönes WE!

Gregor

PS: Jetzt eine Nussecke. Mindestens :slight_smile:

it's cool mäännn ...

Och schade. Schade 1. weil ich nur einen einsamen UNO R3 habe, schnief, und 2. muss ich mit meinem "Hasilein.AT" gleich einkaufen fahren. Da besorge ich mir 'ne Packung Toffifee... I mog koane Nussecken :smiley:

Is egal, ich habe letztens bei Stony99 mit Combi diskutiert, ob man den UNO nicht unabhängig vom PC programmieren könnte - so mit Eingabe, Interpreter oder Compiler und so, auf Batterien für den Garten und am Strand. Erste Überlegungen und Versuche in diese Richtung sagen mir, dass das wunderbar klappen könnte. Die ersten Teile eines solchen Progis rennen schon - und der Rest? Na ja, wäre nur Hexenwerk, wenn ich so etwas nicht schon mal gemacht hätte. I hob Assembler so unendlich liab - und der Lötkolben kann mir nit die Nosn verbrutzeln... DAS ist mein WE-Projekt...

Ebenso schönes Weekend
:smiley:

Autotranslate:
Nosn = Nase

RudiDL5:
Da besorge ich mir 'ne Packung Toffifee... I mog koane Nussecken :smiley:

Gefällt mir!

hi,

nach Deiner beschreibung und zeichnung hast Du dann für jede LED zwei widerstände verwendet?

gruß stefan

Eisebaer:
nach Deiner beschreibung und zeichnung hast Du dann für jede LED zwei widerstände verwendet?

Ja. Du hättest auch den letzten Link klicken sollen :-))

Gruß

Gregor