En aquest post anem a aprendre a connectar i programar una tira led WS2812B amb Arduino.
Així aconseguirem diferents efectes de llums i colors a la tira led.
Mitjançant un botó podrem saltar d’efecte en efecte o el que és el mateix, de programa en programa.
Veurem programes per a efectes de llums senzills i altres per efectes més complexos.
Per això:
- Pots repassar com muntar un botó mitjançant el muntatge PULL-UP en aquest post dedicat a això.
- Estudiarem en detall la tira led WS2812B (neopixel).
- Veurem el muntatge o esquema de l’circuit.
- Aprendrem la programació de diferents seqüències de llums.
LA TIRA LED WS2812B:
És una tira formada per una successió de leds (Led5050) que té la característica que podem modificar el color de cada led de manera independent.
Aquest model és de el tipus “individual Addressable” això vol dir que podem accedir a cada led de forma individual gràcies a l’integrat que porta cada led.
Les dades s’envien en sèrie ja que els leds estan connectats en cadena, de tal manera que cada led emmagatzema la dada que porta la seva adreça i fa de transmissor per al led següent. Això permet dividir o sumar més leds i el resultat seguirà funcionant. Aquesta transmissió no serà perceptible a l’ull humà ja que es realitza a altes velocitats (400 Hz).
Cada led té incorporat un petit circuit integrat. Aquest integrat és capaç d’emmagatzemar 3 bytes (8 bits per byte). Cada byte correspon a un color RGB per la qual cosa cada color pot tenir 2 8 = 256 nivells i per tant el led podrà donar un total de 2563 colors.
El model de tira led WS2812B també anomenat NeoPixel i té les següents característiques:
Longitud | 1 m |
Densitat de leds | 60 leds/m |
Ingress Protectión (IP) | IP30* |
Connexionat de la tira led WS2812B:
La tira led es connecta mitjançant tres cables que corresponen a:
Negatiu | GND |
Din | Pin digital de la placa (la conectarem al pin 6) |
Positiu | +5V |
Podem alimentar la tira led directament des de la placa compatible amb Arduino?
Vegem, el cas més desfavorable és que tots els leds de la tira estiguin il·luminant en blanc intens. Això requeriria un consum d’uns 60 mA per cada led. (Cada led de la tira està format per tres petits leds que consumeixen 20mA cadascun, és a dir: 20 + 20 + 20 = 60 mA).
En el nostre cas per als 60 led de què consta la nostra tira suposarien:
el que és inassumible per a una placa compatible Arduino perquè recordem que cada pin pot donar un màxim de 40 mA (valor recomanat 20 mA) amb la resticción que com a màxim el conjunt de totes les sortides ha de ser menor de 300 mA (sempre que no superin 150 mA per port).
Per tant, NO PODEM ALIMENTAR LA TIRA LED DIRECTAMENT DES DE LA PLACA.
Llavors hem d’alimentar d’una banda la tira led i per un altre independent la placa.
L’ideal és alimentar-la amb una font d’alimentació de 5 V i 2A per alimentar la tira led. Però ¿és suficient amb la potència que ens subministra aquesta font?
Vegem: la potència màxima que ens pot donar la font serà:
Si sabem que en general, el corrent real per un disseny colorit és aproximadament 1/3 a 1/2 del corrent màxima, això correspon a uns valors de potència de:
Per tant, la font d’alimentació compleix amb la condició de potència.
Respecte a la placa compatible amb Arduino, no podem alimentar-la des de la font d’alimentació de 5V perquè ho hauríem de fer mitjançant el pin de 5V i si per error o desconeixement intentéssim alimentar el projecte per l’usb o el connector DC de la placa (i no mitjançant la font) podríem trencar la placa ja que aquesta intentaria subministrar intensitat pel pin de 5V cap a la tira led i com hem dit, la tira led requereix molt més potència de la que la placa pot donar.
Per tant hem d’utilitzar un connector DC per alimentar la tira mitjançant la font d’alimentació i una pila de 9V per alimentar la placa de manera independent a la tira led.
Cal destacar que la terra (GND) de la placa ha de ser comú a la de la tira led.
També caldrà muntar una resistència de 470 Ohm entre el pin de sortida digital i el Din de la tira led, això evitarà possibles danys en els primers leds.
Finalment, per reduir risc de cremat de la WS2812B es recomana afegir un condensador de 1000uF entre 5V i GND.
MUNTATGE O ESQUEMA DEL CIRCUIT:
Per fer-ho més fàcil anem a veure-ho per parts:
- Primer mostrarem l’esquema per al muntatge de botó (PULL-UP).
- Segon mostrarem l’esquema per muntar la tira led WS2812B (Neopixel).
- Tercer i últim mostrarem els dos anteriors junts, és a dir el muntatge final.
Esquema pel muntatge del botó PULL-UP:
Fem servir dues plaques protoboard mini perquè volem fer accessible el botó des de fora d’una caixeta on guardem tot el muntatge. (Pots veure el nostre Kit Control de tira led).
Si simplement vas a fer el muntatge a mode de pràctica pots muntar-lo sobre una única placa protoboard més gran.
Com s’indica en el post dedicat a com fer servir o connectar un polsador amb Arduino que esmentem al principi d’aquest post, és possible connectar el polsador sense la resistència de 4k7 ohms activant la resistència PULL-UP interna d’Arduino amb la comanda pinMode (pin, INPUT_PULLUP); però en aquest cas hem decidit realitzar el muntatge amb aquesta resistència ja que hi ha espai suficient i també perquè serveixi com a pràctica.
Esquema pel muntatge o connexió de la tira led WS2812B (Neopixel):
Com pots observar muntem sobre una fila tots els negatius (cables de color negre):
- Del connector d’alimentació.
- De la tira WS2812B (Neopixel).
- El negatiu de l’condesador.
- El negatiu de la placa compatible amb Arduino.
(Recordeu que cal fer el negatiu comú).
I sobre una altra fila tots els positius (cables de color vermell):
- Del connector d’alimentació.
- De la tira WS2812B (Neopixel).
Després també cal tenir en compte que hem de connectar una resistència de 470 Ohm entre el pin de sortida digital i el Din de la tira led.
Esquema final de tot el conjunt:
PROGRAMACIÓ TIRA LED WS2812B (Neopixel):
A continuació estudiarem com programar diferents programes de llums per a la tira led WS2812B (neopixel) que seran activats de forma seqüencial amb el botó.
Podràs comprovar que aquest és el projecte més complicat fins a la data que hem realitzat pel que fa a la programació.
Per poc que sàpigues de programació no et serà complicat entendre-ho i et resultarà un repte assumible per així donar un pas més en l’aprenentatge de programació.
Si realment és la primera vegada que intentes programar t’aconsellem que visitis altres entrades al bloc molt més senzilles.
El primer que hem de fer és afegir la llibreria Adafruit_NeoPixel.h per la tira led.
Això ens permetrà fer funcionar la tira led WS2812B correctament.
Com les instal·lem?
anem a: Eines> Gestiona les biblioteques…
Apareix el Gestor de biblioteques. Escrivim en la recerca “Adafruit Neo Pixel”. La busquem i la instal·lem.
Ara sí, anem amb el programa:
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
/* InputMakers * En aquest projecte CONTROL DE TIRA LED d'InputMakers controlem la tira led (NeoPixel) mitjançant un polsador. * Tenim programades diferents seqüències que van canviant al polsar el botó. * Necessites polsar una vegada més el botó per començar la seqüència. */ #include <Adafruit_NeoPixel.h> // Incloem la llibreria Adafruit NeoPixel. Açò es fa per poder executar les ordres que pertanyen a aquesta llibreria, necessàries per poder governar la tira led Neo Pixel. #define BUTTON_PIN 2 // Pin 2 connectat al botó. (Muntatge pull-up). #define PIXEL_PIN 6 // Pin 6 connectat a la tira led. Digital IO pin connected to the NeoPixels. #define PIXEL_COUNT 60 // Nombre de leds (pixels) de la tira led Neo Pixel. // Pel comandament Adafruit_NeoPixel ens trobem amb les següents instruccions, de la pàgina d'Adafruit: // Parameter 1 = number of pixels in strip // Parameter 2 = pin number (most are valid) // Parameter 3 = pixel type flags, add together as needed: // NEO_RGB Pixels are wired for RGB bitstream // NEO_GRB Pixels are wired for GRB bitstream, correct for neopixel stick // NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels) // NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick // Per tant sel·leccionem pel tercer paràmetre les opcions NEO_GRB + NEOKHZ800 ja que son vàlidas per la neopixel stick. Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); bool oldState = HIGH; // definim la variable d'estat oldState de tipus booleana i la inicialitzem a HIGH. int showType = 0; // definim la variable entera showType. void setup() { pinMode(BUTTON_PIN, INPUT); // Definim el pin associat a BUTTON_PIN com entrada. strip.begin(); // amb begin inicialitzem la tira led. strip.show(); // amb show actualitzem tota la tira d'una sola vegada. } void loop() { // Obtenim el nou estat (newState) o estat actual del botó. bool newState = digitalRead(BUTTON_PIN); // Comprovem si l'estat ha canviat de high a low (botó pressionat). if (newState == LOW && oldState == HIGH) { // delay curt per evitar falses polsacions o rebots en el polsador. delay(20); // Comprovem que el botó estigui encara en low després del delay. (Després de possibles rebots). newState = digitalRead(BUTTON_PIN); // Augmentem en u el valor de la variable showType i cridem a la funció startShow amb el valor de showType. if (newState == LOW) { showType++; // al arribar a 8 reiniciem la variable a 0. if (showType > 8) showType=0; startShow(showType); } } // OldState passa a valdre newState per iniciar altra vegada el loop. oldState = newState; } // Amb la funció startShow anem cridant les diferents escenes de la tira led al polsar el botó. void startShow(int i) { switch(i){ case 0: colorWipe(strip.Color(0, 0, 0), 50); // Apagada break; case 1: theaterChase(strip.Color(127, 127, 127), 50); // Blanc break; case 2: theaterChase(strip.Color(127, 0, 0), 50); // Vermell break; case 3: theaterChase(strip.Color( 0, 0, 127), 50); // Blau break; case 4: colorWipe(strip.Color(255, 0, 0), 50); // Vermell break; case 5: colorWipe(strip.Color(0, 255, 0), 50); // Verd break; case 6: colorWipe(strip.Color(0, 0, 255), 50); // Blau break; } } // Encén els pixels un darrere l'altre otro amb el color rebut. // c de color indica el color que anirà omplint la tira i wait són els mil·lisegons des d'una encesa a altra. // uint32_t o uint8_t significa que c o wait són variables del tipus nombres enters sense signo u (unsigned) de 32 o 8 bits. Es fa per indicar unívocament el nombre de bits utilitzats per emmagatzemar la variable. void colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i=0; i<strip.numPixels(); i++) { // Bucle for recorre tots els pixels de la tira amb la variable i. strip.setPixelColor(i, c); // i es el pixel actual per a cada iteración i c el color. strip.show(); // Actualitzem la tira. delay(wait); // Esperem un tiemps wait d'una iteració a altra. } } // Reprodueix uns llums tipus teatre que van movent-se en persecució fins quedar fixes. // c de color indica el color que anirà omplint la tira i wait són els mil·lisegunds d'una encesa a altra. void theaterChase(uint32_t c, uint8_t wait) { for (int j=0; j<10; j++) { // Realitza 10 cicles de persecució. for (int q=0; q < 3; q++) { for (int i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, c); // Encén cada tercer pixel. } strip.show(); delay(wait); for (int i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); // Apaga cada tercer pixel. } } } } |
Esperem que us hagi agradat aquest post i que hagis gaudit desxifrant la programació:))
A la nostra pàgina trobareu el projecte “CONTROL DE TIRA LED” al qual trobaràs més programes de llums i amb el qual podràs ampliar els teus coneixements sobre programació.
També pots intentar programar la tira led amb el teu color favorit modificant el codi!
Important! OFERIM GRANS DESCOMPTES PER A CENTRES EDUCATIUS! SI ETS UN CENTRE EDUCATIU DEMANA PRESSUPOST PERSONALITZAT AQUÍ
[product_page id=”246″]
Comparteix si t’ha agradat 🙂
Salutacions de l’equip d’InputMakers i ¡Segueix sempre aprenent!