Forum: Mikrocontroller und Digitale Elektronik WS2812B DIN/DOUT Problem


von TOhm (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein Problem mit einem WS2812B an einem Arduino Uno. Egal was 
ich versuche, ich bekomme keine einzige der LEDs auf dem Streifen zum 
leuchten.

Aufbau:
-------
Der Arduino Uno wird mit 9V (VIN, GND) von einem Labornetzteil 
gespeisst, der WS2812B (aktuell ein Streifen mit nur 10 LEDs) wird über 
einen LM7805 von demselben Netzteil gespeisst. Zwischen VCC und GND 
hängt ein 1000uF Kondensator, DIN vom WS2812B ist über einen 330 Ohm 
Widerstand mit Port 6 am Arduino verbunden, die Kabel sind alle sehr 
kurz (max Länge ca. 10cm).

Code:
-----
Ich verwende den Adafruit Neopixel strandtest Code 
(https://github.com/adafruit/Adafruit_NeoPixel/blob/master/examples/strandtest/strandtest.ino), 
PIN ist korrekt auf 6 eingestellt, Anzahl der LEDs habe ich auf 10 
gesetzt:

#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(10, PIN, NEO_GRB + 
NEO_KHZ800);

Der Rest des Codes wurde unverändert übernommen.

Messung:
--------
Ich messe auf dem WS2812B zwischen VCC und GND eine Spannung von 4.9V, 
an DIN der ersten LED sehe ich mit dem Oszi die entsprechenden Signale 
(800kHz, sehen soweit gut aus, Pegel scheint auch zu passen). Allerdings 
ergibt eine Messung mit dem Oszi an DOUT der ersten LED kein Signal, 
sprich dieses wird nicht weitergeleitet, auch die erste LED bleibt immer 
aus. Eine Änderung der Frequenz auf 400kHz brachte auch keine Änderung.

Ich dachte nun zuerst, dass die erste LED evtl. defekt sei und habe 
diese entfernt, ebenso die zweite, aber keine Änderung. Danach habe ich 
einen komplett anderen Streifen (hinten von der Rolle) verwendet, aber 
auch hier keine Änderung.

Sonstiges:
----------
- Eine Speisung des Arduino Uno direkt per USB und Anschluss des WS2812B 
direkt an 5V/GND (ohne LM7805) an den Arduino (sprich Betrieb komplett 
ohne externes Netzteil) bringt ebenso keine Änderung.

- Der Strip ist definitiv ein WS2812B (alle paar cm auf dem Strip 
aufgedruckt), die LEDs sind 4 PIN LEDs. Hinter den LEDs ist auf dem 
Streifen jeweils ein kleiner SMD Kondensator.

- Hin und wieder flackert mal kurz eine LED auf dem Streifen.

- Die Verkabelung scheint zu passen, ich habe kurze Kabellängen, 
Verbindungen sind gelötet (kein Steckbrett), Kondensator zwischen VCC 
und GND, Widerstand vor DIN. Dies sieht man eigentlich auch daran, dass 
ich ja am Streifen zwischen VCC/GND ca. 4.9V messe und auf ein Signal an 
DIN anliegt.


Hat jemand noch Ideen in welche Richtung ich suchen könnte? Bilder vom 
Aufbau kann ich leider erst heute Abend nachliefern.


Vielen Dank jedenfalls schonmal für alle Ideen und Tips :)

von Joachim B. (jar)


Lesenswert?

TOhm schrieb:
> Der Arduino Uno wird mit 9V (VIN, GND) von einem Labornetzteil
> gespeisst,

warum tut man das dem armen Regler an?, einfach mit 5V an 5V tuts nicht, 
bzw. statt dessen aus dem USB?

> der WS2812B (aktuell ein Streifen mit nur 10 LEDs) wird über
> einen LM7805 von demselben Netzteil gespeisst.

unnötig, 10 LEDs konnten immer aus der USB Versorgung und den 5V vom 
Arduino bei mir entnommen werden ohne den armen Regler zu bemühen.
OK in seltenen Fällen bei 10x Spitzenweiss = 600mA und schwacher USB 
kann es klemmen.

>  Zwischen VCC und GND
> hängt ein 1000uF Kondensator, DIN vom WS2812B ist über einen 330 Ohm
> Widerstand mit Port 6 am Arduino verbunden, die Kabel sind alle sehr
> kurz (max Länge ca. 10cm).

mit dem Code hatte ich nie Schwierigkeiten, ich nutze gerne die Arduino 
fastLED LIB, auch die aus dem µC Forum von TIM funktioniert prima.

> Messung:
> --------
> Ich messe auf dem WS2812B zwischen VCC und GND eine Spannung von 4.9V,
> an DIN der ersten LED sehe ich mit dem Oszi die entsprechenden Signale
> (800kHz, sehen soweit gut aus, Pegel scheint auch zu passen). Allerdings
> ergibt eine Messung mit dem Oszi an DOUT der ersten LED kein Signal,
> sprich dieses wird nicht weitergeleitet, auch die erste LED bleibt immer
> aus. Eine Änderung der Frequenz auf 400kHz brachte auch keine Änderung.

GND vergessen?

> Hat jemand noch Ideen in welche Richtung ich suchen könnte? Bilder vom
> Aufbau kann ich leider erst heute Abend nachliefern.

keine Idee ohne Bilder, alle SW hast du schon probiert?

Arduino #include <FastLED.h>
Beitrag "Lightweight WS2811/WS2812 Library"

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

deinen ganzen Code mal hier zeigen.

von TOhm (Gast)


Lesenswert?

Joachim B. schrieb:
> TOhm schrieb:
>> Der Arduino Uno wird mit 9V (VIN, GND) von einem Labornetzteil
>> gespeisst,
>
> warum tut man das dem armen Regler an?, einfach mit 5V an 5V tuts nicht,
> bzw. statt dessen aus dem USB?

Ich hatte es vorher mit 5V (bzw auch direkt per USB, siehe Text) 
getestet,
es macht keinen Unterschied. Ich hatte den Arduino dann nur per 9V 
gepowert, weil ich gelesen hatte, dass er bei VIN zwischen 7 und 12V 
benötigt und 5V dann vielleicht zuwenig sind.

>
>> der WS2812B (aktuell ein Streifen mit nur 10 LEDs) wird über
>> einen LM7805 von demselben Netzteil gespeisst.
>
> unnötig, 10 LEDs konnten immer aus der USB Versorgung und den 5V vom
> Arduino bei mir entnommen werden ohne den armen Regler zu bemühen.
> OK in seltenen Fällen bei 10x Spitzenweiss = 600mA und schwacher USB
> kann es klemmen.

Das ist schon klar, ich hatte anfangs ca. 60 LEDs dran und bin dann 
später nur zur Fehlersuche auf 10 Stück herunter, daher der Aufbau mit 
dem externen Netzteil.

>
>>  Zwischen VCC und GND
>> hängt ein 1000uF Kondensator, DIN vom WS2812B ist über einen 330 Ohm
>> Widerstand mit Port 6 am Arduino verbunden, die Kabel sind alle sehr
>> kurz (max Länge ca. 10cm).
>
> mit dem Code hatte ich nie Schwierigkeiten, ich nutze gerne die Arduino
> fastLED LIB, auch die aus dem µC Forum von TIM funktioniert prima.

Die habe ich auch kurz probiert, aber auch hier kein Unterschied, keine 
der LEDs leuchtet, an DIN liegt das Signal an, aber direkt an DOUT schon 
nicht mehr.

>
>> Messung:
>> --------
>> Ich messe auf dem WS2812B zwischen VCC und GND eine Spannung von 4.9V,
>> an DIN der ersten LED sehe ich mit dem Oszi die entsprechenden Signale
>> (800kHz, sehen soweit gut aus, Pegel scheint auch zu passen). Allerdings
>> ergibt eine Messung mit dem Oszi an DOUT der ersten LED kein Signal,
>> sprich dieses wird nicht weitergeleitet, auch die erste LED bleibt immer
>> aus. Eine Änderung der Frequenz auf 400kHz brachte auch keine Änderung.
>
> GND vergessen?

Nein, GND ist angeschlossen (und auch zwischen WS2812B und Arduino 
verbunden).

>
>> Hat jemand noch Ideen in welche Richtung ich suchen könnte? Bilder vom
>> Aufbau kann ich leider erst heute Abend nachliefern.
>
> keine Idee ohne Bilder, alle SW hast du schon probiert?

Ja, siehe oben. Bilder wie gesagt leider erst heute abend, bin gerade 
nicht zuhause und habe gestern, als ich genervt aufgegeben habe, 
vergessen noch welche zu machen...

>
> Arduino #include <FastLED.h>
> Beitrag "Lightweight WS2811/WS2812 Library"

von TOhm (Gast)


Lesenswert?

Joachim B. schrieb:
> deinen ganzen Code mal hier zeigen.

Im Prinzip 1:1 das Beispiel aus der Adafruit NeoPixel Lib, PIN ist 6, 
Anzahl der LEDs sind 10, Rest unverändert.

<code>
#include <Adafruit_NeoPixel.h>
#ifdef _AVR_
  #include <avr/power.h>
#endif

#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 
LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 
drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel 
products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, 
not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW 
products)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(10, PIN, NEO_GRB + 
NEO_KHZ800);


void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Some example procedures showing how to display to the pixels:
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
  // Send a theater pixel chase in...
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  theaterChase(strip.Color(0, 0, 127), 50); // Blue

  rainbow(20);
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed 
throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 
255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every 
third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
</code>

von Thomas E. (thomase)


Lesenswert?

TOhm schrieb:
> <code>

Wenn du stattdessen "(c)" und am Ende "(/c)" schreibst und dabei die 
runden Klammern "()" durch eckige "[]" ersetzt, sieht das gleich viel 
schöner aus:

1
#include <Adafruit_NeoPixel.h>
2
#ifdef _AVR_
3
  #include <avr/power.h>
4
#endif
5
6
#define PIN 6
7
8
// Parameter 1 = number of pixels in strip
9
// Parameter 2 = Arduino pin number (most are valid)
10
// Parameter 3 = pixel type flags, add together as needed:
11
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 
12
LEDs)
13
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 
14
drivers)
15
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel 
16
products)
17
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, 
18
not v2)
19
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW 
20
products)
21
Adafruit_NeoPixel strip = Adafruit_NeoPixel(10, PIN, NEO_GRB + 
22
NEO_KHZ800);
23
24
25
void setup() {
26
  strip.begin();
27
  strip.show(); // Initialize all pixels to 'off'
28
}
29
30
void loop() {
31
  // Some example procedures showing how to display to the pixels:
32
  colorWipe(strip.Color(255, 0, 0), 50); // Red
33
  colorWipe(strip.Color(0, 255, 0), 50); // Green
34
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
35
//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
36
  // Send a theater pixel chase in...
37
  theaterChase(strip.Color(127, 127, 127), 50); // White
38
  theaterChase(strip.Color(127, 0, 0), 50); // Red
39
  theaterChase(strip.Color(0, 0, 127), 50); // Blue
40
41
  rainbow(20);
42
  rainbowCycle(20);
43
  theaterChaseRainbow(50);
44
}
45
46
// Fill the dots one after the other with a color
47
void colorWipe(uint32_t c, uint8_t wait) {
48
  for(uint16_t i=0; i<strip.numPixels(); i++) {
49
    strip.setPixelColor(i, c);
50
    strip.show();
51
    delay(wait);
52
  }
53
}
54
55
void rainbow(uint8_t wait) {
56
  uint16_t i, j;
57
58
  for(j=0; j<256; j++) {
59
    for(i=0; i<strip.numPixels(); i++) {
60
      strip.setPixelColor(i, Wheel((i+j) & 255));
61
    }
62
    strip.show();
63
    delay(wait);
64
  }
65
}
66
67
// Slightly different, this makes the rainbow equally distributed 
68
throughout
69
void rainbowCycle(uint8_t wait) {
70
  uint16_t i, j;
71
72
  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
73
    for(i=0; i< strip.numPixels(); i++) {
74
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 
75
255));
76
    }
77
    strip.show();
78
    delay(wait);
79
  }
80
}
81
82
//Theatre-style crawling lights.
83
void theaterChase(uint32_t c, uint8_t wait) {
84
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
85
    for (int q=0; q < 3; q++) {
86
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
87
        strip.setPixelColor(i+q, c);    //turn every third pixel on
88
      }
89
      strip.show();
90
91
      delay(wait);
92
93
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
94
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
95
      }
96
    }
97
  }
98
}
99
100
//Theatre-style crawling lights with rainbow effect
101
void theaterChaseRainbow(uint8_t wait) {
102
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
103
    for (int q=0; q < 3; q++) {
104
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
105
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every 
106
third pixel on
107
      }
108
      strip.show();
109
110
      delay(wait);
111
112
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
113
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
114
      }
115
    }
116
  }
117
}
118
119
// Input a value 0 to 255 to get a color value.
120
// The colours are a transition r - g - b - back to r.
121
uint32_t Wheel(byte WheelPos) {
122
  WheelPos = 255 - WheelPos;
123
  if(WheelPos < 85) {
124
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
125
  }
126
  if(WheelPos < 170) {
127
    WheelPos -= 85;
128
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
129
  }
130
  WheelPos -= 170;
131
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
132
}

von TOhm (Gast)


Lesenswert?

Thomas E. schrieb:
> TOhm schrieb:
>> <code>
>
> Wenn du stattdessen "(c)" und am Ende "(/c)" schreibst und dabei die
> runden Klammern "()" durch eckige "[]" ersetzt, sieht das gleich viel
> schöner aus:

Ups, Entschuldigung :)

von Uwe N. (ex-aetzer)


Lesenswert?

TOhm schrieb:
> ... DIN vom WS2812B ist über einen 330 Ohm Widerstand mit Port 6 am Arduino
> verbunden, ...

330 Ohm kommt mir etwas "hochohmig" vor. Probier doch mal 33 Ohm aus.
Vielleicht ein Pegel-Problem...

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Uwe N. schrieb:
> 330 Ohm kommt mir etwas "hochohmig" vor. Probier doch mal 33 Ohm aus.

ich hatte sogar 470 Ohm ohne Probleme, aber man liest auch öfter mal von 
120 Ohm, hört sich nach dem goldenen Mittelweg an zwischen 330 Ohm und 
33 Ohm.

Ein Versuch ist es wert und bevor man mit 10 LEDs probiert muss es mit 
einer LED erst mal richtig laufen, also nur eine LED und die Init auch 
mit einer LED, solange eine nicht richtig läuft braucht man den Ausgang 
nicht ansehen.

: Bearbeitet durch User
von Kanack (Gast)


Lesenswert?

Mach ein Foto vom Aufbau.

von Marco H. (damarco)


Lesenswert?

Die erste Led ist schon defekt.  Ich würde mir Gedanken machen warum.

von Thomas E. (thomase)


Lesenswert?

Marco H. schrieb:
> Die erste Led ist schon defekt.

Woher weißt du das?

von Johnny B. (johnnyb)


Lesenswert?

TOhm schrieb:
> die entsprechenden Signale
> (800kHz, sehen soweit gut aus, Pegel scheint auch zu passen). Allerdings
> ergibt eine Messung mit dem Oszi an DOUT der ersten LED kein Signal,
> sprich dieses wird nicht weitergeleitet, auch die erste LED bleibt immer
> aus. Eine Änderung der Frequenz auf 400kHz brachte auch keine Änderung.

Weder 800kHz noch 400kHz sind korrekt, da wundert es mich nicht, dass 
die erste LED die Daten nicht weitergibt.
Das Timing ist bei diesen LED's entscheidend und muss zwingend den 
Angaben im Datenblatt entsprechen, damit sie funktionieren.

von Thomas E. (thomase)


Lesenswert?

Johnny B. schrieb:
> Weder 800kHz noch 400kHz sind korrekt

400 KHz sind natürlich Unsinn. Aber die Länge eines Bits beträgt 1,25µs. 
Und das sind 800Khz. Ob aber auch der Duty-Cycle, also das Verhältnis 
zwischen H und L, stimmt, ist eine andere Sache. Ich vermute mal, daß 
das nicht der Fall ist, die erste Led das Signal nicht versteht und 
demzufolge nichts macht. Somit auch das Signal nicht weiterreicht.

von Bernd K. (bmk)


Angehängte Dateien:

Lesenswert?

Ah, gerade mein Thema. Bin Anfänger auf dem Gebiet.

Ich habe mir kürzlich so einen WS2812B Streifen bestellt:
https://www.amazon.de/gp/product/B00XKXUA0Y/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1

Betrieb an meinem Arduino UNO (Nachbau) hat sofort geklappt.

Vielleicht hilft ja der Vergleich zu meinem Aufbau weiter.
- Datenleitung vom Uno Pin 6 und GND an den Streifen
- Separate 5V DC Versorgung vom Steckernetzteil an den Streifen.
- Neopixel Sketch gemäß Neopixel.txt

Sketch ist etwas modifiziert, dass die Farben RBG + Weiss
alle 60 LED nacheinander durchlaufen. Klappt prima.

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.