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 :)
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
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"
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>
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 | }
|
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 :)
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
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.