Ich brauch mal Hilfe bei einem umfangreichen Lichtprojekt

Hallo,

in den Weiten des Netzes habe ich vor einiger Zeit einen "Audio-Spektrumanalyzer mit Arduino Mega2560 und WS2812 LED-Stripes gefunden. Das Ding hat mir gefallen, also habe ich einen Probeaufbau gestartet.
Ich mach neben Elektronik auch gelegentlich Tontechnik für Veranstaltungen, da kommt das Ding ganz gut.
Hier Part 3 v. 4, das Video zeigt gut um was es geht.
Part-3 14 Band SA

Allerdings liegt als Code nur eine einfache Version vor, in dieser kann man Farben usw. nur über einen angestöpselten PC und der IDE ändern. Für Veranstaltungseinsatz äußerst unpraktisch.

Ein User aus Holland hat nun den vorhandenen Code so erweitert, dass man zumindest einige Einstellungen mit Taster und Poti vornehmen kann.
Auch der Code liegt vor.

In einem Punkt unterscheiden sich aber beide Projekte fundamental! Die Reihenfolge und die Anordnung der LED-Stripes hat der Holländer komplett vertauscht.

Im Bild beide Versionen, meine ist Original nach Platinum.

Wenn ich hier (im nächsten Post und wegen der Größe als ZIP) beide Codeversionen hochlade, kann mir irgendwer helfen die Unterschiede zu verstehen? In irgendwelchen Codezeilen muss ja eine Information über die Reihenfolge und Anordnung enthalten sein. Ich bin allerdings noch zu doof das zu durchschauen.

Meine Schaltung funktioniert mit seinem Code durchaus, nur die Anzeigen sind durcheinander (jede 2. Zeile leuchtet von oben statt von unten)

Gruß
Old-Papa

Bei der einen Schaltung werden die LEDs immer von der gleichen Seite angesteuert, bei der anderen im Wechsel. Die Verschaltung sollte zum Code passen oder Du musst jeden 2. Bereich umrechnen.

Gruß Tommy

Tommy56:
Bei der einen Schaltung werden die LEDs immer von der gleichen Seite angesteuert, bei der anderen im Wechsel. Die Verschaltung sollte zum Code passen oder Du musst jeden 2. Bereich umrechnen.

Gruß Tommy

Nicht ganz... :wink:
Genaugenommen können diese LEDs nur von einer Seite (Pfeilrichtung) angesteuert werden, sie liegen alle in EINER Reihe.
Achte mal auf die Pfeile.... Allerdings hat der Holländische Kollege (Herr Donner) jede 2. Zeile umgedreht und eine Lange Verbindungsleitung gelegt. Beim Original (und bei mir) laufen die Datenleitungen rauf und runter.

Außerdem steuert er von der niedrigsten Frequenz an (also von rechts), im Original wird zuerst die höchste Frequenz angezeigt (also Anschluss von links.)
Er hat ja als Ausgangsbasis auch den Code von Platinum genommen, weite Teile sind identisch, nur eben wie und wo er das mit den Reihenfolgen anders löst erschließt sich mir nicht. Die eigentliche Steuerhardware ist im Prinzip identisch.

Old-papa

Hier die beiden Versionen als ZIP.

Wie geschrieben, die Version vom Holländischen Herrn Donner gefällt mir viel besser, da einiges per Poti verstellt werden kann. Ich möchte halt mehr davon verstehen, die Kommentierungen (ein paar von mir) sind sehr sparsam.

Ich hatte ihn angeschrieben, leider keine Antwort oder meine Nachrichten im Spam.

Gruß
Old-Papa

14-Band-SA-Versionen.zip (5.36 KB)

old-papa:
Nicht ganz... :wink:

Doch. Sie liegen zwar in einer Reihe, aber in unterschiedlichen Reihenfolgen.

Gruß Tommy

In der Platinum-Version wird ab Zeile 158 zwischen ungeraden und geraden COLUMNS unterschieden.

  if( j % 2 != 0)

Vielleicht ist da das Geheimnis verborgen.

In die Tiefe wollte ich in den Sketch aber nicht einsteigen; mein BeyondCompare brachte mich auf die Idee - weil danach jeweils die Farben gesetzt werden.

Gruß Walter

Bei Platinum ist Zick-Zack-Anordnung, das wird bei if ( j % 2 != 0) in gerade und ungerade unterschieden.

Nur Zweiter :frowning:

Tommy56:
Doch. Sie liegen zwar in einer Reihe, aber in unterschiedlichen Reihenfolgen.

Gruß Tommy

Das weiß ich auch, dennoch wird richtig angezeigt, doch wo tauscht er die Reihenfolge jede 2. Spalte um?

Oups, ich hätte zuende lesen sollen.

Die genannte Formel ist für mich aber zu hoch :wink:

Die "Formel" prüft nur ab. ob der Spaltenindex j gerade oder ungerade ist.
Das wird durch eine MODULO Operation bewerkstelligt:

j % 2

liefert den Rest der Division von j durch zwei. Das "ungleich 0" kannst Du dann selber :slight_smile:

So wie es da aufgeschrieben ist, kommt also der Fall "ungerade" raus; die geraden Spalten werden weiter unten in einem "else"-Zweig behandelt.

Gruß Walter

Ok, ich habe zwar nur ein Viertel verstanden, doch so wie ich das sah, musste ich diesen kompletten Code vom Platinum in den von Donner kopieren bzw. den dort vorhandenen ersetzen.

for(int j = 0; j < COLUMNS; j++)
  {
  if( j % 2 != 0)
  {
  for(int i = 0; i < ROWS; i++)
  {
  if(spectrum[ROWS - 1 - i][j].active)
  {
  pixels.setPixelColor(j * ROWS + i, pixels.Color(
  spectrum[ROWS - 1 - i][j].r, 
  spectrum[ROWS - 1 - i][j].g, 
  spectrum[ROWS - 1 - i][j].b));         
  }
  else
  {
  pixels.setPixelColor( j * ROWS + i, 0, 0, 0);  
  } 
  }
  }
  else
  {
  for(int i = 0; i < ROWS; i++)
  {
  if(spectrum[i][j].active)
  {
  pixels.setPixelColor(j * ROWS + i, pixels.Color(
  spectrum[i][j].r, 
  spectrum[i][j].g, 
  spectrum[i][j].b));     
  }
  else
  {
  pixels.setPixelColor( j * ROWS + i, 0, 0, 0);  
  }
  }      
  } 
  }
  pixels.show();
  }

Nachdem ich noch eine fehlende Klammer hinzugefügt habe, klappt das schonmal bestens, alle Spalten flippern nun von unten.

Herzlichen Dank!

Nun muss nur noch die Reihenfolge von derzeit Rechts nach links umgekehrt werden. Üblicherweise liegt die niedrigste Frequenz (hier 30Hz) links, die höchste (hier über 16kHz) rechts. Im Code von Donner leider umgekehrt.

Old-papa

Und ich glaube, diese Hürde habe ich auch gemeistert (ohne die Hintergründe wirklich zu verstehen....)

Ich habe nun alle Zeilen mit

spectrum[i][j].....

durch

spectrum[i][COLUMNS - 1 - j]....

ersetzt.
Und schon läuft das Spektrum wie es soll von links nach rechts.

Bleibt als letzte Hürde noch die Erweiterung der Einstellfunktionen auf Peak-Hold, Farbwechsel usw.

Mal sehen, ob ich da durchkomme.

Ideal wäre ja ein vollkommen auskommentierter Code, damit man auch was lernt dabei.

Old-Papa

old-papa:
Ideal wäre ja ein vollkommen auskommentierter Code, damit man auch was lernt dabei.

Welche Kommentare sinnvoll wären, hängt stark vom Lernenden ab. Daher benötigt man eine klar definierte Zielgruppe, um sinnvolle Kommentare verfassen zu können. Für in diesem Forum veröffentlichte Programme gibt es diese Zielgruppe aber nicht, weshalb ich meine Programme nur für mich kommentiere. Was nicht klar ist, kann dann ja, anders als bei einem Buch, erfragt werden.

  randomSeed(analogRead(0));    //???

A0 dient als Antenne und erzeugt einen zufälligen Wert, der den Zufallsgenerator mit einem Startwert initialisiert.

agmue:
Welche Kommentare sinnvoll wären, hängt stark vom Lernenden ab. Daher benötigt man eine klar definierte Zielgruppe, um sinnvolle Kommentare verfassen zu können. Für in diesem Forum veröffentlichte Programme gibt es diese Zielgruppe aber nicht, weshalb ich meine Programme nur für mich kommentiere. Was nicht klar ist, kann dann ja, anders als bei einem Buch, erfragt werden.

Nun, ich versuche mich da durchzufummeln.

Es ist immer was ganz Anderes einen selbst geschriebenen Code zu überblicken, als eben einen fremden. Man muss manchmal raten, was der Autor sich bei dieser Vorgehensweise gedacht hat. Leider antworten beide nicht.....
Ich gebe zu, mit dem Projekt bin ich kopfüber ins Wildwasser gesprungen, obwohl ich noch nichtmal das "Seepferdchen" habe.

agmue:

  randomSeed(analogRead(0));    //???

A0 dient als Antenne und erzeugt einen zufälligen Wert, der den Zufallsgenerator mit einem Startwert initialisiert.

Danke!

Old-Papa

old-papa:
Es ist immer was ganz Anderes einen selbst geschriebenen Code zu überblicken, als eben einen fremden.

Vollkommen richtig. Aus langjähriger Erfahrung muß ich Dir sagen, diese Problem läßt sich nicht lösen.

old-papa:
Ich gebe zu, mit dem Projekt bin ich kopfüber ins Wildwasser gesprungen, obwohl ich noch nichtmal das "Seepferdchen" habe.

Du könntest die Schwimmflügel, auf denen "Forum" steht, aufblasen ;D

agmue:
Vollkommen richtig. Aus langjähriger Erfahrung muß ich Dir sagen, diese Problem läßt sich nicht lösen.
Du könntest die Schwimmflügel, auf denen "Forum" steht, aufblasen ;D

Na denne, ich bitte mal um Schwimmflügel...

"Platinum" (der ursprüngliche Autor, von dem einige die Ideen übernommen haben) hatte ja in seiner ersten Version einen einfachen Code freigegeben (den ich in meiner ZIP gezeigt habe), später diesen gehörig aufgebohrt und verbessert. Den besseren rückt er nicht raus, verkauft stattdessen komplett bestückte Platinen mit geflashtem (und sicher gelocktem) Arduino. Die kann man in EU nur über einen Partner in der Shweiz kaufen und dieser nimmt landesübliche (also hohe) Preise. Rund 170,- Öcken sind wohl vielen zu happig (mir auch), daher haben Herr Donner und auch ich (einige andere auch) die Hardware neu gestrickt und jeder für sich den ursprünglichen Code etwas verbessert. Zum verbessern fehlt mir einfach das Wissen, mein Arduinogestotter reicht dafür nicht (noch nicht). Darum habe ich mich am Code von Herrn Donner versucht und bin ja mit eurer Hilfe schon weiter gekommen.

Was hat "Platinum" eigentlich verbessert?
Er hat Potis für:
Helligkeit, (ist klar)
Dealy (Zeit in der die Leuchbänder wieder absinken)
Peak-Delay (Zeit in der die oberen "Peak-LEDs" absinken)
Peak-Pause (Zeit bevor die oberen Peak-LEDs beginnen abzusinken)
Color-Speed (Zeit in der die verschiedenen Farbmodi durchlaufen werden)
dazugebaut.
Zusätzlich noch einen Taster, mit dem man die Farbmodi manuell wechseln kann.

Insgesamt durchaus vernünftige Dinge um bei einer Veranstaltung (ich turne gelegentlich mit viel Tontechnik durch das Land) ein paar zusätzliche Lichteffekte, passend zum Musikprogramm einzustellen. In seinen Videos klappt das auch gut.

Kollege Donner hat etwas andere Einstelloptionen gewählt, doch sein Prinzip sollte sich doch auch z.B. für die "Peakeinstellungen" nutzen lassen. Ich versuche den Code dahingehend zu verhirnen, so richtig gelingt mir das nicht.
Meine Überlegung: Zunächst müssten für die zu ändernden Werte Variablen definiert werden, dann mit den entsprechenden Analogwerten (über A4, 6, 8, 10 und 12 eingelesen) irgendwie gemapt und an den entsprechenden Codestellen als Werte eingefügt werden....
Ähm oder so....

So, viel Text, ich hoffe verständlich :wink:

Old-Papa

Grundlegend richtig.

Du solltest Dich erst mal entscheiden, ob Du auf der Basis des Codes von Platinum oder Donner weiter arbeiten willst. Wenn diese Entscheidung gefallen ist, solltest Du Deine Verdrahtung an diejenige anpassen, die der verwendet, dessen Code Du nutzen willst.

Alles andere schafft nur Verwirrung.

Dann erst mal ein Poti (5 bis 10 kOhm) an 5V und GND und den Schleifer auf einen analogen Eingang. Den einlesen (Beispiele dazu sind in der IDE). Dann überlegen, welche Größe Du damit verändern willst, deren Wert im Sketch suchen und ändern. Evtl. mit map anpassen.

Wenn das funktioniert, dann der nächste Schritt.

Gruß Tommy

Tommy56:
Grundlegend richtig.

Du solltest Dich erst mal entscheiden, ob Du auf der Basis des Codes von Platinum oder Donner weiter arbeiten willst. Wenn diese Entscheidung gefallen ist, solltest Du Deine Verdrahtung an diejenige anpassen, die der verwendet, dessen Code Du nutzen willst.

Alles andere schafft nur Verwirrung.

Nun, ich hatte den Code von Donner weitergearbeitet, da dieser (wie mir scheint) weiter fortgeschritten ist.
Den Code habe ich an meine vorhandene Hardware angepasst, das funktioniert ja zumindest testweise mit 3 Potis und einer Taste (die 2. ist ja nur Reset).

Tommy56:
Dann erst mal ein Poti (5 bis 10 kOhm) an 5V und GND und den Schleifer auf einen analogen Eingang. Den einlesen (Beispiele dazu sind in der IDE). Dann überlegen, welche Größe Du damit verändern willst, deren Wert im Sketch suchen und ändern. Evtl. mit map anpassen.
Wenn das funktioniert, dann der nächste Schritt.
Gruß Tommy

Wie schon geschrieben, die 5 Potis plus 2 Taster sind bereits verdrahtet (Platine gefertigt) und liegen mit ihren Schleifern an A4,6,8,10 und 12. Drei davon hatte ich testweise im Code von Donner verwendet plus eine Taste.

Ich häng hier mal den derzeit funktionierenden Stand an.

Old-Papa
(Mist, wenn ich zitiere, kann ich keine Anlagen hinzufügen…)

Aber jetzt…

sketch_may11a-DMS-308-neu-2.ino (15.2 KB)

old-papa:
Den Code habe ich an meine vorhandene Hardware angepasst, ...

Was verwendest Du für die Analyse? Es scheint was mit Si5351 zu sein?

    spectrumValue[i] = analogRead(2)-NOISE;     //liest Analogwert des ersten MSGEQ7 ein
...
    spectrumValue[i] = analogRead(0)-NOISE;     //liest Analogwert des zweiten MSGEQ7 ein (Old-Papa von A1 auf A2 geändert)
...
    spectrumValue[1] = analogRead(0);       // von A1 auf A2 geändert

Passen die Kommentare?

agmue:
Was verwendest Du für die Analyse? Es scheint was mit Si5351 zu sein?

Nein, die vollständige “Analyse” wird durch die MSGEQ7 vorgenommen. Das sind eigentlich nur Siebenkanalige Bausteine und sie werden intern mit rund 165kHz getaktet. Man kann sie auch extern takten und abhängig von der Taktfrequenz liefern sie das in 7 Spektren aufgeschlüsselte Signal. Das nutzt Kollege “Platinum” geschickt aus, indem er einfach zwei dieser ICs nimmt und mit unterschiedlichen Taktfrequenzen versorgt. So erreicht er, dass die Spektren um etwa die Hälfte nach unten verschoben werden (also statt minimal 63Hz liefert das eine (mit nur rund 105kHz getaktete) schon ab 30Hz sein Ausgangssignal. Nur dadurch kann man einen echten 14-Kanlaligen SA bauen.
Die unterschiedlichen Taktfrequenzen liefert sehr präzise der Si5351, der eigentlich für HF-Anwendungen gedacht, aber für schmalen Taler als komplette Platine zu haben ist.
Siehe auch das Datenblatt zum MSGEQ7.

agmue:

    spectrumValue[i] = analogRead(2)-NOISE;     //liest Analogwert des ersten MSGEQ7 ein


    spectrumValue[i] = analogRead(0)-NOISE;    //liest Analogwert des zweiten MSGEQ7 ein (Old-Papa von A1 auf A2 geändert)

    spectrumValue[1] = analogRead(0);      // von A1 auf A2 geändert



Passen die Kommentare?

Nö, sie passen eigentlich nicht mehr, ich musste die beiden Analogeingänge A0 und A2 (bzw. die Ausgänge der MSGEQ7) tauschen, weil die Reihenfolge falsch war. 63Hz - 30Hz - 160Hz - 80Hz -…
Die Kommentare hatte ich vergessen :wink:

Old-Papa

MSGEQ7 7-band EQ chip.pdf (146 KB)