Mai țineți minte articolele http://www.roroid.ro/matrice-8×8/ și http://www.roroid.ro/matricea-8×8-si-udn2981a/ ? Probabil că nu :-). Ei bine, atunci vă propun realizarea unui afișaj matrice folosind bandă flexibilă cu leduri WS2812 (neopixeli) și un arduino pro mini.

Necesar:

  • WS2812B 5050 RGB LED Strip 5M 150 300 Leds 144 60LED/M Individual Addressable 5V http://r.ebay.com/fiefBa (eu am folosit varianta cu 144 led/m)
  • Arduino Pro Mini http://r.ebay.com/hhA2cI
  • O sursă de 5v care să ducă minim 16A (recomand o sursa de PC)
  • Fire de legatură
  • Letcon/cositor/pasta decapantă
  • Pistol cu lipici cald
  • Bucată plexigalss
  • Imprimanta 3d in cazul în care doriti si carcasa

Pregatire placă plexiglass:

Benzile de leduri le-am montat pe o placă de plexiglass de 2mm dimensionată corespunzator. O să spuneți că 264 de leduri care au fiecare aproximativ 0.3W (80W total) o să topească placa respectivă. Probabil că da, dacă țineți toate ledurile aprinse pe o perioada mai lunga de timp. Eu am preferat plexiglass deoarece am zisi că benzile se vor lipi mai bine pe acest material (in final nu e așa, probabil datorită calității proaste a benzii dublu adezive cu care au venit ledurile). Inițial placa mea de plexiglas a avut 265x115mm. Din pacate a trebuit să mai tai din ea deoarece ledurile nu erau aliniate de la o bandă la alta. A fost si greșala mea pentru că nu am ținut cont de joncțiuni dar nici SMD-urile nu au fost aliniate.

Lungimea display-ului poate fi cât de mare vi-o doriți. Trebuie doar să țineti cont de alinierea ledurilor atât pe verticală cât și pe orizontala. Pentru acest lucru vă sugerez să vă faceți un ghidaj pentru lipirea benzilor. Modelul făcut de mine îl vedeți în pozele de mai sus.

Legarea benzilor WS2812

Vă prezint două din multiplele moduri de conectare a acestor leduri. Am să încep cu varianta 2 deoarece acest tip de conexiuni l-am folosit inițial. Din păcate nu am reușit să fac display-ul să meargă. Singurul lucru pe care l-am reușit a fost să modific culorile pixelilor dar sub nici o formă să afișez un text curgător pe display.

Totuși dacă aveți pe acasă o placă Teensy vă recomand această librărie https://github.com/PaulStoffregen/OctoWS2811 și sunt convins că ve-ți reusi sa il faceti sa mearga.

#include <Adafruit_NeoPixel.h>

// Cati pixeli sunt intr-o banda
#define NUMPIXELS      33

//Setam cate o instanta a librariei neopixel pentru fiecare banda led
Adafruit_NeoPixel pixels0 = Adafruit_NeoPixel(NUMPIXELS, 0, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels1 = Adafruit_NeoPixel(NUMPIXELS, 1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(NUMPIXELS, 2, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels3 = Adafruit_NeoPixel(NUMPIXELS, 3, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels4 = Adafruit_NeoPixel(NUMPIXELS, 4, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels5 = Adafruit_NeoPixel(NUMPIXELS, 5, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels6 = Adafruit_NeoPixel(NUMPIXELS, 6, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels7 = Adafruit_NeoPixel(NUMPIXELS, 7, NEO_GRB + NEO_KHZ800);

int delayval = 100; // o intarziere de 100ms pentru aprinderea ledurilor

void setup() {
//initializare librarie neopixel
  pixels0.begin(); 
  pixels1.begin(); 
  pixels2.begin(); 
  pixels3.begin(); 
  pixels4.begin(); 
  pixels5.begin(); 
  pixels6.begin(); 
  pixels7.begin(); 

}

void loop() {

  // Se aprind toti pixeli de pe fiecare banda in parte cu aceiasi culoare.

  for(int i=0;i<NUMPIXELS;i++){

    pixels0.setPixelColor(i, pixels0.Color(0,150,0)); // Se aprind toti pixeli de pe fiecare banda in parte cu aceiasi culoare.
    //Modificand aici puteti folosi alte culori. Codul e R,G,B
	pixels1.setPixelColor(i, pixels1.Color(0,150,0)); // Se aprind toti pixeli de pe fiecare banda in parte cu aceiasi culoare.
    //Modificand aici puteti folosi alte culori. Codul e R,G,B
    pixels2.setPixelColor(i, pixels2.Color(0,150,0)); // Se aprind toti pixeli de pe fiecare banda in parte cu aceiasi culoare.
    //Modificand aici puteti folosi alte culori. Codul e R,G,B
    pixels3.setPixelColor(i, pixels3.Color(0,150,0)); // Se aprind toti pixeli de pe fiecare banda in parte cu aceiasi culoare.
    //Modificand aici puteti folosi alte culori. Codul e R,G,B
    pixels4.setPixelColor(i, pixels4.Color(0,150,0)); // Se aprind toti pixeli de pe fiecare banda in parte cu aceiasi culoare.
    //Modificand aici puteti folosi alte culori. Codul e R,G,B
    pixels5.setPixelColor(i, pixels5.Color(0,150,0)); // Se aprind toti pixeli de pe fiecare banda in parte cu aceiasi culoare.
    //Modificand aici puteti folosi alte culori. Codul e R,G,B
    pixels6.setPixelColor(i, pixels6.Color(0,150,0)); // Se aprind toti pixeli de pe fiecare banda in parte cu aceiasi culoare.
    //Modificand aici puteti folosi alte culori. Codul e R,G,B
    pixels7.setPixelColor(i, pixels7.Color(0,150,0)); // Se aprind toti pixeli de pe fiecare banda in parte cu aceiasi culoare.
    //Modificand aici puteti folosi alte culori. Codul e R,G,B
    
    pixels0.show(); // Se actualizeaza fiecare banda in parte
	pixels1.show(); // Se actualizeaza fiecare banda in parte
	pixels2.show(); // Se actualizeaza fiecare banda in parte
	pixels3.show(); // Se actualizeaza fiecare banda in parte
	pixels4.show(); // Se actualizeaza fiecare banda in parte
	pixels5.show(); // Se actualizeaza fiecare banda in parte
	pixels6.show(); // Se actualizeaza fiecare banda in parte
    pixels7.show(); // Se actualizeaza fiecare banda in parte
    
    delay(delayval); // Delay for a period of time (in milliseconds).

  }
}

 

Cautând un pic pe Google m-am decis sa folosesc libraria NeoMatrix de la Adafruit https://github.com/adafruit/Adafruit_NeoMatrix. Se pare că V1 de conectare este mai lenta fata de V2. Eu nu am observat nici o intarziere la V1, dar dacă doriti sa afisati filme pe display intârzierile o să apară.

Programare:

Folosind libraria NeoMatrix programarea display-ului este foarte simplă. Vreau doar să vă explic un pic modul de configurare a acestei librării:

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(33, 8, PIN,
  NEO_MATRIX_TOP    + NEO_MATRIX_RIGHT +
  NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
  NEO_GRB            + NEO_KHZ800);

Configurarea afisajului e facută cu linia de cod de mai sus. În ordinea parametrilor avem urmatoarele:

33, 8, PIN

33 sunt numarul de pixeli pe un rand, 8 numarul de randuri,PIN reprezinta pinul pe care e conectată matricea, în cazul nostru 7,

NEO_MATRIX_TOP    + NEO_MATRIX_RIGHT

primul pixel e în dreapta sus

NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,

iar matricea e setata ca rânduri în mod progresiv.(vezi imaginea de mai jos)

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

#define PIN 7
 
// MATRIX DECLARATION:
// Parameter 1 = width of NeoPixel matrix
// Parameter 2 = height of matrix
// Parameter 3 = pin number (most are valid)
// Parameter 4 = matrix layout flags, add together as needed:
//   NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
//     Position of the FIRST LED in the matrix; pick two, e.g.
//     NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
//   NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal
//     rows or in vertical columns, respectively; pick one or the other.
//   NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
//     in the same order, or alternate lines reverse direction; pick one.
//   See example below for these values in action.
// Parameter 5 = 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)

//Setam matricea ca fiind 33x8 ca si randuri progresive, primul pixel fiind sus in dreapta
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(33, 8, PIN,
  NEO_MATRIX_TOP    + NEO_MATRIX_RIGHT +
  NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
  NEO_GRB            + NEO_KHZ800);

//Culorile in care v-a fi afisat textul
const uint16_t colors[] = {
matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(255, 255, 255) };

void setup() {
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(80);//Luminozitatea matricei (255 este maxim)
matrix.setTextColor(colors[0]);//culoarea de inceput a matricei
}

int x    = matrix.width();
int pass = 0;

void loop() {
matrix.fillScreen(0);
matrix.setCursor(x, 0);
matrix.print(F("Bine ati venit pe www.roroid.ro"));//textul ce v-a fi derulat
//rutina care trece prin fiecare coloana a textului mutando de la dreapta spre stanga
if(-x <-240) {
x = matrix.width();
if(++pass >= 3) pass = 0;
matrix.setTextColor(colors[pass]);
}
matrix.show();
delay(100);
}

 

În trecut am realizat un display care comunica pe i2c http://www.roroid.ro/arduino-sample-code-bts7960-43a-motor-driver-i2c-7-segment-display/. Am revizuit putin codul a.î. sa pot folosi noul display cu neopixeli.

#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h>

#define PIN 7
 
// MATRIX DECLARATION:
// Parameter 1 = width of NeoPixel matrix
// Parameter 2 = height of matrix
// Parameter 3 = pin number (most are valid)
// Parameter 4 = matrix layout flags, add together as needed:
//   NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
//     Position of the FIRST LED in the matrix; pick two, e.g.
//     NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
//   NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal
//     rows or in vertical columns, respectively; pick one or the other.
//   NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
//     in the same order, or alternate lines reverse direction; pick one.
//   See example below for these values in action.
// Parameter 5 = 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_NeoMatrix matrix = Adafruit_NeoMatrix(33, 8, PIN,
  NEO_MATRIX_TOP    + NEO_MATRIX_RIGHT +
  NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
  NEO_GRB            + NEO_KHZ800);
 
const uint16_t colors[] = {
  matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(255, 255, 0),matrix.Color(0, 0, 255), matrix.Color(255, 0, 255), matrix.Color(0, 255, 255), matrix.Color(255, 255, 255)};
 
void setup() {
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(255);
  matrix.setTextColor(colors[6]);
  //comennzi pentru i2c
  Wire.begin(4);//suntem dispozitivul de la adresa #4
  Wire.onReceive(receptie);//datele primite pe i2c le interpretam in functia receptie  
}
 
char comanda[10]; //vectorul in care va fi receptionata comanda pe I2c
String p="";
int nr;
char  *i;

 
void loop() {
  matrix.fillScreen(0);
  matrix.setCursor(5, 1);
  matrix.print(String(nr));
  matrix.show();
  
}



// aici interpretam datele
void receptie(int howMany)
{
byte index = 0;
//se salveaza comanda primita pe I2C intr-un string
while(Wire.available())
{
comanda[index++] = Wire.read();
}
//se interpreteaza comanda
p=strtok_r(comanda,";",&i);
while(p!="")
{
if (p.startsWith("N")) //se verifica daca trebuie sa afisam un nr
{//daca este numar stim ca urmatoarele 4 caractere reprezinta numarul
String tmp=p.substring(1,5);//transforma string in int
nr=tmp.toInt();
}
p=strtok_r(NULL,";",&i);//verific daca mai am ceva de executat
}
 
}

 

Montarea în carcasă:

Parcă nu arata bine afișajul doar lipit pe placa de plexiglass. De aceea am decis să îi realizez o carcasa pe care ulterior sa o printez la imprimanta 3d. Designul e realizat în Fusion360. Doar ca o parere personală, acest soft de design 3D este cel mai bun pe care l-am întalnit pană acum. În plus îl puteti folosi și gratuit.

Fisier stl ce contine carcasa facuta de mine: carcasa33x8

Provocări:

  • Lipirea firelor pe banda de leduri. A trebuit să folosesc lipici cald pentru fixarea acestor fire pe placă a.î. să nu se mai miste. Indiferent cât de mult aș fi insistat cu letconul pe bandă, firul refuza să stea lipit
  • E bine sa reușiți să vă adaptați din mers în realizarea acestui proiect. Eu am pornit de la o cu totul altă idee de soft și design iar în final am ajuns la ce se vede mai sus, modificând de mai multe ori placa cu leduri.

Idei:

  • Daca folosiți o placa esp8266 puteți realiza un contor fizic a paginii dumneavoastra de web
  • La fel de usor puteți folosi acest display pentru realizarea unui ceas care să arate atât ora cât și prognoza meteo
  • Reclama luminoasă

Display matrice 33×8 cu leduri ws2812 (neopixeli)
Etichetat pe:                            

Un gând despre „Display matrice 33×8 cu leduri ws2812 (neopixeli)

  • 04/01/2017 la 20:06
    Legătură permanentă

    Hello,

    This is MK323F from youtube.
    I really like what u are doing with the arduino.
    Hope u can contact me on my email so i can show u a drawing how i connected the leds and maybe u can show me how i can improve it

    Răspunde

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Acest sit folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.