Arduino – RGB LED met PL9823 chip
Hardware
Deze RGB LED heeft een ingebouwde controller chip PL9823, je kan er mooie effecten mee maken!
Het voordeel ten opzichte van een reguliere RGB led is:
– Dat er geen weerstandjes in serie nodig zijn voor elke kleur
– De LED werkt op 5V! (Functioneert al vanaf 3V)
– Je eenvoudig kleuren kan mixen, elke kleur heeft 256 licht/donker waarden.
– Mogelijkheid om 1024 LEDs te schakelen op 1 datalijn.
Let er wel op dat een aantal achter elkaar geschakeld behoorlijk wat stroom verbruiken, een aantal direct aansluiten op de arduino wordt afgeraden!
Pinout
Schematisch overzicht
Meerdere in serie schakelen
Hieronder een voorbeeldaansluiting als men meer dan 1 in serie wil schakelen (max. 1024 mogelijk)
Aansluiten op de Arduino
De PL9823 chip is een kloon van de WS2812
Wat heb je nodig?
1) Adafruit NeoPixel bibliotheek
Sluit de RGB LED aan volgens onderstaand schema:
De code hieronder laat de de LED telkens van kleur veranderen na 1 seconde:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <Adafruit_NeoPixel.h> #define PIN 6 #define LEDS 1 // 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_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) // NEO_KHZ800 800 KHz bitstream (most NeoPixel products WS2812 LEDs) // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDS, PIN, NEO_GRB + NEO_KHZ800); void setup() { strip.begin(); strip.show(); //Zet hier alle pixels op uit. } void loop() { strip.setPixelColor(0, 255, 0, 0); //ROOD strip.show(); //Laat de kleur zien. delay(1000); strip.setPixelColor(0, 0, 255, 0); //GROEN strip.show(); //Laat de kleur zien. delay(1000); strip.setPixelColor(0, 0, 0, 255); //BLAUW strip.show(); //Laat de kleur zien. delay(1000); } |
Onderstaand script is een “dolleye” script met 2 RGB LEDS is serie:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#include <Adafruit_NeoPixel.h> #define LEDPIN 2 #define NUMLED 2 Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMLED, LEDPIN, NEO_RGB + NEO_KHZ800); typedef struct { int r; int g; int b; } RGB; String eyes_color[] = {"#000000", "#0000ff", "#ff0000", "#ff00ff", "#00ff00", "#00ffff", "#ffff00", "#ffffff"}; int eyes_colorCount = sizeof(eyes_color) / sizeof(eyes_color[0]); int eyes_color_cur = 0 , eyes_color_to=1; RGB rgb_hex2dec(String hexstr){ RGB rgb; long val = strtol(&hexstr[1], NULL, 16); rgb.r = (int) (val >> 16 & 0xff); rgb.g = (int) (val >> 8 & 0xff); rgb.b = (int) (val & 0xff); return rgb; } boolean compareRGB(RGB a, RGB b){ return ((a.r == b.r)&&(a.g == b.g)&&(a.b == b.b)); } void changeLED(RGB from1, RGB to1, RGB from2, RGB to2){ RGB s[] = {from1, from2}, t[] = {to1, to2}, d[2]; for(int i=0; i<2; i++){ d[i].r= (s[i].r < t[i].r)?1:((s[i].r > t[i].r)?-1:0); d[i].g= (s[i].g < t[i].g)?1:((s[i].g > t[i].g)?-1:0); d[i].b= (s[i].b < t[i].b)?1:((s[i].b > t[i].b)?-1:0); } while(!compareRGB(s[0],t[0]) && !compareRGB(s[1],t[1])){ for(int i=0; i<2; i++){ if(s[i].r != t[i].r){ s[i].r += d[i].r; } if(s[i].g != t[i].g){ s[i].g += d[i].g; } if(s[i].b != t[i].b){ s[i].b += d[i].b; } } setLED(s[0], s[1]); delay(5); } } void setLED(RGB rgb1, RGB rgb2) { strip.setPixelColor(0, strip.Color(rgb1.r, rgb1.g, rgb1.b)); strip.setPixelColor(1, strip.Color(rgb2.r, rgb2.g, rgb2.b)); strip.show(); } void setup() { strip.begin(); strip.setBrightness(30); setLED(rgb_hex2dec("#000000"), rgb_hex2dec("#000000")); delay(1000); } void loop() { RGB from = rgb_hex2dec(eyes_color[eyes_color_cur]); RGB to = rgb_hex2dec(eyes_color[eyes_color_to]); changeLED(from, to, from, to); eyes_color_cur = eyes_color_to; eyes_color_to = (eyes_color_to + 1) % eyes_colorCount; delay(3000); } |
Bronnen:
satujamsaja.blogspot.nl
instructables.com
qiita.com
[#/datasheets/pl9823″ ]