Forum: Mikrocontroller und Digitale Elektronik ESP32 und WS2812B


von Markus P. (markus_p160)


Angehängte Dateien:

Lesenswert?

Hallo

Ich versuche mit dem ESP32 WS2812b LEDs anzusteuern. Ich habe mich schon 
etwas informiert und gesehen das es dabei öfters Probleme gibt. Jedoch 
habe ich keine Lösung für mein Problem gefunden.

Problem: Die LEDs lassen sich grundsätzlich mit dem ESP32 ansteuern 
jedoch will die erste LED in der Reihe nicht so richtig. Ich habe gesamt 
20LEDs angeschlossen.

Wenn ich eine FOR programmiere und alle nacheinander einschalte dann 
leuchtet die erste LED immer in einer anderen Farbe. Ich habe es auch 
schon mit mehreren LEDs getestet (Da ich mehrere Segmente habe) (Die 
beiden im Video sind die beiden der neuesten Generation (Reihenfolge 
egal). Ich habe es allerdings auch schon mit den anderen LEDs getestet.
Ich verwende die FastLED lib da ich mit der Adafruit kein Glück gehabt 
habe.

Code Video:
1
#include <FastLED.h>
2
3
#define NUM_LEDS 20
4
5
#define DATA_PIN 2
6
CRGB leds[NUM_LEDS];
7
8
void setup() 
9
{
10
  FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS); 
11
}
12
13
void loop() 
14
{
15
  for(int i = 0; i <20; i++)
16
  {
17
    leds[i] = CRGB::Red;
18
    FastLED.show();
19
    delay(50);
20
  }
21
  delay(50);
22
  for(int i = 0; i <20; i++)
23
  {
24
    leds[i] = CRGB::Black;
25
    FastLED.show();
26
    delay(50);
27
  }
28
}

Wenn ich zum testen mal nur die erste [0] und die vorletzte [18] 
anschalte dann gibt sich ein komisches verhalten. Wenn ich mache:

leds[0] = CRGB::Red;
leds[18] = CRGB::Red;

dann leuchtet wie im angehängten Bild die Erste in einer anderen Farbe 
und die Vorletzte. Wenn ich mache:

leds[0] = CRGB::Blue;
leds[18] = CRGB::Blue;

Dann leuchtet die zweite und die letzte LED (beide Rot).
Das die Farben nicht mit den Codefarben übereinstimmen ist mir bewusst 
und es ist für mich kein Problem (es ist einfach die Reihenfolge von RGB 
anders)

Mit anderen Farben ergibt sich zum Teil ein noch komischeres Verhalten.

leds[0] = CRGB( 50, 100, 150);
leds[18] = CRGB( 50, 100, 150);

Leuchten dann gleich 4LEds in verschiedenen Farben. (Siehe Bild)

Code Bild:
1
#include <FastLED.h>
2
#define NUM_LEDS 20
3
4
#define DATA_PIN 2
5
CRGB leds[NUM_LEDS];
6
7
void setup() 
8
{
9
  FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS); 
10
  leds[0] = CRGB::Red;
11
  leds[18] = CRGB::Red;
12
  FastLED.show();
13
}
14
15
void loop() 
16
{
17
 
18
}

Hat jemand eventuell eine Idee?

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

es gibt über die Zeit intern verschiedenen Versionen der WS2812.
Ich habe auch einen Stripe, der mit dem 3,3V Pegel des ESP32 nicht 
klarkommt.
Also Pegelwandler auf 5V dazwischen.
Auch daran denken, daß der Zustand ESP32 Spannung ist da, 5V für die LED 
aber nicht gern zum Ausfall der ersten LED führt, weil dann über Din und 
die Schutzdioden der Stripe mit dem H-Pegel versorgt werden würde. Dafür 
haben die Schutzdioden und u.U. auch der IO des ESP32 wenig Verständnis.
330 Ohm in Reihe begrenzen den Strom und verhindern das.

Gruß aus Berlin
Michael

von Markus P. (markus_p160)


Lesenswert?

Vielen Dank für die schnelle Antwort!

Ich habe nun das Signal mit einem 4Kanal Logic Level Converter auf 5V 
angehoben und das dürfte nun anscheinend alle Probleme behoben haben.

Allerdings kann man den ESP nicht programmieren wenn er an Logic Level 
angeschlossen ist. Mann muss die 3,3V rausziehen bevor man ihn 
Programmieren kann.
Ich habe auch gerade probiert den ESP mittels externen 5V zu versorgen. 
Jedoch funktioniert dies leider nicht. Das Programm starten und die 
ersten 5LEDs leuchten jedoch hängt sich dann der ESP auf und die LED auf 
dem ESP blinkt nur noch. Wenn ich alles über USB betreibe ist es kein 
Problem. Hier geht es aber auch nur wenn ich nicht den GND neben den 5V 
Input benutze.

von Joachim B. (jar)


Lesenswert?

Markus P. schrieb:
> Allerdings kann man den ESP nicht programmieren wenn er an Logic Level
> angeschlossen ist. Mann muss die 3,3V rausziehen bevor man ihn
> Programmieren kann.

liest sich nach Anschlußfehler, ich habe derlei nicht beobachtet.

von Markus P. (markus_p160)


Lesenswert?

Ich habe nun nochmal alles neu aufgebaut und getestet. Das mit dem 
Programmieren habe ich leider immer noch. Ist aber jetzt nicht das 
größte Problem. Das mit der externen Versorgung glaube ich habe ich auch 
herausgefunden. Der auf den Pin steht zwar 5V allerdings braucht der ESP 
mehr als 5V ich habe es mal getestet und ab ca. 5,6V hat er 
funktioniert. Die Frage ob die LEDs das aushalten? Laut den Datasheet 
halten die nur 5,3V aus. Sonst muss ich noch extra eine zweite Spannung 
erzeugen. Oder ich nehme ein USB kabel und schneide den einen Stecker ab 
und powere ihn so.

von fop (Gast)


Lesenswert?

Es gibt ein paar Pins, die der ESP einliest, wenn er aus dem Reset 
kommt, und anhand derer er entscheidet, was er macht. Vielleicht hast Du 
einen davon erwischt, so dass statt dem seriellen Bootloader etwas 
anderes ausgewählt wird. GPIO2 war wenn ich mich recht erinnere so 
einer.

Das ist vermutlich nur mal ein schnell zur Fehlersuche hingetipptes 
Programm, oder ?
Sonst wäre es ja schade, wenn Du Dein schönes Define NUM_LEDS nicht auch 
in den Abbruchbedingungen der for-Schleifen nutzen würdest.

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Stützelko wird auch gerne vergessen.

von Joachim B. (jar)


Lesenswert?

fop schrieb:
> GPIO2 war wenn ich mich recht erinnere so
> einer.

oder 5 kann von LED belegt sein!
Dann gibt es noch die I2C Vorbelegung die Rx Tx Vorbelegung und weitere.
Man braucht schon einen freien Pin.

von Markus P. (markus_p160)


Lesenswert?

Ich habe es nun mal mit GPIO 0 getestet da dürfte alles gehen.

Ja das ist nur ein Test Programm.

Ich werde mal die Platine dafür Designen und fertigen und dann mal 
schauen ob noch immer alles geht.

Vielen Dank für die schnelle Hilfe!

von Oliver S. (phetty)


Lesenswert?

Wenn das Kabel zum Stripe sehr kurz ist kann man die erste LED als 
"Opferled" verwenden, die dient dann nur dazu, den Pegel hochzuziehen.
Sollte man dann eben bei LED2 anfangen mit dem Lichterspiel.

von Nils W. (derniwi)


Lesenswert?

Halo,

wenn Du FastLED so initialisierst, hast Du kein Problem mit den Farben:
 FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);

Ich nutze Pin 17.

Gruß
Nils

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.