WS2812B mit FastLED 3.03 auf Arduino DUE bzw. UNO

Hi!
Als blutiger Anfänger (mit Programmierkenntnissen) habe ich ein Projekt begonnen:
Ansteuerung von knapp 1000 WS2812B-LEDs mit einem DUE mit der FastLED-Library.

Am UNO funktionert mein kleines Testprogramm sehr gut, allerdings ist bei knapp über 500 LEDs der Speicher des UNO voll. Daher einfach den DUE geordert, der ja schneller ist und mehr Speicher hat.
Die 3,3V am Datenpin hochzusetzen auf 5V ist mit einer kleinen Hardwarebastelei ja auch kein Problem.

ABER:
Das am UNO laufende Testprogramm tut am DUE leider nicht. Der DUE scheint beim Befehl FastLED.show() stehen zu bleiben. Ich habe in meinem Testprogramm eine Ausgabe auf Serial hinzugefügt, die beim UNO auch brav läuft, beim DUE aber nicht. Kommentiere ich den Befehl FastLED.show() aus, läuft die Ausgabe auf dem seriellen Monitor auch am DUE problemlos.

Hier mein Testprogramm (In Zeile 81 ist die betreffende Stelle mit dem Befehl FastLED.show():

// Use if you want to force the software SPI subsystem to be used for some reason (generally, you don't)
// #define FORCE_SOFTWARE_SPI
// Use if you want to force non-accelerated pin access (hint: you really don't, it breaks lots of things)
// #define FORCE_SOFTWARE_SPI
// #define FORCE_SOFTWARE_PINS
#include "FastLED.h"

///////////////////////////////////////////////////////////////////////////////////////////
//
// Move a white dot along the strip of leds.  This program simply shows how to configure the leds,
// and then how to turn a single pixel white and then off, moving down the line of pixels.
// 

// How many leds are in the strip?
#define NUM_LEDS 550

// Data pin that led data will be written out over
#define DATA_PIN 3

// Clock pin only needed for SPI based chipsets when not using hardware SPI
//#define CLOCK_PIN 8

// This is an array of leds.  One item for each led in your strip.
CRGB leds[NUM_LEDS];

//*** start *** Test only, to monitor program running
#define LED_ANZ 30 
boolean L_13=false;
int wiederh = 0;
int zaehler = 0;
//*** end *** Test only, to monitor program running

// This function sets up the ledsand tells the controller about them
void setup() {
  // sanity check delay - allows reprogramming if accidently blowing power w/leds
    delay(2000);

      // Uncomment one of the following lines for your leds arrangement.
      // FastLED.addLeds<TM1803, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<TM1804, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<TM1809, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
       FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
      // FastLED.addLeds<WS2811_400, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<GW6205, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<GW6205_400, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<UCS1903, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<UCS1903B, DATA_PIN, RGB>(leds, NUM_LEDS);

      // FastLED.addLeds<WS2801, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<SM16716, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<LPD8806, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<P9813, RGB>(leds, NUM_LEDS);
      
      // FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<SM16716, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // Pin 13 Initialisieren

//*** start *** Test only, to monitor program running
      pinMode(13, OUTPUT);
      Serial.begin(9600);
//*** end *** Test only, to monitor program running

}

// This function runs over and over, and is where you do the magic to light
// your leds.
void loop() {
   // Move a single white led 
   for(int whiteLed = 0; whiteLed < NUM_LEDS; whiteLed = whiteLed + 1) {
      // Turn our current led on to white, then show the leds
      leds[whiteLed] = CRGB::White;
      if (whiteLed+LED_ANZ<NUM_LEDS) leds[whiteLed+LED_ANZ] = CRGB::Blue;
      if (whiteLed+LED_ANZ*2<NUM_LEDS) leds[whiteLed+LED_ANZ*2] = CRGB::Red;
      if (whiteLed+LED_ANZ*3<NUM_LEDS)leds[whiteLed+LED_ANZ*3] = CRGB::Green;

      // Show the leds (only one of which is set to white, from above)
      FastLED.show();

//*** start *** Test only, to monitor program running
      wiederh++;
      if (wiederh>100) wiederh=0;
      zaehler++;
      if (zaehler = 10)
      {
        Serial.print(wiederh);
        Serial.print ("     ");
        Serial.println(L_13);
        if (L_13 == false)
        {
        //LED 13 leuchten lassen
          L_13 = true;
          //digitalWrite(13, L_13);
        }
        else
        {
          L_13 = false;
          //digitalWrite(13, L_13);
        }
        digitalWrite(13, L_13);
        zaehler=0;
      }     
//*** end *** Test only, to monitor program running
  
     // Wait a little bit
      delay(25);

      // Turn our current led back to black for the next loop around
      if (whiteLed >= LED_ANZ) {
        leds[whiteLed-LED_ANZ] = CRGB::Black;
      }
      else {
        leds[NUM_LEDS-LED_ANZ+whiteLed] = CRGB::Black;
      }
   }
}

Das ARDUINO-Tool (IDE?) hat Version 1.6.5, die Library FastLED-3.0.3 habe ich heute ganz frisch von https://github.com/FastLED/FastLED/tree/3.0.3 runtergeladen.

Kann mir jemand weiterhelfen, bzw. wo ist mein (Denk-) Fehler?

Danke
Wolfgang

Den Arduino MEGA2560 zu nehmen wäre einfacher gewesen.

Wie hast Du den Pegelumsetzer gebaut?

Grüße Uwe

hi,

ich kann jetzt nichts zum fehler sagen, aber:

davon abgesehen, daß der DUE das natürlich erledigen könnte, wäre, falls Du öfter solche sachen machen willst, der Teensy besser geeignet.
der ist eigentlich DER standart bei vielen LEDs und aufwendiger LED-programmierung. da findest Du viel mehr beispiele und fertige lösungen im netz, und die fastLED-library ist auf die spezifischen Teensy-funktionalitäten abgestimmt.
es gibt fertige hardware zum anschluß mehrerer ketten, und er ist noch dazu sehr günstig und auch mit der arduino-IDE zu programmieren.

gruß stefan.

Hi,
danke für die Antowrten, auch wenn sie nicht wirklich weiterhelfen.

@Uwe:
Der DUE war eine “Gefühlsentscheidung”, nachdem es ein tolles Angebot gegeben hat (DUE um < 13 Euro)

Pegelumsetzer: nachdem ich mich mit den MOS-Fet-Schaltungen zu dem Thema beschäftigt habe ist es dann letztlich ein “Fertigprodukt” aus China (Baugleich zu http://www.amazon.ca/3-3V-5V-Converter-Channels-Bidirectional-Transceiver/dp/B00UL908WU) um knapp 2 Euro geworden. Die Bauteile alleine kosten schon mehr, als der fertige 8-fach bidirektionale Konverter.
Der Konverter tut übrigens seinen Dienst hervorragend, habe es auf dem UNO schon getestet, indem ich das UNO-Signal auf 3,3V und wieder zurück auf 5V konvertiert habe.

@Stefan:
Ja, ist mir inzwischen auch klar gworden, dass der Teensy 3.1 für einzelgesteuerte LED-Ketten idealer ist. Ich überlege auch einen Umstieg. Trotzdem hätte ich ganz gerne gewußt, wo letztlich das Problem liegt, dass ein Programm aus der Standard- FastLED-Library am UNO läuft und am DUE nicht, obwohl letzterer ja anscheinend von der Library unterstützt wird. Ich bin bei so etwas immer ziemlich hartnäckig :wink:

Grüße
Wolfgang

Hefter:
Hi,
danke für die Antowrten, auch wenn sie nicht wirklich weiterhelfen.

@Uwe:
Der DUE war eine “Gefühlsentscheidung”, nachdem es ein tolles Angebot gegeben hat (DUE um < 13 Euro)

Dann schreib bitte nicht “Arduino” DUE weil er ist entweder ein Nachbau (ohne Arduino) oder eine Fälschung (mit Arduino)

wo letztlich das Problem liegt, dass ein Programm aus der Standard- FastLED-Library am UNO läuft und am DUE nicht,

Die Zeiten zur Ansteuerung der WS2812 sind sehr kritisch und darum in assembler programmiert.

Bist Du sicher daß die Bibliothek für den Arduino DUE geeignet ist? Bist Du sicher daß der DUE überhaupt 100% funktioniert. Bei solchen Billigangeboten kommen einem schon die Zweifel.

Grüße Uwe

hi,

https://github.com/FastLED/FastLED

IMPORTANT NOTE: If you are building for AVR based systems, it is possible that using any version of the arduino IDE 1.5.7 or later and/or GCC 4.8 may introduce some issues. I believe I have fixed them, but if you run into issues using these platforms, please file an issue at http://fastled.io/issues - thank you! If you are building for the Due, Arduino 1.5.7 & later introduces issues that have currently been fixed on the FastLED 3.1 branch. FastLED 3.0 IMPORTANT NOTE: If you are building for AVR based systems, please do not use any version of the arduino IDE 1.5.7 or later yet. It messes with some of the asm output which will cause you Problems.

gruß stefan

hi,

ich hab' grad die 3.1 gesucht und hier gefunden:

http://forum.arduino.cc/index.php?topic=275326.0

oder, wenn ich's richtig verstehe, eine ältere IDE als 1.5.7 nehmen. weil das:

this code is currently only available on the FastLED3.1 branch and may set your leds on fire!

klingt seltsam. wundert mich, daß sich Helmut noch nicht in diesem thread gemeldet hat. Urlaub? gruß stefan

uwefed: Bei solchen Billigangeboten kommen einem schon die Zweifel.

Ich glaube, für die Chinesen ist es einfacher zu kopieren als Inkompatibilitäten zu programmieren und einzubauen :) :)

Hi,

erstens muss ich mich "wehren":

uwefed: Dann schreib bitte nicht "Arduino" DUE weil er ist entweder ein Nachbau (ohne Arduino) oder eine Fälschung (mit Arduino)

Weder noch. Es war eine Geschäftsauflösung nach Tod des Inhabers. Da kein Nachfolger gefunden wurde, wurde der "Inhalt" des Geschäfts bei einer Art Versteigerung feilgeboten. Deshalb der extrem günstige Preis. Ob es sich um Fälschungen handelt (ich habe auch noch ein paar Andere Schnäppchen ergattert) kann ich natürlich nicht sagen, aber Verpackung und auch Inhalt sehen recht original aus.

Zum Rest Deiner Nachricht: In den Release-Notes von FastLED 3.0.3 ist der DUE als "unterstützt" angeführt. Eisbär hat die "Important-Note" mit den Einschränkungen einer IDE > 1.5.7 (ich verwende natürlich die allerletzte IDE 1.6.5-r5) zitiert. Die habe ich zwar gelesen, aber anscheinend geflissentlich ignoriert.

@Eisbär: Ha, Du warst schneller. Ich habe mir die FastLED3.1 auch schon gezogen, aber noch nicht getestet. Das mit dem "may set your leds on fire" irritiert mich auch ziemlich, ich schlaf' da noch einmal drüber, bevor ich das ausprobiere. Aber was soll schon passieren, außer dass es nicht funktioniert? Da letztlich ja nur eine Datenleitung (Output am DUE) angesteuert wird, können höchstens die Daten Schrott sein, aber seine LEDs sollte man selbst mit 3,3V Dauer-High des Outputs damit wohl kaum kaputt bekommen ;-)

Ich werde nach dem erwähnten "Drüberschlafen" sowohl die Kombi IDE 1.5.7 & FastLED 3.0.3 als auch IDE 1.6.5-r5 & FastLED 3.1 testen. Wenn Interesse besteht kann ich hier kurz informieren, ob eine der Kombis (und auch welche ;-) ) bei mir funktioniert hat.

Grüße Wolfgang

hi,

nein, eine version VOR 1.5.7 und fastLED 3.0.3. ich würde eher das probieren als die 3.1.

elektronik ist sonderbar. versuche das sichere, die schreiben das nicht grundlos...

helmut wäre der experte zu dem thema, aber der war seit 3 wochen nicht hier. ganz klar urlaub. bei dem link von mir oben mußt Du in der adresszeile am anfang was rauslöschen, da spinnt das forum wieder mal. korrigiert

gruß stefan

Weder noch. Es war eine Geschäftsauflösung nach Tod des Inhabers. Da kein Nachfolger gefunden wurde, wurde der "Inhalt" des Geschäfts bei einer Art Versteigerung feilgeboten. Deshalb der extrem günstige Preis. Ob es sich um Fälschungen handelt (ich habe auch noch ein paar Andere Schnäppchen ergattert) kann ich natürlich nicht sagen, aber Verpackung und auch Inhalt sehen recht original aus.

Das ist auch eine Möglichkeit Material sehr billig zu bekommen, aber selten. Dann wird der Due ein Orginal Due sein. Grüße Uwe

Eisebaer: helmut wäre der experte zu dem thema, aber der war seit 3 wochen nicht hier. ganz klar urlaub.

Ist ein Urlaub ohne nicht hie und da in Forum zu schauen denn wirklich ein Urlaub? Grüße Uwe

Heureka!

Ich habe mich entgegen Stefans (“Eisbaers”) Vorschlag entschlossen, die IDE 1.6.5-r5 mit FastLED3.1 auszuprobieren und siehe da, es klappt auf Anhieb. Der DUE läuft, die Monitor-Meldungen zählen wie gewünscht hoch, und auch die LEDs machen, was sie sollen.
Es scheint also tatsächlich an FastLED 3.0.3 (und den darin enthaltenen Assemblerteilen?) gelegen zu sein.

Interessant ist vielleicht noch zu erwähnen, dass der Pegelumsetzer anfänglich nicht wollte. Als ich dann die Referenzspannung anstell 3,3V von den 5V des DUE abzapfte lief es auf Anhieb. Bei Gelegenheit hänge ich da einmal ein Oszi an den Output vom DUE und messe einmal hinein. Mit dem Multimeter sind es 3,2 Volt, aber da kommt ja etwas hochfrequent getaktetes (880 kHz, wenn ich mich recht enrinnere) heraus, daher ist die Multimeter-Messung natürlich eigentlich Quatsch.

Und das Schärfste ist, dass der Pegelumsetzer gar nicht notwendig ist. Die Datenleitung direkt vom DUE an die LEDs angesteckt tut nämlich auch brav (und das bei 999 LEDs - eine LED ist defekt, sonst wären es 1000).

Mein auf 999 LEDs erweitertes Testprogramm der Eingangsnachricht lief jetzt 2x 3 Stunden ohne Probleme stabil durch, ich bin (derzeit) begeistert!

Wenn ich etwas Zeit erübrigen kann, werde ich noch wie angekündigt IDE < 1.5.7 in Kombination mit FastLED 3.0.3 testen und mich hier melden.

Danke an alle, die sich die Mühe gemacht haben hier mitzulesen und zu antworten. Macht Spaß bei Euch, da einem geholfen wird.
Meine Lernerfahrung: Einer “Important notice” in Zukunft viel mehr Beachtung schenken!

Grüße (aus Österreich)
Wolfgang

hi,

ich hab' diese sache mit dem feuer nur im thread von helmut gelesen. jetzt mal den link dort aufgemacht und gesehen, daß das so gemeint ist:

"das funktioniert nur mit der 3.1. und läßt Deine LEDs brennen!"

also keine angst, ist nur werbung...

gruß (aus wien) stefan

PS.: uwe kommt aus bozen, also nur österreicher hier :)

Ist ein Urlaub ohne nicht hie und da in Forum zu schauen denn wirklich ein Urlaub?

Ganz klar: JA! ;)

Hi und Gruesse aus dem Urlaub, was fuer mich tatsaechlich bedeutet, komplett offline zu sein. Inkl. Handy aus... ok, einmal die Woche schaue ich kurz nach SMS, falls ich Netzempfang habe. No news are good news.

Bei FastLED immer die neueste Version i.V.m der empfohlenen IDE Version verwenden. Warum? Weil verschiedene IDEs verschiedene Compiler verwenden, welche teilweise den ASM Code ungluecklich "optimieren". Daniel hat wirklich gekotzt, als er wegen der neuen IDE auf allen unterstuetzten Controllern neu testen und optimieren musste, damit wieder funktioniert, was mit dem alten Compiler bereits lief...

"Set something on fire" ist amerikanischer Slang und bedeutet, dass etwas ordentlich abgeht, also z.B. beeindruckend schnell ist.

Manche WS2812 funktionieren mit 3,3V Signalpegel, andere nicht. Wenn nicht, hilft ein 74HCT245 weiter. Der Takt ist festgelegt auf 800 kHz. Wenn ich etwas fuer Kunden baue, dann IMMER mit Pegelwandler.

Ein Due ist uebrigens nach dem Teensy eine gute Loesung und allen AVR Prozessoren in jeder Hinsicht weit ueberlegen. Die ARMs haben mehr RAM, hoeheren Takt, sind interruptfaehig waehrend LEDs geschrieben werden usw. Bei 1000 LEDs ist der Unterschied der erzielbaren fps gewaltig, v.a. wenn man komplexe Animationen mit mehreren Layern und Ebeneneffekten faehrt.

Beste Gruesse in die Runde,

Helmuth

Schalte zum Schutz zwiscehn Arduino un dem ersten WS2812 einen 330 Ohm Widerstand. So raucht er nicht ab wenn der Arduino Strom hat aber die WS2812 nicht. Grüße aus Bozen Uwe