Arduino due NeoMatrix video wall

Hallo, ich habe eine 8x8 NeoMatrix und möchte dort mit einem Arduino Due zur Laufzeit (am besten 25 pro Sekunde) Bilder anzeigen.

Was meint ihr, wie ich das realisieren kann? Meint ihr, dass das überhaupt möglich ist? Die Bilder sollen über USB übertragen werden.

Ich hoffe, dass ihr mir ein paar Informationen geben könnt, denn ich stehe gerade völlig auf dem Schlauch und finde auch keine wirkliche Hilfe im Netz.

Viele Grüße

25 fps auf 64 LEDs gehen problemlos. Datenübertragung vis USB auch.

Sprechen wir über einen Bilder- oder Videostream? Willst Du existierende Software auf dem PC verwenden oder wo sollen die Daten herkommen?

Was hast Du konkret vor?

Einen Anfang, um die Leds anzusteuern, findest Du hier: http://fastled.io/

Grüße

Helmuth

das klingt doch schonmal gut. Danke für die Antwort.

Wo die Daten herkommen ist momentan noch unklar. Es wird dicherlich kein PC sein, sondern eher ein anderes Board wie z.b. das i.MX6 von freescale sein. Ich gehe davon aus, dass ich in jedem frame Pixeldaten bekomme. In welcher Form ist auch noch offen. Das würde ich eventuell durch eure Hilfe hier erarbeiten.

Das einzige, was bis jetzt feststeht ist, dass es ein Due sein wird und die Übertragung über USB erfolgt.

Ich habe testweise mal eine Flashanimation gemacht, die zur Laufzeit die Auflösung runter rechnet und die Pixelwerte berechnet. Habe also uint Werte für jedes Pixel. Diese würde ich gern schonmal darstellen können. Mich würde an dieser Stelle schonmal interessieren, wie man die Pixelwerte am besten überträgt. Welchen Datentyp z.b.? Und gibt es eventuell ne library, der ich eventuell nur ein Array von Farbwerten übergebe und diese angezeigt werden?

Hier ein Projekt, wo jemand via Processing LEDs steuert: http://vjspain.com/blog/2013/11/19/project-arduino-based-dimmer-for-digital-led-strips/

Für 64 LEDs reicht übrigens ein Uno völlig aus.

Ein Due + MX6 ist für Deine Anwendung wie mit Kanonen auf Spatzen schießen...

Sollen die Daten von einem anderen Gerät kommen, um irgendwelche Events zu visualisieren oder geht es eigentlich nur um ein paar Effekte, welche man problemlos in Echtzeit auf dem Due berechnen kann?

Fang erstmal an, die Matrix anzusteuern. FastLED ist Dein Freund. Link siehe oben.

Dann mach eine serielle Verbindung zwischen PC und Arduino klar und empfange Daten.

Beispiel zum grundsätzlichen Vorgehen hier: http://arduino.cc/en/Tutorial/PhysicalPixel

Protokoll entwickelst Du selbst und sendest dann 3 x 64 Byte = 1 frame.

Inspiration hier: http://openpixelcontrol.org/

Gruß

Helmuth

P.S. Eine fertige Interpreter Lib ist mir nicht bekannt, aber das muss nichts heißen...

Doch, gibt es hier auch (fast) fertig: http://shopping.netsuite.com/s.nl/c.ACCT88394/sc.2/.f

Die Grafiken werden auf dem i.MX berechnet und sollen dann erst auf das Arduino übertragen werden. Das Arduino steuert also lediglich die LEDs an.

Eventuell wird noch ein LED strip am due hängen. Die Arbeit würde dann noch dazu kommen.

Danke vorerst für eure Hilfe. Schaue mir die Sachen mal an.

FastLED v2.1 unterstützt 8-fach Multikanaloutput (nur auf ARM, nicht auf AVR) - auch mit verschiedenen Chipsets gleichzeitig. Der extra LED Strip ist also kein Problem.

Also ich habe mir jetzt für den Test eine Verbnindung zum arduino aufgebaut.
Kann also schon Pixelkoordinaten schicken und setzen. Leider klappt das senden von Farbinformationen nicht.
bzw werdne diese nicht angezeigt.

Mein Flash code macht in jedem frame folgendes:

for (var i : int = 0; i < CLUSTER_WIDTH; i++) 
			{
				for (var j : int = 0; j < CLUSTER_HEIGHT; j++) 
				{
					arduinoConnector.arduinoSocket.writeByte(bitmapData.getPixel(i, j));
				}
			}
			
			arduinoConnector.arduinoSocket.flush();

auf seiten von arduino passiert dann folgendes:

void setup() 
{
  Serial.begin(9600);
  
  matrix.begin();
  matrix.setBrightness(20);
}

void loop() 
{
  if(Serial.available() > 0)
  {
    for (int i = 0; i < 16; i++) 
    {
      for (int j = 0; j < 8; j++) 
      {
        matrix.drawPixel(i, j, Serial.read());
      }
    }
  }
  matrix.show();
  
  delay(1);
}

Wofür braucht man die FastLED library? Macht die dann nicht das gleiche wie die NeoMatrix library?
Das ganze klingt so einfach: 64 Farben übermitteln und anzeigen. ist es aber wohl nicht…

Zerlege das Problem in kleine Teilprobleme und löse eins nach dem anderen.

Sende erstmal nur ein Byte zum Arduino und gib es dann im Serialmonitor aus.

Wenn das klappt, mehrere. Wenn es im Serialmonitor gut aussieht, schreibe sie in ein Array. Wenn das Array gut aussieht, sende es an die LEDs.

FastLED macht alles, was NeoMatrix auch macht - aber schneller, flexibler, ressourcenschonender, besser...

Ist am Ende Geschmackssache.

Die Geschwindigkeit der Serialconnection von Sender und Empfänger muss auch zueinander passen.

Bin für den Rest der Woche offline, viel Erfolg!

edit: Mit Serial.read liest Du genau ein Byte ein. Vielleicht verhilft Dir das hier zu mehr Verständnis: http://arduinobasics.blogspot.de/2012/07/arduino-basics-simple-arduino-serial.html

Immer wieder der gleiche Fehler bei sowas:

if(Serial.available() > 0)

Es wird nicht beachtet wie langsam die serielle Schnittstelle ist. 9600 Baud bedeutet 9600 Zustandwechsel pro Sekunde. Bei 10 Bits pro Zeichen braucht ein Zeichen daher 1 / 9600 * 10 s. Also ca. 1ms !!

Du kannst also nicht wenn du nur abfragst ob gerade 1 Zeichen da ist, gleiche alle einlesen. Die sind noch unterwegs und alle read() Aufrufe bis auf den ersten geben -1 zurück.

Du bist bei 64 Bytes allerdings auch genau an der Grenze des seriellen Puffers der Arduino Firmware. Wenn du mehr schickst ohne die vorher auzulesen gehen Daten verloren.

Alternativ würde wohl auch gehen wenn du auf die for-Schleifen verzichtest und das statt dessen durch loop() machst. Die läuft ja immer durch. Dann braucht du zwei Variablen i und j um die Indizes mitzuzählen. Die werden dann nach jedem read() entsprechend inkrementiert.

Du kannst also nicht wenn du nur abfragst ob gerade 1 Zeichen da ist, gleiche alle einlesen. Die sind noch unterwegs und alle read() Aufrufe bis auf den ersten geben -1 zurück.

Ja der kommt hier auch völlig durcheinander. Bin leider absolut kein Hardwarenaher Programmierer, aber will mich da jetzt durch beißen. Es geht vorerst nur um ein einziges Pixel.

Für mich am schwierigsten ist gerade das ganze hin und her gerechne zwischen den datentypen.

Flash code: (getPixel liefert einen uint zurück)

var color:uint = bitmapData.getPixel(5, 5);
arduinoConnector.arduinoSocket.writeByte(color);

Wäre diese Variante besser?

void loop() 
{
  if(Serial.available()==3)
  {
    uint8_t r = Serial.read();
    uint8_t g = Serial.read();
    uint8_t b = Serial.read();
    
    //matrix.drawPixel(5,5,matrix.Color(r,g,b));
    
    Serial.print("r=");
    Serial.println(r);
    Serial.print("g=");
    Serial.println(g);
    Serial.print("b=");
    Serial.println(b);
  }
  
  matrix.show();
  
  delay(1);
}

habe gerade gelesen, dass ich nicht ohne weiteres werte größe 127 empfangen kann. Stimmt das?

Sicherer ist wenn du auf >= 3 abfrägst.

Nein. Diese Information hängt wohl damit zusammen, dass ASCII nur bis 127 definiert ist, aber du kannst Werte von 0-255 lesen. read() gibt einen int zurück. Daher ist man nicht auf -128 bis 127 beschränkt

Also so langsam krieg ich nen Knoten im Kopf.

Bitte helft mir doch das ganze etwas zu sortieren. Blöderweise habe ich hier jetzt zwei Seiten (Flash und Arduino). Vielleicht ist es das beste erstmal eine Seite zu machen. Auch wenn ich es dann nicht testen kann.

Ich habe für jedes Pixel 3 Kanäle, die je 255 Werte darstellen können. Also ein Byte pro Kanal. Ich brauche also für jedes Pixel 3 Byte mit Helloigkeitsinformationen für jeden Kanal. Dann dürfte das doch soweit stimmen für ein einzelnes Pixel oder?

if(Serial.available()>=3)
  {
    byte r = Serial.read();
    byte g = Serial.read();
    byte b = Serial.read();
    
    matrix.drawPixel(0,0,matrix.Color(r,g,b));
    matrix.show();
}

Wie kann ich denn jetzt Testweise mal Farbinformationen send und schauen, ob diese dargestellt werden? Geht das über den Serial Monitor in der Arduino IDE?

Ja. Drei Werte hintereinander senden sollte im Serial Monitor gehen.

Der Arduino Code sollte theoretisch auch funktionieren.

Mit dem Serial Monitor geht es leider nicht so schön, da du nur ASCII-Zeichen versenden kannst. Ich empfehl dir Processing oder Ne kleine selbstgebaute Windowsanwendung zu nehmen. Alternativ kannst du mit Serial.parseInt() arbeiten, der einen ASCII-String in einen Integer umwandelt (aber seeeeeeehr langsam ist) oder eine kleine Funktion zu schreiben die dir je zwei Hex ASCII-Zeichen in ein byte konvertiert.

ARG! Stimmt. Daran hatte ich nicht gedacht. Sorry.

Die beste Alternative ist ein einfach ein richtiges Terminal-Programm wie HTerm: http://www.der-hammer.info/terminal/ Da kann man einstellen als was man das schickt :) Einfach auf DEC statt ASC stellen

Hello again,

die Anforderungen haben sich jetzt etwas geändert. Es sollen im ersten Schritt Bilder angezeigt werden, die sich im Flashspeicher befinden.

Finde leider nichts darüber, wie man Bilder in den Flash Speicher bekommt. Habt ihr da Informationen für mich?

Wie schätzt ihr das ganze ein? Ist das Thema überhaupt machbar für jemanden, der nicht hardwarenah programmieren kann? Bin gerade so überfordert und hoffe, dass sich das Feld irgendwann etwas lichtet.

machbar für jemanden, der nicht hardwarenah programmieren kann

Wenn du eine Tastatur mit den Händen erreichen kannst, hast du deutlich weniger Probleme. Versuchs also lieber hardwarenah.

Finde leider nichts darüber, wie man Bilder in den Flash Speicher bekommt. Habt ihr da Informationen für mich?

Bei ARM Prozessoren wie dem Due, sollte [b]const[/b] reichen. -> http://forum.arduino.cc/index.php?topic=128685.msg968721#msg968721

Bei ARM Prozessoren wie dem Due, sollte const reichen. -> http://forum.arduino.cc/index.php?topic=128685.msg968721#msg968721

Kannst du mir das eventuell näher erläutern? Ich habe 5 pngs, die ich im Speicher haben möchte. Wie geh ich da am Besten vor?

Es geht nicht darum, Bilder in den Due abzulegen! Du musst die Bilder in Arrays umwandeln. Ähnlich dem irgendwo erwhähnten Flash Programms.

Nur weiß hier keiner, wie deiner Bilder aussehen,. Bitte mal test reinsetzen