Forum: Mikrocontroller und Digitale Elektronik WS2812b Ansteuerung ESP32 nicht möglich


von Hans M. (inso)


Lesenswert?

Grüße,

ich habe ein sehr kurioses Problem.

Folgender Aufbau:
Meanwell 5V 12A Netzteil das WS2812b und später auch den Microcontroller 
speisen soll.
ESP32 (Wemos Lite) und Arduino Uno als "Testgeräte". Später soll der 
ESP32 die Stripes steuern.
Als WS2812b habe ich einmal feste 8er-Stripes 5050er zum Testen am 
Breadboard, ein Nachbau dieser: https://www.adafruit.com/product/1426
und auf der anderen Seite einzelne Stücke (12 - 50 Stück) mit 60 pro 
Meter als Stripes (die ich verbauen möchte).
Als Vorwiderstand dient erstmal ein 330ohm. Ground ist überall 
verbunden.
Libary ist die FastLED Libary, komplett auf ESP umgestellt incl Core 
0-Ansteuerung und mit 20-120 Frames Per Second.

Zu meinen 2812ern:
Die 8er Stücke:
Beide Controller steuern diese an. Der Arduino absolut problemlos, der 
ESP hat schon mal ne falsche Farbe dabei, vor allem wenn ich nur r1g1b1 
sende, ansonsten aber alles gut. Gehe ich mit dem Vorwiderstand auf 
220ohm runter ist auch beim ESP alles gut.
Nun zu den Stripes:
der Arduino steuert auch diese problemlos an, beim ESP flackert nicht 
einmal die erste LED auch nur ansatzweise. 220ohm, 330ohm, völlig egal.
Erster Gedanke: LEDs haben internen Vorwiderstand, ESP hat nur 3,3V am 
Pin. Einen Bi-Directional Level Shifter 
(https://www.sparkfun.com/products/12009 Nachbau) dazu. Netzteil-5V an 
HV, ESP-3,3V an LV, common ground. Ausgangspin vom ESP (hab 12 und 13 
getestet) über den Level-Converter, dann über den 330er Widerstand an 
die Stripe.
Erstmal will der ESP so gar nicht booten. Pinout runter, booten lassen, 
dann das exakt gleiches Ergebnis: 220ohm feste 8er-Chips alles gut, 
330ohm mit Fehlanzeigen. Stripe immer noch komplett tot, hab einen 
Sketch der die Stripe alle 500ms ein- und ausschaltet - da tut sich 
nix. Hab auch nen anderen Shifter probiert, immer das gleiche.
Spannung kann ich am Ende der Stripe messen (stabile 4,78V), der Arduino 
lässt sie auch in allen Farben leuchten, Einspeisung ist keine 5cm lang.
Hab auch mehrere andere Stücke der Stripe getestet, der ESP bekommt 
keine auch nur dazu mal zu blinzeln..
Leider besitze ich kein Oszilloskop um den Ausgang mal zu messen, nur 
ein normales Multimeter.
Nächster Versuch war dann eine einzelne LED mit 3,3V Spannung zu 
betrieben, damit diese das Data-Signal ein wenig anhebt. Die LED mit 
3,3V funktioniert (wobei r255g255b255 hier wie erwartet ein tiefes rot 
ergeben), der Data Out kann aber auch hier nicht die längere Stripe zum 
leuchten bringen.
Einzig: Bringe ich die Spannung an der Stripe auf ~2,5V runter bekomm 
ich sie dann endlich "nativ" angesteuert - natürlich in orange und, was 
mich stutzig macht, dann flackert sie ordentlich.

Eine andere Möglichkeit das Signal hochzupegeln wüsste ich jetzt nicht 
(hab noch LM2596, Transistoren und Optokoppler hier rumfliegen, aber die 
sind laut allem was ich gelesen hab alle zu langsam für die Stripes). 
Ich bin jetzt leider auch nicht der Crack was die Feinelektronik 
betrifft, hab mich mal ordentlich quergelesen aber das war es auch 
schon. An sich sollte das aber doch mit dem Level Shifter problemlos 
klappen.?

Vor allem das ich die einen (8er-)2812b absolut problemlos ansteuern 
kann und die anderen überhaupt nicht macht mich echt stutzig, die 
sollten doch eigentlich alle die gleichen Spannungen für high und low 
nehmen wenn sie beide die gleiche Betriebsspannung haben?

Aso, den ESP als auch das Netzteil hab ich auch mal auf Verdacht 
getauscht, beide das gleiche Ergebnis. ESP an gleichem oder anderem 
Netzteil hat auch keinen Unterschied gemacht.

Mittlerweile bin ich mit meinem Latein am Ende..

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

du kannst ja den langen Streifen an den 8'er hinten dran hängen, da hast 
du den Pegel schon mal auf 5V angepasst. Aber wahrscheinlich ist das 
Timing des ESP für die Sorte LEDs gerade außerhalb des Bereichs was die 
noch so abkönnen.

Sascha

von Alex D. (daum)


Lesenswert?

Also ich steuere meine WS2812b ohne Probleme mit einem STM32, ebenfalls 
3,3V (allerdings ohne Vorwiderstand, sollte ja nicht nötig sein), daran 
sollte es nicht liegen.
Hast du einen Logic-analyser oder Oszilloskop? Wenn ja dann miss mal die 
Datenleitung und schau ob die Frequenz der Pulse stimmt (sollte ~800kHz 
haben und möglichst konstant sein) und das on/off Verhältnis bei 0 
sollte ca 1/3, bei 1 ca 2/3 sein.

von Hans M. (inso)


Lesenswert?

Alex D. schrieb:
> Also ich steuere meine WS2812b ohne Probleme mit einem STM32, ebenfalls
> 3,3V (allerdings ohne Vorwiderstand, sollte ja nicht nötig sein)

Aber ist der Widerstand nicht für die ggf auftretenden Spikes, und 
sollte in keiner Schaltung weggelassen werden? Wenn ich im Netz 
8266er-Schaltungen sehe (der nutzt ja auch 3,3V) hat jeder den 
Widerstand drinnen..
Oszilloskop oder so was hab ich leider gar nichts, nur nen normales 
Multimeter..

@Sascha aber sollte der Logic Level Converter nicht eh schon mein Signal 
auf 5V-Niveau erhöhen?

von Michael U. (amiga)


Lesenswert?

Hallo,

Hans M. schrieb:
> Aber ist der Widerstand nicht für die ggf auftretenden Spikes, und
> sollte in keiner Schaltung weggelassen werden?

der Widerstand hat erstmal den Zweck, die erste WS2812 zu schützen. Wenn 
am Stripe keine Betriebsspannung anlegt und das Steuersignal an Din 
anliegt, können interne Schutzdioden oder sonstige Halbleiterstrukturen 
leitend werden und versuchen, den Stripe aus diese Spannung zu 
versorgen. Dafür hat die erste LED meist kein Verständnis. Schon wenn 
die LEDs und die Ansteuerung aus  eigenen Netzteilen versorgt werden, 
kann man diesen Zustand schon beim Einschalten haben.

Gruß aus Berlin
Michael

von Stefan F. (Gast)


Lesenswert?

Hans M. schrieb:
> Der Arduino absolut problemlos, der
> ESP hat schon mal ne falsche Farbe dabei

Du hast wahrscheinlich das berühmte Timing Problem. Bei den ESP Chips 
ist es unmöglich, exakte Timings zu erzeugen, weil dein Programm in 
unregelmäßigen Zeitabständen für unregelmäßige Zeit durch die Basis 
Firmware unterbrochen wird.

Es soll angeblich helfen, das eigene Programm auf einem dedizierten CPU 
Kern laufen zu lassen, während der WLAN Kram auf dem anderen Kern läuft.

> Leider besitze ich kein Oszilloskop um den Ausgang mal zu messen,
> nur ein normales Multimeter.

Ein Logic Analyzer wäre hier wahrscheinlich hilfreicher, auf jeden Fall 
billiger (ca. 10€).

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

auf dem ESP8266 nehm ich zur Ansteuerung die UART-Schnittstelle.
Baud: 7200000
Mode: SERIAL_7N1
Pin invertieren mit U0C0 |= (uint32_t)(1<<UCTXI)
zur Ankopplung der WS2812 einen 4.7k Widerstand von der 1.LED nach +5V, 
und den Ausgang des ESP mit einer 1N4148 an die LED. Stromversorgung 
sollte natürlich verbunden sein.

Ausgabe für ein 1-Bit 0x60 und für ein 0-Bit 0x7C

Da die Ausgabe damit per UART-Hardware läuft und gepuffert ist läuft das 
ohne Probleme.


Sascha

von Stefan F. (Gast)


Lesenswert?

Sascha W. schrieb:
> Auf dem ESP8266 nehm ich zur Ansteuerung die UART-Schnittstelle.
> Da die Ausgabe damit per UART-Hardware läuft und gepuffert ist läuft das
> ohne Probleme.

Sehr gute Idee.

von Michael U. (amiga)


Lesenswert?

Hallo,

Du kannst ja mal mit der NeoPixelBus Lib testen:
https://github.com/Makuna/NeoPixelBus

Er hat den ESP32 inzwischen mit drin und nutzt wie beim ESP8266 I2S-DMA 
für die Ausgabe. Das hat sich zumindest auf dem ESP8266 durch nichts aus 
der Ruhe bringen lassen. UART hat er auf dem ESP8266 auch als 
Alternative drin, das lies sich bei größeren LED-Anzahlen aber durch 
WLAN durchaus stören.

Gruß aus Berlin
Michael

von Joachim B. (jar)


Lesenswert?

ich bin auch gerade dabei mit einem ESP32 256 WS2812 in einer Matrix 
anzusteuern, kein Problem für die Ansteuerung, helfen tut ein BS170 und 
1 R 1k auf der 5V Seite, den auf der ESP Portseite habe ich "eingespart" 
der Port ist entweder aktiv low oder aktiv high.
Beitrag "Re: Pegelwandler 5V->3V"

Mir fehlt nur noch die SW für 2 16x8 Matrixen, 1 läuft, 2 laufen aber 
nicht mit LEDText und LEDMatrix die Github Beispiele verstehe ich nicht, 
wenn einer ein Idee hat?

Matrix 1 zig_zag
1
----------------
2
                |
3
----------------
4
|
5
----------------
6
                |
7
----------------
8
|
9
----------------
10
                |
11
----------------
12
|
13
----------------
14
                |
15
----------------

Matrix 2 zig_zag hinter Matrix 1 auf der linken Seite
1
----------------
2
                |
3
----------------
4
|
5
----------------
6
                |
7
----------------
8
|
9
----------------
10
                |
11
----------------
12
|
13
----------------
14
                |
15
----------------

ich schaffe die Init 2er nicht

Die Matixen laufen nur nicht die Laufschrift über Beide.

von Hans M. (inso)


Lesenswert?

Stefanus F. schrieb:
> Hans M. schrieb:
>> Der Arduino absolut problemlos, der
>> ESP hat schon mal ne falsche Farbe dabei
>
> Du hast wahrscheinlich das berühmte Timing Problem. Bei den ESP Chips
> ist es unmöglich, exakte Timings zu erzeugen, weil dein Programm in
> unregelmäßigen Zeitabständen für unregelmäßige Zeit durch die Basis
> Firmware unterbrochen wird.
>
> Es soll angeblich helfen, das eigene Programm auf einem dedizierten CPU
> Kern laufen zu lassen, während der WLAN Kram auf dem anderen Kern läuft.
>
>> Leider besitze ich kein Oszilloskop um den Ausgang mal zu messen,
>> nur ein normales Multimeter.
>
> Ein Logic Analyzer wäre hier wahrscheinlich hilfreicher, auf jeden Fall
> billiger (ca. 10€).

Die Timings hab ich ausgeschlossen, WLan rennt auf Core 1, die 
LED-Sachen auf Core 0, auch parallel kein Problem.
Wenn ich die 2x8er Reihen mit 220 Ohm ansteuere habe ich auch absolut 
keine Farbprobleme oder so. Da lasse ich die LEDs einzeln in 
verschiedenen Tasks rauf und runter dimmen, Farbe ändern usw, 
stundenlang ohne den kleinsten Fehler.. daher gehe ich klar davon aus, 
das es die Stripe sein muss.

Sascha W. schrieb:
> auf dem ESP8266 nehm ich zur Ansteuerung die UART-Schnittstelle.

An sich eine sehr coole Idee, leider hab ich bis zu 5 Ausgänge am ESP 
die später zu verschiedenen Ketten führen. Das über mehrere Ausgänge 
rennen zu lassen war überhaupt der Grund vom Arduino zu wechseln :D

Michael U. schrieb:
> Du kannst ja mal mit der NeoPixelBus Lib testen:
> https://github.com/Makuna/NeoPixelBus

Danke für den Link, wenn es sich gar nicht ordentlich fängt auf jeden 
fall ne Idee wert. Allerdings hab ich jetzt 3 Wochen dran geschrieben 
über die FastLED schöne Abläufe zu haben - sollte das rennen müsste ich 
nochmal große Teile neu programmiern -.-

Joachim B. schrieb:
> ich bin auch gerade dabei mit einem ESP32 256 WS2812 in einer Matrix
> anzusteuern, kein Problem für die Ansteuerung, helfen tut ein BS170 und
> 1 R 1k auf der 5V Seite, den auf der ESP Portseite habe ich "eingespart"
> der Port ist entweder aktiv low oder aktiv high.
> Beitrag "Re: Pegelwandler 5V->3V"
>
> Mir fehlt nur noch die SW für 2 16x8 Matrixen, 1 läuft, 2 laufen aber
> nicht mit LEDText und LEDMatrix die Github Beispiele verstehe ich nicht,
> wenn einer ein Idee hat?

Hab einige Transistoren hier, aber natürlich keinen so schnellen -.-
Mittlerweile scheint mir, das mein Logic Level Converter einfach zu 
langsam ist (obwohl oft empfohlen). Direkt nen paar "74HC14" aus China 
in den Warenkorb geworfen, die sollen bei einigen Verbesserungen 
bringen..
Derweil hab ich zumindest mal ne Farbe aus der LED-Stripe bekommen, 
allerdings völlig instabil. Hab eine einzelne LED genommen, und die 
Spannung für die separiert über ne Diode laufen, so das gut 0,5V an V-In 
abfallen. Den Data Out jetzt in die Stripe, und es kommt zumindest was 
an. Wollte jetzt noch mal einige ZenerDioden testen ob ich mit einer 
bessere Ergebnisse erziele..
Nen Logic Analyzer werd ich mir aus nem Arduino basteln, da gibt es auch 
feine fertige Sketche - mal schauen was da so bei rauskommt. Da ich aber 
wie gesagt andere Stripes gut rennen hab rechne ich eher mit 
Spannungspegel- als Timingproblemen..

Zu deinem Problem mit der zweiten Stripe am ESP32: neueste 
FastLed-Libary, da den DemoReelESP32-Sketch mal anschauen. Im Endeffekt 
setzt du oben noch
1
#define FRAMES_PER_SECOND  120
2
3
// -- The core to run FastLED.show()
4
#define FASTLED_SHOW_CORE 0
5
6
// -- Task handles for use in the notifications
7
static TaskHandle_t FastLEDshowTaskHandle = 0;
8
static TaskHandle_t userTaskHandle = 0;

nach dem include ein, und kopiert die kompletten Funktionen "void 
FastLEDshowESP32()" und "void FastLEDshowTask(void *pvParameters)" 
rüber. Ausserdem im Setup
1
  // -- Create the FastLED show task
2
    xTaskCreatePinnedToCore(FastLEDshowTask, "FastLEDshowTask", 2048, NULL, 2, &FastLEDshowTaskHandle, FASTLED_SHOW_CORE);
und, ganz wichtig, statt "FastLED.show" nimmst du nun immer 
"FastLEDshowESP32();" (sprich die Funktion die du oben einkopiert hast).
Damit sollte jeder FastLED-Task auf deinem "Anwendungenkern" rennen, und 
der ESP keinen Reboot beim Aufruf der Show-Funktion hinlegen ;)

von Joachim B. (jar)


Lesenswert?

du könntest auch mit nichtinvertierenden Buffern an 5V arbeiten 74HCT125 
o.ä. weil die HCT an 5V high ab 2V typisch erkennen.

Hans M. schrieb:
> Zu deinem Problem mit der zweiten Stripe am ESP32: neueste
> FastLed-Libary, da den DemoReelESP32-Sketch mal anschauen. Im Endeffekt
> setzt du oben noch
LINK?

das erkläre bitte noch mal genauer, alle Erklärungen bis jetzt habe ich 
nicht verstanden oder sie waren ungenügend.

bis jetzt ist der Init
FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds[0], leds.Size());

OK

LEDText Probleme konnte ich mit Hilfe des Autors AaronLiddiment klären
aber weiter?

mit der Adafruit NEO Pixel Lib gibt es Stress, flackert unsauber

und

// Parameter 4 = matrix layout flags, add together as needed:
//   NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, 
NEO_MATRIX_RIGHT:
//     Position of the FIRST LED in the matrix; pick two, e.g.
//     NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
//   NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in 
horizontal
//     rows or in vertical columns, respectively; pick one or the other.
//   NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
//     in the same order, or alternate lines reverse direction; pick 
one.
//   See example below for these values in action.

ist auch keine Erklärung

was meinen die mit TOP BOTTON, LED0 bis LED ende?
Wo sind Beispiele

Ich versuchte auch in FASTLED LEDMatrix

aber 2 die hintereinander liegen schaffte ich nicht

Es wird immer nur eine 16x8 benutzt

ich versuchte
#define MATRIX_WIDTH   32  // Set this negative if physical led 0 is 
opposite to where you want logical 0
#define MATRIX_HEIGHT  8

und
#define MATRIX_WIDTH   16  // Set this negative if physical led 0 is 
opposite to where you want logical 0
#define MATRIX_HEIGHT  16

aber beide nutzten nur eine Matrix

Das Layout der Matrix ist zig_zag 16x8 mit LED0 oben links und LED127 
unten links und beide hintereinander funktionieren wenn ich von LED0 bis 
LED 255 einzeln durchtackere.

: Bearbeitet durch User
von Hans M. (inso)


Lesenswert?

Sorry, ich hätte ein wenig weiter ausholen sollen, war schon zwei 
Gedanken weiter^^: hab mich da auch grad nur fix quergelesen, selbst 
noch kein 2d-Textarray angesteuert.
Soweit ich das verstehe kannst du jeden Text nur auf einem Ausgang 
sauber laufen lassen. Sprich du musst einen zweiten Ausgang nehmen, und 
da auch über nen BS170 und 330Ohmer die Stripe dran klemmen, so das du 
beide Ausgänge problemlos separat ansteuern kannst. So wie du es jetzt 
hast ist es ja ein Textarray das du aus beiden machen könntest, für 
verschiedene Texte brauchst du also entsprechend zwei davon.
Das ist soweit ja eionfach: du initialisierst dir zwei LED Stripes statt 
einer (gibst deinem 2ten Array nen anderen Namen, definierst Pinout und 
LED-Anzahl). Diese sprichst du dann auch entsprechend an.
Also bspw
1
#define NUM_LEDS_S1 30
2
#define NUM_LEDS_S2 45
3
4
#define DATA_PIN_S1 12
5
#define DATA_PIN_S2 13
6
7
CRGB ledsS1[NUM_LEDS_S1];
8
CRGB ledsS2[NUM_LEDS_S2];
9
10
FastLED.addLeds<WS2812B, DATA_PIN_S1, GRB>(ledsS1, 0, NUM_LEDS_S1).setCorrection(TypicalLEDStrip);
11
12
FastLED.addLeds<WS2812B, DATA_PIN_S2, GRB>(ledsS2, 0, NUM_LEDS_S2).setCorrection(TypicalLEDStrip);

und ledsS1 und ledsS2 solltest du jetzt separat zu nem 2dimensionalen 
Array machen können und mit Text versehen können (wie gesagt, ab hier 
hab ich das selber noch nicht gemacht)

Der ESP32 kann jetzt glücklicherweise auch beide parallel befeuern weil 
er für jeden nen eigenen Task startet. Allerdings wird er dir absaufen, 
wenn du jetzt nicht die o.G. Änderungen in deinen Sketch einfliessen 
lässt - die beispiele dazu (also der Parallelität am ESP32^^) findest 
du entweder in der bei dir in der Arduino IDE bzw im Visual Studion 
MicroBuild unter "Beispiele - FastLed- DemoReelESP32" - oder in der 
Libary auf GitHub: 
(https://github.com/FastLED/FastLED/tree/master/examples/DemoReelESP32)

: Bearbeitet durch User
von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Hans M. schrieb:
> Soweit ich das verstehe kannst du jeden Text nur auf einem Ausgang
> sauber laufen lassen

nein, ich muss 'nur' die Matrix umorganisieren für 2 Panels
das läuft ja von 0-255 im single step nur kommt die Textdarstellung 
nicht zurecht, wenn ich aber meine Matrix umorganisiere mit einem swap 
vor FASTLED.show

aus

0-127

und

128-255

aufteilen nach

0-15 auf Matrix 1 und 16-31 auf Matrix 2

für 8 Zeilen dann sollte es klappen

nur war ich in Matrix Rechnung nicht gut

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Joachim B. schrieb:
> nein, ich muss 'nur' die Matrix umorganisieren für 2 Panels
> das läuft ja von 0-255 im single step nur kommt die Textdarstellung
> nicht zurecht, wenn ich aber meine Matrix umorganisiere mit einem swap
> vor FASTLED.show

ich habs fertig, da der TO von fastLED Text noch nichts ergänzt hat habe 
ich die Matrix umorganisiert, vor fastLED.show "swappe" ich die 2 echten 
Matritzen zu einer Textmatrix bzw. umgekehrt, so kann der Text laufen 
als wenn die Matrix so wäre 8x32 und in real gebe ich die LEDs passend 
für zwei 8x16 zig_zag Matritzen hintereinander aus.

: Bearbeitet durch User
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.