Funduino MEGA2560 Charlieplexer Lauflicht verhält sich merkwürdig

Hallo zusammen,
Ich habe mir kürzlich einen Funduino MEGA gekauft und versuche damit ein Lauflicht mit Charlieplexed LEDs zu erstellen.
Insgesamt verwende ich 20 LEDs zu je 3 6er und einer 2er Gruppe. Damit soll ein Deko-Christbaum beleuchtet werden.
Die Abfolge der LEDs habe ich mir schon überlegt und auch bereits das Programm geschrieben. Wenn das Lauflicht gewünscht wird, wird ein Index in regelmäßigen Abständen hochgezählt und die nächsten LEDs beginnen zu leuchten, quasi eine Schrittkette. Nur manchmal scheint das Programm etwas zu machen, was ich nicht ganz nachvollziehen kann: alles LEDs gehen aus, und erst wenn der Index wieder bei 1 angekommen ist, beginnt das Lauflicht wieder. Ich kann mir das nicht ganz erklären. Wenn ich mir den Wert des Index in der Konsole anzeigen lasse, kann ich nichts auffälliges entdecken. Der Index zählt auch brav weiter wenn die LEDs ausfallen. Ich habe einige Durchläufe beobachtet und habe gemerkt, dass die Ausfälle nur bei den Schritten 5, 7 und 9 stattfinden. Wie gesagt, der Index läuft trotzdem weiter somit kann ichs mir nicht erklären, warum die LEDs alles ausfallen. Die Kontroll LED ist immer auf true und fällt auch nie aus. Ich hoffe ihr könnt mir weiterhelfen.
Bitte seid nachsichtig bezüglich meines Codes :wink: ich programmiere erst seit kurzem (wieder) :wink:

sketch_dec08b.ino (18.6 KB)

Hi,

hast Du mal zusammengerechnet, wieviel mA die LEDs im "besten Fall" (max.) ziehen, und das mit dem Datenblatt des Mega abgeglichen?
Nur eine Vermutung, denn mehr kann man ohne Schaltplan kaum herauslesen.

Gruß André

Aufgrund der Länge muss ich leider einen pastbin

pastebin Dinger stecke ich mir nicht in den Mund

hast Du mal zusammengerechnet, wieviel mA die LEDs im "besten Fall" (max.) ziehen, und das mit dem Datenblatt des Mega abgeglichen?

Hmmm.....

[ ] Ich weiß, wie Charlieplexing funktioniert

[ ] Ich könnte mich mal kundig machen

Hab ca. 100mA Stromaufnahme. Bei Charlieplexing leuchten ja nie effektiv alle LEDs gleichzeitig sondern es wird lediglich schnell umgeschaltet, es leuchten also grob immer nur maximal 5 gleichzeitig.

Hi

Die vielen Code-Duplikate schreien förmlich danach, in Funktionen ausgelagert zu werden.
Leider warst Du mit Kommentaren sehr sparsam und sorry, ich bräuchte dafür schon grob, wie der Kram eigentlich funktionieren SOLL, was Du Dir wo gedacht hast.

Monster trifft's eigentlich ganz gut ... viel viel Arbeit steckt da drin, leider nahezu unwartbar.

MfG

Edit Was so für pastebin spricht ... When this paste gets automatoically deleted in 29 days
Also in einem Monat ist der Thread hier zur endgültigen Löschung prädestiniert, weil Nichts und Niemand sich was aus diesen Posts zusammen reimen können wird.

Ich weiß, es geht bestimmt auch kleiner :wink: aber wie gesagt sind meine C Kenntnisse noch begrenzt :wink:

Die beiden hardcoded Pins sind im Moment nur zu Testzwecken, der Eingang ist ein Taster um automatik ein und aus zu schalten und der Ausgang ist eine LED die ständig leuchtet unabhängig vom Lauflicht (um zu sehen ob im Programm was nicht stimmt, oder ob der ganze Arduino abschmiert).
Ich habs mit 5 Pins versucht, allerdings wird die Helligkeit dann sehr gering wenn "alle" leuchten. Durch die Aufteilung auf mehrere Gruppen erreiche ich eine höhere Helligkeit bei Komplettansteuerung. Es sind 11 Pins im Einsatz.
Ich werde gleich nen ordentlichen Schaltplan zeichnen

firefist235:
Aufgrund der Länge muss ich leider einen pastbin Link posten

Musst Du nicht, Du kannst den Code auch als Attachment hier an den Beitrag anhängen.
Da bleibt die Info erhalten.

Gruß Tommy

Sorry, ganz vergessen, dass ich auch attachments posten kann :wink: habe ich gerade nachgeholt.

Anbei der Schaltplan.

Sinn der Übung ist die Beleuchtung eines Dekochristbaums ähnlich dem hier:

Durch das Lauflicht soll erst die untere Reihe beleuchtet werden, danach kommt die nächste dazu usw.

Bleibendes Bild:
1bb712ff5c8570f288aa1616ade8f065.jpg

Schaltplan:

1bb712ff5c8570f288aa1616ade8f065.jpg

Hi

Also hast Du VIER Charly-Plexing-LED-Gruppen - klar, daß bei 1/6tel LEuchtdauer 'MEHR' raus kommt, als wenn Du sämtliche LEDs in das Charly-Plexin einbeziehst.
Damit ist natürlich der Sinn des Charly-Plexing - so wenig Pins wie möglich für diese Zahl an LEDs - hinten runter.

Anderer Vorschlag: WS2812B

MfG

Hallo,

wegen der reduzierten Helligkeit wird dann im erlaubten Bereich der Led Strom erhöht, weil der dann gepulst ist.
Nur können die Ströme dann nicht mehr von den µC Pins geliefert werden. Andere Idee wäre einen MAX7219/MAX7221 zu verwenden oder hier lesen LED-Matrix – Mikrocontroller.net

Vielen Dank für eure Hilfe,
Es geht mir allerdings nicht um die Ansteuerung der LEDs, das funktioniert ja an sich. Ich versteh nur nicht, warum plötzlich alle LEDs ausgehen bis der Index wieder von vorn beginnt.
Habe jetzt den Lauflichtindex probeweise rückwärts laufen lassen, bis jetzt konnte ich keine Ausfälle sehen :confused:

Das sieht komisch aus:

lauflichtindex1 4 LEDWahlGruppe1 3 LEDWahlGruppe2 3 LEDWahlGruppe3 3 LEDWahlGruppe4 0
lauflichtindex1 4 LEDWahlGruppe1 4 LEDWahlGruppe2 1 LEDWahlGruppe3 4 LEDWahlGruppe4 0
lauflichtindex1 5 LEDWahlGruppe1 0 LEDWahlGruppe2 0 LEDWahlGruppe3 0 LEDWahlGruppe4 0
...
    ausgabe();

  // GRUPPE 1
  switch (LEDWahlGruppe1)
...
void ausgabe() {
  Serial.print("lauflichtindex1 "); Serial.print(lauflichtindex1);
  Serial.print("\tLEDWahlGruppe1 "); Serial.print(LEDWahlGruppe1);
  Serial.print("\tLEDWahlGruppe2 "); Serial.print(LEDWahlGruppe2);
  Serial.print("\tLEDWahlGruppe3 "); Serial.print(LEDWahlGruppe3);
  Serial.print("\tLEDWahlGruppe4 "); Serial.print(LEDWahlGruppe4);
  Serial.println();
}
      else if (LEDWahlGruppe1 == 3 && LEDWahlGruppe3 == 3)
        {
          LEDWahlGruppe1 = 4;
          LEDWahlGruppe2 = 1;
          LEDWahlGruppe3 = 4;
          break;
        }

Oder?

Danke Leute, aber vergessen wirs fürs erste. Ich fang einfach nochmal von vorne an und versuche alles ein bisschen strukturierter zu schreiben.

Übrigens, nur mal eine Anmerkung : Eine LED auf Daueran zu schalten ist kein Beweis dafür das das Programm
läuft ! Der entsprechende Pin bleibt auch auf HIGH wenn das Programm schon lange abgesemmelt ist.
Ich benutze für so was immer eine "Heartbeatled" also eine die langsam vor sich hin blinkt.
Das Blinken steuer ich aus der Loop. Blinkt es wird zumindest die Loop noch komplett durchlaufen.

Ulli

Hast recht, danke für den Tipp :wink:

Wenn Du offen bist für Alternativen:

  • Schieberegister vom Typ 595
  • MCP23017
  • APA102 / WS2812 gibt es als Streifen oder als 5 mm LED (siehe mein Avatar), da geht auch bunt. Am Arduino benötigst Du zwei oder einen Pin.

Danke agmue, aber dass ich zusätzliche ICs ordnungsgemäß einsetzen kann, bin ich noch ein Stück entfernt :wink:

Habs aber halbwegs hinbekommen. Die eigentliche Ansteuerung der LEDs habe ich in eine eigene Funktion verlegt. Die Funktion wird mit einem Int entsprechend der LED-Nr und den zu verwendenden Pins aufgerufen. Die Ansteuerung für das Lauflicht liegt ebenfalls jetzt in einer eigenen Funktion. Funktioniert gut, wenn ich das Lauflicht nur in eine Richtung laufen lassen will und am Ende wieder von 0 starte. Wenn ich das Lauflicht hoch und wieder runterlaufen lassen will, scheint es als ob das Programm am Anfang oder am Ende manchmal "hängen" bleibt. Der "Timer" gibt einen Takt für die Schritte vom Lauflicht vor.

Deklarationen über Loop

bool takt = false;
int lauflichtSchritt = 1;
int schritt = 1;
unsigned long alteMillis = 0L;
unsigned int intervall = 75;

In Loop

  // Timer
  if (millis() - alteMillis >= intervall)
  {
    alteMillis = millis();
    takt = true;
  }
  else
  {
    takt = false;
  }

 // Schritt für Lauflicht setzen
  if (takt == true)
    lauflichtSchritt = lauflichtSchritt + schritt;
  if ((lauflichtSchritt > 10) || (lauflichtSchritt < 1))
//    schritt = -schritt; // VERURSACHT "AUSSETZER"
      lauflichtSchritt = 0; // FUNKTIONIERT

Lauflicht Funktion

void Lauflicht()
{
  switch (lauflichtSchritt)
  {
    case 0:
      LED[1] = true;
      LED[2] = false;
      LED[3] = false;
      LED[4] = false;
      LED[5] = false;
      LED[6] = false;
      LED[7] = true;
      LED[8] = false;
      LED[9] = false;
      LED[10] = false;
      LED[11] = false;
      LED[12] = false;
      LED[13] = true;
      LED[14] = false;
      LED[15] = false;
      LED[16] = false;
      LED[17] = false;
      LED[18] = false;
      LED[19] = false;
      LED[20] = false;
      break;

    case 1:
      LED[2] = true;
      LED[8] = true;
      LED[14] = true;

      LED[3] = false;
      LED[9] = false;
      LED[15] = false;
      break;

    case 2:
      LED[3] = true;
      LED[9] = true;
      LED[15] = true;

      LED[4] = false;
      LED[16] = false;
      break;

    case 3:
      LED[4] = true;
      LED[16] = true;

      LED[10] = false;
      break;

    case 4:
      LED[10] = true;

      LED[17] = false;
      break;

    case 5:
      LED[17] = true;

      LED[5] = false;
      LED[11] = false;
      break;

    case 6:
      LED[5] = true;
      LED[11] = true;

      LED[6] = false;
      LED[18] = false;
      break;

    case 7:
      LED[6] = true;
      LED[18] = true;

      LED[12] = false;
      break;

    case 8:
      LED[12] = true;

      LED[19] = false;
      break;

    case 9:
      LED[19] = true;

      LED[20] = false;
      break;

    case 10:
      LED[20] = true;
      break;
  }

}

Habs gefunden. Wenn es vorkommt dass lauflichtSchritt über die Grenze hinausgeht, wird dauerhaft das Vorzeichen von schritt geändert, der Wert in lauflichtSchritt ändert sich also nicht bzw. unkontrolliert.
Habs jetzt anders gelöst

 if (lauflichtSchritt > 10)
     schritt = -1;
    if (lauflichtSchritt < 1)
      schritt = 1;