Led ws2812b pomoc
Úvodní stránka › Fórum › Vaše projekty › Arduino › Led ws2812b pomoc
- Toto téma obsahuje celkem 51 odpovědí. Do diskuze (2 diskutující) se naposledy zapojil uživatel keksik334 a poslední změna proběhla před 8 roky a 3 měsíci.
-
AutorPříspěvky
-
22.8.2016 v 11:28 #8078keksik334Účastník
Ahoj
Potreboval bych pomoct mam led pasek ws2812 a chci sni nahradit led na moto kufru
jiz ted mam na moto kufru led ktere blikaj zaroven s blinkrama
jde mi o to jak sepnu led kdyz privedu signal treba z blinkru aby se rozjela animace
predpokladam ze budu muset snizit napeti z blinkru cim nejlepe snizit napeti ktere by reklo arduinu sepni.
tady je to co bych chtel pouzit ale potrebuju to sepnout az privedu signal..muzete mi pomoct s kodem? 🙂
#include <Adafruit_NeoPixel.h> #define PIN 6 #define NUM_LEDS 12 // Parameter 1 = number of pixels in strip // Parameter 2 = 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) Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800); void setup() { strip.begin(); strip.show(); // Initialize all pixels to 'off' } void loop() { colorWipe(0xff,0xa2,0x00, 40); colorWipe(0x00,0x00,0x00, 5); } void colorWipe(byte red, byte green, byte blue, int SpeedDelay) { for(uint16_t i=0; i<NUM_LEDS; i++) { setPixel(i, red, green, blue); showStrip(); delay(SpeedDelay); } } void showStrip() { #ifdef ADAFRUIT_NEOPIXEL_H // NeoPixel strip.show(); #endif #ifndef ADAFRUIT_NEOPIXEL_H // FastLED FastLED.show(); #endif } void setPixel(int Pixel, byte red, byte green, byte blue) { #ifdef ADAFRUIT_NEOPIXEL_H // NeoPixel strip.setPixelColor(Pixel, strip.Color(red, green, blue)); #endif #ifndef ADAFRUIT_NEOPIXEL_H // FastLED leds[Pixel].r = red; leds[Pixel].g = green; leds[Pixel].b = blue; #endif } void setAll(byte red, byte green, byte blue) { for(int i = 0; i < NUM_LEDS; i++ ) { setPixel(i, red, green, blue); } showStrip(); }
22.8.2016 v 13:33 #8085Vojtěch VosáhloÚčastníkAhoj,
na snížení napětí se dá použít spousta věcí, nejjednoduší by byl asi obyčejný napěťový dělič ze 2 rezistorů, pak je taky možnost použít nějaký tranzistor, relé a nebo třeba nějaký optočlen. Chcete brát signál od blinkru, bylo by to od žárovky nebo od samotné páky? -> U páky dostaneme zap/vyp, u žárovky rovnou blikání… Dá se pracovat s obojím.Předpokládám že tyto funkce spouští animaci samotnou, poté by se hlavní smyčka upravila takto:
void loop() { if(digitalRead(Pin Na ktery Jde Signal)) { colorWipe(0xff,0xa2,0x00, 40); colorWipe(0x00,0x00,0x00, 5); } }
A do void setup přidáte
pinMode(Pin Na ktery Jde Signal, INPUT);
To by mělo stačit.
Držím palce
22.8.2016 v 14:22 #8086keksik334Účastníkdekuji za reakci.. mam doma 7805 muzu pouzit? budu brat signal primo od blinkru mam to nejlepe dostupne tak ze bych dal 7805 snizil napeti na 5v privedl na pin. jinak na stole super uz funguje sepne po propojeni pinu tak ze zaklad bych mel
a ted kdyz bych chtel spinat animaci na dvou vystupech (prava nebo leva strana)? 🙂#include <Adafruit_NeoPixel.h> #define PIN 6 #define NUM_LEDS 12 // Parameter 1 = number of pixels in strip // Parameter 2 = 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) Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800); void setup() { pinMode(8, INPUT); strip.begin(); strip.show(); // Initialize all pixels to 'off' } void loop() { if(digitalRead(8)) { colorWipe(0xff,0xa2,0x00, 40); colorWipe(0x00,0x00,0x00, 5); } } void colorWipe(byte red, byte green, byte blue, int SpeedDelay) { for(uint16_t i=0; i<NUM_LEDS; i++) { setPixel(i, red, green, blue); showStrip(); delay(SpeedDelay); } } void showStrip() { #ifdef ADAFRUIT_NEOPIXEL_H // NeoPixel strip.show(); #endif #ifndef ADAFRUIT_NEOPIXEL_H // FastLED FastLED.show(); #endif } void setPixel(int Pixel, byte red, byte green, byte blue) { #ifdef ADAFRUIT_NEOPIXEL_H // NeoPixel strip.setPixelColor(Pixel, strip.Color(red, green, blue)); #endif #ifndef ADAFRUIT_NEOPIXEL_H // FastLED leds[Pixel].r = red; leds[Pixel].g = green; leds[Pixel].b = blue; #endif } void setAll(byte red, byte green, byte blue) { for(int i = 0; i < NUM_LEDS; i++ ) { setPixel(i, red, green, blue); } showStrip(); }
22.8.2016 v 16:31 #8087Vojtěch VosáhloÚčastníkmam doma 7805 muzu pouzit?
Jak budete arduino napájet? LM7805 je regulátor napětí určený pro stabilizaci napájecího napájení, né pro snížení. Asi by se použít dal ale je to hodně zbytečné. Pokud máte po ruce 4 rezistory o stejné hodnotě, nemá cenu vymýšlet nic jiného.
Tento kód by měl fungovat, nahoře akorát specifikujte ty piny a počty led. Kdyby to nešlo, ozvěte se.
#include <Adafruit_NeoPixel.h> ////// NASTAVENI LEVEHO PASKU #define PIN_L_PASEK pin l pasku #define NUM_LEDS_L_PASEK pocet led l pasku Adafruit_NeoPixel l_pasek = Adafruit_NeoPixel(NUM_LEDS_L, PIN_L_PASEK, NEO_GRB + NEO_KHZ800); ////// NASTAVENI PRAVEHO PASKU #define PIN_P_PASEK pin p pasku #define NUM_LEDS_P_PASEK pocet led p pasku Adafruit_NeoPixel p_pasek = Adafruit_NeoPixel(NUM_LEDS_P, PIN_P_PASEK, NEO_GRB + NEO_KHZ800); ////// NASTAVENI VSTUPNICH PINU #define L_BLINKR_PIN vstup z l blinkru #define P_BLINKR_PIN vstup z p blinkru void setup() { /// Nastaveni pinu na ktere pujdou vstupy/ blinkry pinMode(L_BLINKR_PIN, INPUT); pinMode(R_BLINKR_PIN, INPUT); ///Nastaveni pasku l_pasek.begin(); l_pasek.show(); p_pasek.begin(); p_pasek.show(); } void loop() { if(digitalRead(P_BLINKR_PIN)) { colorWipe(0xff,0xa2,0x00, 40, 1); colorWipe(0x00,0x00,0x00, 5, 1); } if(digitalRead(L_BLINKR_PIN)) { colorWipe(0xff,0xa2,0x00, 40, 0); colorWipe(0x00,0x00,0x00, 5, 0); } } void colorWipe(byte red, byte green, byte blue, int SpeedDelay, int pasek /// 0 = levy pasek / 1 = pravy pasek) { if(pasek == 0){ for(uint16_t i=0; i<NUM_LEDS_L_PASEK; i++) { setPixelL_PASEK(i, red, green, blue); showL_PASEK(); delay(SpeedDelay); } } if(pasek == 1){ for(uint16_t i=0; i<NUM_LEDS_P_PASEK; i++) { setPixelP_PASEK(i, red, green, blue); showP_PASEK(); delay(SpeedDelay); } } } void showL_PASEK() { #ifdef ADAFRUIT_NEOPIXEL_H // NeoPixel l_pasek.show(); #endif #ifndef ADAFRUIT_NEOPIXEL_H // FastLED FastLED.show(); #endif } void setPixel_L_PASEK(int Pixel, byte red, byte green, byte blue) { #ifdef ADAFRUIT_NEOPIXEL_H // NeoPixel l_pasek.setPixelColor(Pixel, l_pasek.Color(red, green, blue)); #endif #ifndef ADAFRUIT_NEOPIXEL_H // FastLED leds[Pixel].r = red; leds[Pixel].g = green; leds[Pixel].b = blue; #endif } void showP_PASEK() { #ifdef ADAFRUIT_NEOPIXEL_H // NeoPixel p_pasek.show(); #endif #ifndef ADAFRUIT_NEOPIXEL_H // FastLED p_pasek.show(); #endif } void setPixel_P_PASEK(int Pixel, byte red, byte green, byte blue) { #ifdef ADAFRUIT_NEOPIXEL_H // NeoPixel p_pasek.setPixelColor(Pixel, p_pasek.Color(red, green, blue)); #endif #ifndef ADAFRUIT_NEOPIXEL_H // FastLED leds[Pixel].r = red; leds[Pixel].g = green; leds[Pixel].b = blue; #endif }
22.8.2016 v 17:31 #8088keksik334ÚčastníkDostanu se k void loop
Arduino: 1.6.10 (Windows 7), Vývojová deska: „Arduino/Genuino Uno“
C:\Users\Jiri\Documents\Arduino\netblink\netblink.ino: In function ‚void loop()‘:
netblink:33: error: ‚colorWipe‘ was not declared in this scope
colorWipe(0xff,0xa2,0x00, 40, 1);
^
netblink:39: error: ‚colorWipe‘ was not declared in this scope
colorWipe(0xff,0xa2,0x00, 40, 0);
^
C:\Users\Jiri\Documents\Arduino\netblink\netblink.ino: At global scope:
netblink:46: error: expected ‚,‘ or ‚…‘ before ‚if‘
if(pasek == 0){
^
netblink:63: error: expected ‚)‘ before ‚}‘ token
}
^
netblink:63: error: expected initializer before ‚}‘ token
netblink:63: error: expected declaration before ‚}‘ token
exit status 1
‚colorWipe‘ was not declared in this scope22.8.2016 v 17:48 #8089Vojtěch VosáhloÚčastníkPardon, zapoměl jsem tam komentář 😉
Takhle je to správně.void colorWipe(byte red, byte green, byte blue, int SpeedDelay, int pasek) { if(pasek == 0){ for(uint16_t i=0; i<NUM_LEDS_L_PASEK; i++) { setPixelL_PASEK(i, red, green, blue); showL_PASEK(); delay(SpeedDelay); } } f(pasek == 1){ for(uint16_t i=0; i<NUM_LEDS_P_PASEK; i++) { setPixelP_PASEK(i, red, green, blue); showP_PASEK(); delay(SpeedDelay); } } }
22.8.2016 v 18:09 #8090keksik334Účastníkneni za co se omlouvat to ja se omlouvam ze tomu vuuubec ale vuuubec nerozumim
Arduino: 1.6.10 (Windows 7), Vývojová deska: „Arduino/Genuino Uno“
C:\Users\Jiri\Documents\Arduino\netblink\netblink.ino: In function ‚void colorWipe(byte, byte, byte, int, int)‘:
netblink:48: error: ‚setPixell_pasek‘ was not declared in this scope
setPixell_pasek(i, red, green, blue);
^
netblink:49: error: ‚showl_pasek‘ was not declared in this scope
showl_pasek();
^
netblink:56: error: ‚setPixelp_pasek‘ was not declared in this scope
setPixelp_pasek(i, red, green, blue);
^
netblink:57: error: ‚showp_pasek‘ was not declared in this scope
showp_pasek();
^
exit status 1
‚setPixell_pasek‘ was not declared in this scope22.8.2016 v 19:13 #8091keksik334ÚčastníkUz to mam dekuji moc za pomoc 😉
22.8.2016 v 19:17 #8092Vojtěch VosáhloÚčastníkMůžu jen vědět jak jste to nakonec vyřešil s napájením a spínáním? Použijete lm nebo…?
22.8.2016 v 19:32 #8093keksik334Účastníkk napajeni asi pouziju LM spinat je asi opravdu hloupost pouzit LM tak pouziju nejaky ten odpor jak jsem jeste nehledal 🙂 rozumim tomu asi jako vcelam (vubec) ale bavi me spekulovat 😀
22.8.2016 v 19:57 #8094Vojtěch VosáhloÚčastník😀 Tak to bude asi nejlepší, tady je link na kalkulačku pro odpory Voltage divider ale prakticky když dáte do série 2 stejné odpory, mezi nimi je polovina napětí které do nich pouštíte.
napětí z blinkru —-| R1 |——| R2 |—- GND
|
|
polovina napětí blinkruSamozřejmě čím větší je rozdíl v odporu mezi oběma rezistory, tím menší napětí je uprostřed. Nevím kolik má blinkr, asi 12V , takže R1 musí být 2x odpor R2 –> dostanete asi 4 volty uprostřed.
22.8.2016 v 20:14 #8095Vojtěch VosáhloÚčastníkTa polovina má být mezi dvěma rezistory 😀 posunulo se to
22.8.2016 v 20:39 #8096keksik334ÚčastníkSuper dekuju za rady a pomoc 😉
az bude vse hotovo dam video jak to slape 🙂 ale nebude to zitra 🙂22.8.2016 v 21:40 #8097Vojtěch VosáhloÚčastníkJasně, těším se.
23.8.2016 v 19:18 #8099Vojtěch VosáhloÚčastníkSuper, teď to můžete posouvat dál 😀 Animace pro brzdový světlo, různý animave při zrychlování motorky, no už to vidim 😉 za chvíli z toho máte disko motorku.
23.8.2016 v 20:08 #8100keksik334Účastníkjo brzdovku uz tam mam 😀 ale zadne animace dalsi 😀
jinak zeptam se je mozny aby bral vstup pro sepni az treba nad dva volty?23.8.2016 v 21:27 #8101Vojtěch VosáhloÚčastníkJestli chápu správně otázku, tak na vstup arduina můžete pustit až 5v. Ale nejsem si jistej že je to to na co jste se ptal ?
23.8.2016 v 22:02 #8103keksik334Účastníkjde o to ze mi to falesne spousti… tak ze budu muset dat asi odpor mezi zem a vstupni pin? uz ho tam mam nabastlenej a pak to funguje
23.8.2016 v 22:35 #8104Vojtěch VosáhloÚčastníkJo, to je důležitý a já to nezmínil… Když jse to měl bez odporu, arduino dostávalo 2 stavy, high a floating, to je ale špatně, my chceme aby dostávalo high a low a to se vyřeší právě tím pulldown rezistorem na zem. Dalo by se to vyřešit i v programu, dá se udělat to stejné v procesoru, ale většinou se to tak nedělá. Kdyby něco ještě zlobilo, tak je možný že na pinu arduina je malé napětí. Teď by tam měly být asi 4 volty když je na blinkru napětí pokud se nepletu. Kdyby jste dělal s menšími napětímy, musí se brát v potaz že arduino má hranici napětí někde kolem 1,6 v, aspoň myslím. Míň než 1.6 je 0 a nad 1.6 je 1.
Hodně štěstí s dalšími projekty.23.8.2016 v 22:56 #8105keksik334Účastníktak a ted dalsi orisek 😀 je mozne aby poustel zaroven animaci kdyz je na obou pinech HIGH?
tehne stav dela to kdyz sepnu oba tak jednou pusti levej podruhe pravej pasek a tak se to strida 🙂24.8.2016 v 10:25 #8106Vojtěch VosáhloÚčastníkZas takový oříšek to není 😀
Nahoru do kódu, k těm všem defines vložíte tohle:
////////////POCET LED JEDNOHO Z PASKU #define NUM_LEDS NUM_LEDS_L_PASEK
Musí to být pod nastavením levého pásku, nebo níže…
Hlavní smyčka void loop bude vypadat takhle:
void loop() { if(digitalRead(P_BLINKR_PIN) && !digitalRead(L_BLINKR_PIN)) { colorWipe(0xff,0xa2,0x00, 40, 1); colorWipe(0x00,0x00,0x00, 5, 1); } if(digitalRead(L_BLINKR_PIN) && !digitalRead(P_BLINKR_PIN)) { colorWipe(0xff,0xa2,0x00, 40, 0); colorWipe(0x00,0x00,0x00, 5, 0); } if(digitalRead(L_BLINKR_PIN) && digitalRead(P_BLINKR_PIN)) { colorWipe(0xff,0xa2,0x00, 40, 2); colorWipe(0x00,0x00,0x00, 5, 2); } }
A toto:
if(pasek == 2){ for(uint16_t i=0; i<NUM_LEDS; i++) { setPixelL_PASEK(i, red, green, blue); setPixelP_PASEK(i, red, green, blue); showL_PASEK(); showP_PASEK(); delay(SpeedDelay); } }
přidáte do funkce ColorWipe pod obě if co už tam jsou.
Tohle by mělo vše vyřešit.Pokud se chcete kouknout kde má co být, celý kód by měl vypadat asi takto http://pastebin.com/cqmXj9J8
24.8.2016 v 15:19 #8107keksik334Účastníksuper az to pofrci zkusim to
ted mam ale jiny problem 😀
kdyz mam vse zapojene v moto nechce mi to spustit animaci
kdyz pichnu pin na 5v arduina spusti se animace ale jakmile se napichnu na blinkr nesepne
je fakt ze se to blbe meri kolik tam je jak to broblikava ne pokazde ho stihnu zmerit merakem ale obcas to stihne a zmeri treba 2,5v nebo 3v a arduino nesepne24.8.2016 v 15:37 #8108Vojtěch VosáhloÚčastníkNemá cenu zkoušet 😀
2.5 nebo 3 na pinu arduina? Už za tím děličem? Na světla by mělo jít 12v ne? Zkuste to přeměřit třeba na brzdovce, jestli je tam opravdu 12v. Pak zkontrolujte polaritu, na jaký části blinkru je + a na jaký – Pokud nic moc nezjistíte, nahrajte přiložený program do arduina, přendejte jeden z děličů na pin arduina A0 a otevřete ser. monitor (Ctrl + Shift + M) na 9600 baud. Pojedou vám tam hodnoty pinu A0. Pusťte blinkr a pozorujte hodnoty, kdyžtak sem pak hoďte co vám vyjíždí když svítí blinkr.const int analogInPin = A0; int sensorValue = 0; void setup() { Serial.begin(9600); } void loop() { sensorValue = analogRead(analogInPin); Serial.print(sensorValue); delay(100); }
24.8.2016 v 15:41 #8109Vojtěch VosáhloÚčastníkOprava, to předtím ani nemusíte zkoušet!
Teď jsem ještě koukal a 3v jsou přesně někde na té arduino hranici LOW a HIGH.
Co jste použil za rezistory na dělič a jaké je napětí na světle, ně na pinu arduina?24.8.2016 v 15:46 #8111keksik334Účastníktim jak to docela rychle blika nejsem schopnej to zmerit ale par krat jem tam videl 12V delic mam 220k 100k
24.8.2016 v 15:58 #8112keksik334Účastníkted jsem to napojil na svetlo ktere neblika je tam 13,6v za delicem mam 4v a ani to mi to nesepne jenom kdyz ho dam na 5v arduina nebo 3,3 to taky sepne ale tech 4 za delicem ne
24.8.2016 v 15:59 #8113Vojtěch VosáhloÚčastníkPokud to sepne 3.3v z arduina je problém jinde
Nemáte při ruce přesnější rozdíl? nějaké dva které by se opravdu lišily o polovinu nebo o trochu míň? Jako třeba 100k a 140-160k? Těch +20k na tě 220 už z toho dělá trochu moc malý napětí.Jedna další věc, která mi netrkla, spojte ZEM arduina se ZEMÍ jednoho z těch blinkrů, pak by to mělo jít.
Pozor aby to byly opravdu země, ať si neodpálíte arduino. A vy arduino nenapájíte z motorky?
24.8.2016 v 16:07 #8114keksik334Účastníkmam pouze 10k,100k,220k zkusim 10k a 5k
24.8.2016 v 16:09 #8117Vojtěch VosáhloÚčastníkJak jsem napsal nahoře…
Jedna další věc, která mi netrkla, ale musí tam být. Spojte ZEM arduina se ZEMÍ jednoho z těch blinkrů, pak by to mělo jít.
Pozor aby to byly opravdu země, ať si neodpálíte arduino. A vy arduino nenapájíte z motorky?
Přestřelujem se tu komentářema a já jsem vždy pozadu 😀
24.8.2016 v 16:15 #8118keksik334Účastníkarduino je napajene z motorky prez7805 propojil jsem zem arduina se zemi blinkru a porad nic 😀 odpory jsem nemenil 10k a 5K mam to zkusit?
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.