FastLed (WS2812b) und nrf24l01

Hallo

Ich Versuche auf meinen Nano sowohl digitale LEDs anzusteuern als auch eine Wireless Datenübertragung zu erreichen. Jedes davon einzeln Funktioniert ohne Probleme. Beim Versuch diese Zusammenzubringen bin ich auf komische Probleme gestoßen.

So bald ich die Zeile mit “radio.startListening()” einfüge lassen sich die LEDs nicht mehr ansteuern.

einfacher Testcode:

#include <FastLED.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define NUM_LEDS 20
#define DATA_PIN 4

CRGB leds[NUM_LEDS];

RF24 radio(9, 8); // CE , CSN
const byte address[6] = "00001";

void setup() 
{ 
  pinMode(DATA_PIN, OUTPUT);
  
  FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);

  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening(); //****PROBLEM****
}


void loop() 
{ 
  for(int i = 0; i <20; i++)
  {
    leds[i] = CRGB::Blue;
    FastLED.show();
    delay(200);
    leds[i] = CRGB::Black;
    FastLED.show();
    delay(200);
  }
}

Videos einmal mit der Zeile und einmal ohne:
VID_20200826_163857.mp4 - Google Drive, VID_20200826_163951.mp4 - Google Drive

Hat wer Erfahrung damit?

LG

WS2812B müssen blockierend angesteuert werden, was andere Kommunikation stören kann. Das kenne ich von IR-Fernbedienungen. Ob dies auch für nRF24L01 gilt, vermag ich mangels Erfahrung nicht zu sagen, wäre aber denkbar.

Abhilfe:

  • Den LED-Typ nach APA102 oder vergleichbar wechseln.
  • Zwei µCs verwenden.

Danke für die schnelle Antwort

-inwiefern unterscheiden sich APA102 von WS2812b (oder ähnlich)? Geht es dabei um die Eigenschaft der Clock? Da dieses einen eigenen Anschluss benötigt oder um eine Andere Eigenschaft?

-Würde z.b. bluetooth anstelle von dem nrf24l01 besser funktionieren?

  • Bei zwei Controller hätte ich wieder das Problem der Datenübertragung zwischen den beiden Chips. (Diese könnte natürlich auf unterschiedlichsten Arten realisiert werden)

  • Würden eventuell anderen Mikrocontroller wie z.b. ESP8266 oder ES32 (Node MCU or Wemos D1 mini) oder andere Arduinos Abhilfe schafen?

LG

eoun46055:
-inwiefern unterscheiden sich APA102 von WS2812b (oder ähnlich)? Geht es dabei um die Eigenschaft der Clock? Da dieses einen eigenen Anschluss benötigt oder um eine Andere Eigenschaft?

Ja, bei WS2812B müssen die Daten für alle Lichtpunkte in einem Rutsch übertragen werden, bei APA102 ist eine Unterbrechung möglich.

Wenn Hardware hereinkommende Informatioen entgegennehmen und in ausreichender Menge zwischenspeichern kann, dürfte es keine Probleme geben.

Ein ATtiny85 für die IR-Fernbedienung, mittels I2C mit einem UNO verbunden, der MP3-Dateien abspielt, konnte ich zum Laufen bekommen. Sowas hängt natürlich auch von der Datenmenge ab.

Ein ESP32 als Access Point mit HTML-Seite und 122 durch FastLED gesteuerte Lichtpunkte tun es bei mir.

Danke für die Antwort!

Ich bin etwas räumlich limitiert. Ich werde mal schauen ob ich die anderen LEDs herbekomme, bzw wirklich mal bluetooth probieren (wenn das theoretisch möglich ist), wenn nicht muss ich noch schauen wie ich das am besten mache...

Ein ESP32 als Access Point mit HTML-Seite und 122 durch FastLED gesteuerte Lichtpunkte tun es bei mir.

Der Access Point unterbricht aber nicht die FastLEDs oder? Was ist der Anwendungszweck bei dir? Ich hätte auch ein paar von denen herumliegen. Das Problem meien Anwendung muss auch Outdoor (Ohne Wlan) geeignet sein da wird das leider nicht wirklich umsetzbar sein.

Die Datenmenge ist sehr gering es geht um eine Fernsteuerung das heißt es werden eigentlich nur Schaltsignale übertragen.

LG

Was genau soll den deine Funkverbindung im Projekt erledigen ?
Evtl. gibt es ja noch eine andere Lösung.

eoun46055:
Das Problem meien Anwendung muss auch Outdoor (Ohne Wlan) geeignet sein da wird das leider nicht wirklich umsetzbar sein.

Der ESP32 kann sich an einem Router, beispielsweise FritzBox, anmelden, dann ist der Router ein Access Point. Der ESP32 kann aber auch selbst ein Access Point sein, also ein eigenes WLAN “aufspannen”.

Ich nutze ein Händi als Fernbedienung für eine LED-Animation. Der ESP arbeitet als Webserver und stellt in seinem Dateisystem SPIFFS eine HTML-Datei bereit, die ich mit dem Browser des Händis anwählen kann. Abgesehen von der Animation basiert das auf den Tabs von Fips.

Der Access Point Tab ist extra für mich aufgenommen worden. Bitte diese Illusion nicht zerstören!

Mit ESP32 an USB flackern die LEDs etwas, was vermutlich an einer Masseschleife liegt. Mit ESP32 am LED-Netzteil und OTA passiert das nicht.

Übrigens verwende ich die weniger stromhungigen WS2815 an 12 V, der ESP32 wird von einem StepDown versorgt.

Was genau soll den deine Funkverbindung im Projekt erledigen ?

Damit steuere ich die die Beleuchtung auf einem ferngesteuertem Auto. Daher soll es nur die einzellnen Lampen (LEDs) wie Blinker, Rücklicht, Scheinwerfer ein und ausschalten aber eben auch den Multifunktionsbalken mit den Digitalen LEDs ansteuern (Damit man eben Blaulicht, Blinklicht, Rückwarner etc erzeigen kann). Der Wagen ist als Notarzt angemalt. Einen Balken mit nur Normalen LEDs (Blau) habe ich bereits vor einigen Jahren umgesetzt und ich habe mir eben gedacht ein Ungrade auf digitale LEDs wäre schön

Der ESP arbeitet als Webserver und stellt in seinem Dateisystem SPIFFS eine HTML-Datei bereit, die ich mit dem Browser des Händis anwählen kann

Hmm das der ESP als Webserver dienen kann habe ich nicht gewusst. Das wäre dann denke ich auch mal ein Blick wert sich da zu erkundigen.

Übrigens verwende ich die weniger stromhungigen WS2815 an 12 V, der ESP32 wird von einem StepDown versorgt.

Stromprobleme habe ich nicht wirklich da ich einfach einen relativ große LIPO Akku über den von dem Auto befestigen kann.

Lustigerweise habe ich es schon geschafft den nrf24l01 und die LEDs gemeinsam anzusteuern. Wieso es damals funktioniert hat und heute nicht weis ich nicht. Eventuell weil der Testbalken nur aus 5Leds bestand anstatt den vollen 20
siehe :

eoun46055:
Hmm das der ESP als Webserver dienen kann habe ich nicht gewusst. Das wäre dann denke ich auch mal ein Blick wert sich da zu erkundigen.

Man muß sauber trennen:

  • Der ESP32 kann als Access Point (AP-Mode) ein eigenes WLAN "aufspannen" oder sich mit einem Router (STA-Mode = Station Mode) verbinden.
  • Der ESP32 kann als Webserver fungieren.

Die Punkte 1 und 2 sind unabhängig!

eoun46055:
Stromprobleme habe ich nicht wirklich da ich einfach einen relativ große LIPO Akku über den von dem Auto befestigen kann.

  • WS2812B und APA102 ungefähr 60 mA je Lichtpunkt (Pixel) maximal
  • WS2815 ca. 10 mA (Datenblatt 15 mA) je Lichtpunkt (Pixel) maximal

Die WS2815-LEDs sind in Reihe geschaltet, aber dennoch einzeln ansteuerbar, die Spannungsversorgung von 12 V funktioniert auch runter bis 8 V (7,4 V habe ich nicht getestet, könnte ich aber machen) bei 122 Pixeln.

eoun46055:
Eventuell weil der Testbalken nur aus 5Leds bestand anstatt den vollen 20

Probiere es aus, dann weißt Du es ;D

Nicht die angeschlossenen LEDs sind relevant, sondern die im Programm festgelegten.

Ich habe jetzt noch etwas herumprobier. Mit dem Arudino UNO funktioniert alles, nur am Nano bekomme ich es leider nicht zum laufen. Dabei ist es egal ob ich 5 oder alle 20 im Code habe. Es sind beides kleine original Arduinos und der Nano läuft anscheinend noch auf dem alten Boodloader (keine Ahnung ob das einen Unterschied macht). Ich werde noch weitere Test durchführen und auch mal mit anderen Nanos probieren vielleicht das genau nur der die Probleme...

eoun46055:
Ich habe jetzt noch etwas herumprobier. Mit dem Arudino UNO funktioniert alles, nur am Nano bekomme ich es leider nicht zum laufen. Dabei ist es egal ob ich 5 oder alle 20 im Code habe. Es sind beides kleine original Arduinos und der Nano läuft anscheinend noch auf dem alten Boodloader (keine Ahnung ob das einen Unterschied macht). Ich werde noch weitere Test durchführen und auch mal mit anderen Nanos probieren vielleicht das genau nur der die Probleme…

Auf beiden läuft der Atmeg328p als Controller. Sollte also auch auf dem Nano funktionieren.
Mit dem Bootloader hat das def. nichts zu tun.
Beschreibe doch mal, wie du alles angeschlossen hast oder zeige ein genaues Foto des Aufbaus.

Achja, wenn es keine Originale sind, sind es auch keine Arduinos, sondern nur Clone.

Auf beiden läuft der Atmeg328p als Controller. Sollte also auch auf dem Nano funktionieren.
Mit dem Bootloader hat das def. nichts zu tun.

Das habe ich mir auch gedacht.

Achja, wenn es keine Originale sind, sind es auch keine Arduinos, sondern nur Clone.

Ja da hast du recht. Ich verwende bis jetzt eigentlich ausschließlich aus Preisgründen solche und hatte damit fast nie Probleme

Beschreibe doch mal, wie du alles angeschlossen hast oder zeige ein genaues Foto des Aufbaus.

Ich habe nochmal alles neu aufgebaut und neue Test durchgeführt. Nun komischerweise geht es auf allen getesteten Platformen. Ich habe den UNO, den Nano am Steckbrett und auf der Platine sowie mit USB Versorgung und 12V und 5V extern. Die Platine ist eine Eigendesign und Eigenfertigung (CNC gefräst). Ja sie ist nicht perfekt und ich bin im laufe der Test auch schon auf ein paar Fehler drauf gekommen, aber nur so lernt man.

Ich werde das Programm jetzt langsam weitere Funktionen hinzufügen. Eventuell ist er irgendwann überfordert.

Fotos und Videos zu den Tests (Ich habe den Test im Video mit 800ms und 50ms Blinkfrequenz durchgeführt. die grüne LED wird von der Fernbedienung geschalten.

https://drive.google.com/drive/folders/1pkeFnB1vVWnd6oNQS-zDeXtalbpUiDbh?usp=sharing

(Simpler) Test Code:

#include <FastLED.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define NUM_LEDS 20
#define DATA_PIN 4

CRGB leds[NUM_LEDS];

RF24 radio(9, 8); // CE , CSN
const byte address[6] = "00001";

int input = 0;
int on = 0;

unsigned long currentmillis = 0;
unsigned long passtblinkermillis = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(DATA_PIN, OUTPUT);
 
  FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
  
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MAX);
  radio.startListening();
  Serial.println("setup Done");
}


void loop()
{
  currentmillis = millis();

  if ((currentmillis > passtblinkermillis + 50))
  {
    Serial.println("NOW"); //Ausgabe nur zur Debugging Zwecke
    passtblinkermillis = currentmillis; 
    if(on == 0)
    {
      on = 1;
      leds[0] = CRGB::Blue;
      leds[19] = CRGB::Blue;
      FastLED.show();
    }
    else
    {
      on = 0;
      leds[0] = CRGB::Black;
      leds[19] = CRGB::Black;
      FastLED.show();
    }
  }
  
  if (radio.available()) 
  {
     radio.read(&input, sizeof(input));
     Serial.println(input);

     if(input == 1001) //1001 und unten 1000 sind die Codes die von der Fernbedinung für den Bestimmten Button als Ein und Aus übertragen werden
     {
      leds[2] = CRGB::Red;
      FastLED.show();
     }
     if(input == 1000)
     {
      leds[2] = CRGB::Black;
      FastLED.show();
     }
  
  }
}

Leider keine Ahnung was sich zu vorher geändert hat… Grundsätzlich hat das System manchmal etwas hänger oder will einfach nicht anlaufen. Ich sag jetzt einfach einmal das liegt an dem nicht wirklich Professionellen und stabilen aufbau der Sache (aka Wackelkontakt oder ähnliches)