Arduino Nano + APA102 = Ambilight? [Deutsch]

Moin,

da ggfs. nicht jeder englisch spricht/schreibt versuche ich mein Glück hier auch nochmal.

Ich habe mir einen Arduino Nano, sowie einen APA102 LED Stripe zugelegt.
Alles korrekt verbunden, mit FastLED lässt sich der Stripe auch steuern.

Nun suche ich allerdings den passenden Sketch um den Stripe auch entsprechend mit Ambibox, Prisamatik usw. steuern zu können.
Finde viele Sachen leider nur auf die WS2811/12 getrimmt, weniger für den APA102.

Hat da von euch jemand ggfs. was passendes zur Hand?

Dankeschön

Hi

Wer ist: Ambibox, Prisamatik?

MfG

PS: Also bei mir spuckt Google (ok, eine andere Suchmaschine ...) bei 'Arduino APA102' reichlich aus

Hi

squishifish:
da ggfs. nicht jeder englisch spricht/schreibt versuche ich mein Glück hier auch nochmal.

Hatte Er aber erwähnt!
Zugegeben: Einen Link hier zum englischen Thread und dort zum Deutschen, wäre angebracht gewesen.

MfG

PS: Immerhin eine Stunde Differenz zwischen den Posts ... Das hatten wir schon wesentlich näher beisammen :wink:

squishifish:
Finde viele Sachen leider nur auf die WS2811/12 getrimmt, weniger für den APA102.

Zeige doch mal, was Du gerne verwenden möchtest, kann man ja eventuell umstricken.

Zweimal in einem Forum das gleiche zu fragen gefällt vielen Usern nicht, da sie zum Teil unnütz antworten geben und somit Zeit verlieren weil diese Antworten anderswo schon beantwortet worden sind.

Entscheide Dich für eine Diskussion.
Grüße Uwe

agmue:
Zeige doch mal, was Du gerne verwenden möchtest, kann man ja eventuell umstricken.

Bisher habe ich selber tatsächlich noch nichts brauchbares.
Es gibt da diesen Standard "Adalight_WS2812" Sketch der bei den meisten die Videos machen herumgeistert.

/*
 * Arduino interface for the use of WS2812 strip LEDs
 * Uses Adalight protocol and is compatible with Boblight, Prismatik etc...
 * "Magic Word" for synchronisation is 'Ada' followed by LED High, Low and Checksum
 * @author: Wifsimster <wifsimster@gmail.com> 
 * @library: FastLED v3.001
 * @date: 11/22/2015
 */
#include "FastLED.h"
#define NUM_LEDS 144
#define DATA_PIN 11

// Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
#define serialRate 115200

// Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data
uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i;

// Initialise LED-array
CRGB leds[NUM_LEDS];

void setup() {
  // Use NEOPIXEL to keep true colors
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  
  // Initial RGB flash
  LEDS.showColor(CRGB(255, 0, 0));
  delay(500);
  LEDS.showColor(CRGB(0, 255, 0));
  delay(500);
  LEDS.showColor(CRGB(0, 0, 255));
  delay(500);
  LEDS.showColor(CRGB(0, 0, 0));
  
  Serial.begin(serialRate);
  // Send "Magic Word" string to host
  Serial.print("Ada\n");
}

void loop() { 
  // Wait for first byte of Magic Word
  for(i = 0; i < sizeof prefix; ++i) {
    waitLoop: while (!Serial.available()) ;;
    // Check next byte in Magic Word
    if(prefix[i] == Serial.read()) continue;
    // otherwise, start over
    i = 0;
    goto waitLoop;
  }
  
  // Hi, Lo, Checksum  
  while (!Serial.available()) ;;
  hi=Serial.read();
  while (!Serial.available()) ;;
  lo=Serial.read();
  while (!Serial.available()) ;;
  chk=Serial.read();
  
  // If checksum does not match go back to wait
  if (chk != (hi ^ lo ^ 0x55)) {
    i=0;
    goto waitLoop;
  }
  
  memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
  // Read the transmission data and set LED values
  for (uint8_t i = 0; i < NUM_LEDS; i++) {
    byte r, g, b;    
    while(!Serial.available());
    r = Serial.read();
    while(!Serial.available());
    g = Serial.read();
    while(!Serial.available());
    b = Serial.read();
    leds[i].r = r;
    leds[i].g = g;
    leds[i].b = b;
  }
  
  // Shows new values
  FastLED.show();
}

Scheint ja auch zu funktionieren, wenn man denn eben einen WS2812 hat. Der den ich noch hier liegen habe scheint leider Defekt zu sein.
Ich habe leider überhaupt keine Ahnung, wie ich das auf 'nen APA102 umbasteln könnte. Die meisten Tutorials/Videos die ich finde sind dann mit einem Pi + Hyperion - allerdings kann ich mir nicht vorstellen, dass das gleiche was mit WS2812 Stripes läuft, nicht ebenso auch einfach mit den APA102 funktionieren kann. Ob man als Software nun Prismatik, Ambibox, Bambilight (oder was auch immer) nimmt ist mir eigentlich relativ.

Eventuell kann mir ja jemand den entscheidenden Denkanstoß geben, sodass mein geplantes vorhaben doch noch läuft.

Hi

Es wird sich doch eine Lib finden lassen, Die mit APA102 funktioniert?

Klar geht Da dann der Sketch zur WS2812B-Lib nicht 1:1 mit - Das sollte schon klar sein.
Aber in beiden Versionen werden die Pixel-Farben irgendwo im Speicher deponiert und von dort aus werden Diese dann ausgelesen und zum Stripe geschickt.

Also Deinen Sketch so aufdröseln, daß Du .pixelset(nummer,r,g,b); in eine separate Funktion umleitest.
Dort steht vorerst auch nur der WS2812B-Aufruf drin.
Gleiches für .show() bzw. für die Initialisierung.

Wenn Das mit den neuen Funktionen läuft, den Sketch EXPORTIEREN (diese Version als ZIP auf Platte packen) - man weiß nie!

Nun kannst Du die andere Library einbinden, die Init-Folge des Beispiel in Deine Init-Funktion packen (den WS2812B-Kram auskommentieren).
Das Setzen der Pixel anpassen.
Das Ausgeben des Stripes auf die neue Lib 'umbiegen' - also statt ws2812b.show() wird Da dann wohl ata102.showstripe(); stehen.

Funktionierende Beispiele gibt's bei den meisten Libs dazu - Anschauen und Verstehen.
Die Grundsubstanz extrahieren und im eigenen Code einarbeiten.

Geschwätzt war's eigentlich ganz schnell :wink:

MfG

Du verwendest in deinem Sketch ja schon FastLED. Da brauchst du nur die initialisierung in setup() auf die anderen LEDs ändern.

FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN>(leds, NUM_LEDS);

Hab ich in der Doku gefunden: Basic usage · FastLED/FastLED Wiki · GitHub

Sollte so gehen, beachte das die APA Leds noch einen Clock Anschluß haben.

Verzweifler:
Du verwendest in deinem Sketch ja schon FastLED. Da brauchst du nur die initialisierung in setup() auf die anderen LEDs ändern.

FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN>(leds, NUM_LEDS);

Hab ich in der Doku gefunden: Basic usage · FastLED/FastLED Wiki · GitHub

Sollte so gehen, beachte das die APA Leds noch einen Clock Anschluß haben.

Ja, wahnsinn. Damit hast du mich schon mal ein ganzes Stück weiter gebracht!
Den Clock-Pin habe ich definiert und eingetragen. Steuerung mit Ambibox funktioniert schon mal teilweise - jetzt geht es dann eher an die Anordnung der Zonen und an die Farbkalibrierung.

Dachte das wird ein größerer Aufwand.. Danke schon mal an dieser Stelle.

Bei einem Nano kommst Du mit der SPI-Hardware auf höhere Geschwindigkeiten:

//DATA_PIN - MOSI Pin11
//CLK_PIN - ACK  Pin13
#define COLOR_ORDER BGR 
...
  FastLED.addLeds<APA102, COLOR_ORDER>(leds, NUM_LEDS);

COLOR_ORDER kann bei Dir anders sein, liegt am Hersteller.

agmue:
Bei einem Nano kommst Du mit der SPI-Hardware auf höhere Geschwindigkeiten:

//DATA_PIN - MOSI Pin11

//CLK_PIN - ACK  Pin13
#define COLOR_ORDER BGR
...
  FastLED.addLeds<APA102, COLOR_ORDER>(leds, NUM_LEDS);



COLOR_ORDER kann bei Dir anders sein, liegt am Hersteller.

Inwiefern auf andere Geschwindigkeiten? Eine höhere Baud- bzw. serialRate?

Die COLOR_ORDER ärgert mich ein bisschen. Die kann ich aber mit Prismatik umgehen und richtig setzen.
Die ersten Tests verliefen nun schon sehr gut.

Hi

Vll so:

#define COLOR_ORDER BGR 
-->
#define COLOR_ORDER RGB

Die Hardware SPI ist SCHNELLER, als Du Das per Software nachbilden kannst - ist auch irgendwie logisch, da dafür vom µC nicht 'nachgedacht' werden muß.

Dadurch ist der ganze Kram einfach früher fertig - da hier kein striktes Timing eingehalten werden muß, kann's auch in die andere Richtung gehen - muß nicht immer langsamer sein.

MfG

squishifish:
Die COLOR_ORDER ärgert mich ein bisschen.

Laß Dich nicht ärgern, passe es an.

squishifish:
Inwiefern auf andere Geschwindigkeiten? Eine höhere Baud- bzw. serialRate?

APA102 sind schneller, als ein Nano Daten liefern kann. Die SPI-Hardware soll die schnellste Ausgabemöglichkeit sein, weshalb ich sie verwende. Aber verglichen habe ich es noch nicht, kannst Du ja mal machen.

Bei einem 96 MHz Teensy 3.2 muß ich dann wieder die Ausgabe bremsen, weil sonst die LEDs spinnen.

Also... so langsam weiß ich wirklich nicht mehr warum es bei vielen anderen eher Plug & Play ist als Try & Error.

COLOR_ORDER kann ich definieren wie ich möchte, interessiert den Stripe nicht großartig

Beispiel:

#define COLOR_ORDER RGB

// Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
#define serialRate 115200

// Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data
uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i;

// Initialise LED-array
CRGB leds[NUM_LEDS];


void setup() {
  // Use NEOPIXEL to keep true colors
  FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, COLOR_ORDER>(leds, NUM_LEDS);

wenn ich es folgend mache

void setup() {
  // Use NEOPIXEL to keep true colors
  FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, COLOR_ORDER>(leds, NUM_LEDS, RGB);

werden nur noch 6 leds blau,grün,rot.
Es bleibt bei BGR, egal was ich eingebe.

Nun gut, bei Prismatik kann ich dann ja als Quelle RGB,BGR,GBR,RBG usw. auswählen.
Dann wähle ich eben "BGR" aus.

Anschließend kann man die Zonen einstellen, wie viele LEDs etc. und dann kommt folgendes Fenster:

Farbeinstellungen Prismatik

Wenn ich es so einstelle, wie es dort steht, dann ist der Stripe relativ "weiß" ebenso wie meine Wand.
Allerdings sind die Farben dann so weit runter, dass die Zonen gar nicht mehr vernünftig erkannt werden.
Sobald ich "rot" etwas weiter hochschiebe, sieht man eigentlich nur noch rot (im wahrsten Sinne des Wortes).

Ich weiß, dass das hier kein Prismatik-Hilfeforum ist, aber ich habe irgendwie das Gefühl ich muss noch etwas im Sketch anpassen.

Habe auch einen zweiten APA102 getestet, bei diesem ist es aber das gleiche Spiel.

Vielleicht hat von euch ja noch irgendjemand eine Idee, was ich übersehe oder falsch mache.

Hi

Habe mit FastLED bisher nur 1x ein Beispiel laufen lasssen, muß also nicht stimmen, was ich hier so erzähle :wink:

FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, COLOR_ORDER>(leds, NUM_LEDS);

APA102 ist der Typ der LED, wird eine Konstante der Lib sein
DATA_PIN ist der Pin, wo die Daten raus gehen - wirst Du eingestellt haben
CLOCL_PIN ist der Pin mit dem Clock-Signal, auch von Dir
COLOR_ORDER wurde von Dir auf eine Konstante der Lib gesetzt, hier RGB
leds ist der Speicherbereich, wo die LED-Farben gespeichert werden
NUM_LEDS müsste eigentlich auch von Dir eingestellt worden sein (da damit die Länge von leds vorgegeben wird), ist in dem Snipped aber nicht enthalten

Weshalb, wenn Du RGB noch in die Klammer packst (was auch nur eine Zahl, kA, vll. 6 ist), Du nur noch 6 Pixel angesteuert bekommst - dazu müsste man einen Blick in die Lib (die fastled.h, schätze ich Mal) werfen.

Warum das grmpfl Display nicht will, weiß der Kuckuck ... blödes Display, Blödes!

MfG