Flexible display with ws2812 strip
http://www.youtube.com/watch?v=eEgfiywS73M
Thats a lot of strips you’ve got there. Quick math looks like it’s a 60x60 matrix (3600 LEDS) NICE
@Jon_Bruno Thanks,
Yes it’s a 60*60 pixel.
Each about 1000 pixel controlled by a micro controller. And data send to micros by computer.(UDP protocol)
Very impressive sir.
@Jon_Bruno Thanks
Is your video data coming from a video file or a live stream? The reason I ask is that I am aware you can run movie2serial on Processing to create a UDP stream from a movie file, and then send that to Teensy using the OctoWS2811 LED Library ( https://www.pjrc.com/teensy/td_libs_OctoWS2811.html ) ,but I am seeking a way to drive LED strips with live video content (like a DVI, VGA, or HDMI output from another device). Any thoughts?
Hi, it’s come from a video file.
import processing.video.;
import http://hypermedia.net.;
UDP udp; // define the UDP object
int numPixelsWide=60;
int numPixelsHigh=60;
int numBranchPerBoard=12;
byte Direct_up_down=0;
int w,h;
Movie mov;
color movColors[];
//PrintWriter output;
static class Disp_mode
{
static void Disp_mode(){};
static char Small=1;
static char Larg=2;
static char DontDisplay=3;
};
static class Color_mode
{
static void Color_mode(){};
static char _RGB=1;
static char _RBG=2;
static char _BRG=3;
static char _BGR=4;
static char _GRB=5;
static char _GBR=6;
};
static char DisplayMode=Disp_mode.Larg;
static char ColorMode=Color_mode._BRG; //Color_mode._BRG;
String ip=“10.0.0.”;
int port=8888;
char data_pixel[];
char buffer[];
int index,ii,i,j,k;
void setup()
{
udp = new UDP( this, port );
buffer =new char[numPixelsHigh3numBranchPerBoard];
udp.setBuffer(numPixelsHigh3numBranchPerBoard);
noStroke();
frameRate(30);
//mov = new Movie(this, “transit.mov”);
//mov = new Movie(this, “FlickAnimation.avi”);
//mov = new Movie(this, “as.MP4”);
mov = new Movie(this, “3.avi”); //must install Quick time
//mov = new Movie(this, “RGB Test Sequence.mp4”);
mov.loop();
print(“W=”);
println(numPixelsWide);
print(“H=”);
println(numPixelsHigh);
movColors = new color[numPixelsWide * numPixelsHigh];
data_pixel =new char[numPixelsWide * numPixelsHigh*3];
print(“Before”);
while (mov.available() == false);
print(“After”);
mov.read();
mov.loadPixels();
println(mov.width);
println(mov.height);
w=mov.width/numPixelsWide;
h=mov.height/numPixelsHigh;
if(DisplayMode==Disp_mode.Small)
{
size(numPixelsWide,numPixelsHigh);
}
else if(DisplayMode==Disp_mode.Larg)
{
size(mov.width, mov.height);
}
//output = createWriter(“test.txt”);
}
// Display values from movie
void draw()
{
if (mov.available() == true)
{
mov.read();
mov.loadPixels();
int count = 0;
k=0;
for (j = 0; j < numPixelsWide; j++)
{
for (i = 0; i < numPixelsHigh; i++)
{
movColors[count] =mov.get(wj,hi); //mov.get(iblockSize, jblockSize);
switch (ColorMode)
{
case 1: //Color_mode._RGB
data_pixel[k++]=(char)(movColors[count] >> 16 & 0xFF);
data_pixel[k++]=(char)(movColors[count] >> 8 & 0xFF);
data_pixel[k++]=(char)(movColors[count] & 0xFF);
break;
case 2: //Color_mode._RBG
data_pixel[k++]=(char)(movColors[count] >> 16 & 0xFF);
data_pixel[k++]=(char)(movColors[count] & 0xFF);
data_pixel[k++]=(char)(movColors[count] >> 8 & 0xFF);
break;
case 3: //Color_mode._BRG
data_pixel[k++]=(char)(movColors[count] >> 8 & 0xFF);
data_pixel[k-1]/=7;
data_pixel[k++]=(char)(movColors[count] >> 16 & 0xFF);
data_pixel[k-1]/=7;
data_pixel[k++]=(char)(movColors[count] & 0xFF);
data_pixel[k-1]/=7;
break;
case 4: //Color_mode._BGR
data_pixel[k++]=(char)(movColors[count] >> 8 & 0xFF);
data_pixel[k++]=(char)(movColors[count] & 0xFF);
data_pixel[k++]=(char)(movColors[count] >> 16 & 0xFF);
break;
case 5: //Color_mode._GRB
data_pixel[k++]=(char)(movColors[count] & 0xFF);
data_pixel[k++]=(char)(movColors[count] >> 16 & 0xFF);
data_pixel[k++]=(char)(movColors[count] >> 8 & 0xFF);
break;
case 6: //Color_mode._GBR
data_pixel[k++]=(char)(movColors[count] & 0xFF);
data_pixel[k++]=(char)(movColors[count] >> 8 & 0xFF);
data_pixel[k++]=(char)(movColors[count] >> 16 & 0xFF);
break;
};
count++;
}
}
}
for(i=0;i<(numPixelsWide/numBranchPerBoard);i++)
//for(i=0;i<4;i++)
{
int b=inumPixelsHigh3numBranchPerBoard;
index=0;
ii=1;
for(k=b;k<b+numPixelsHigh3numBranchPerBoard;k++)
{
if(Direct_up_down==1)
{
if(k%(numPixelsHigh3)==0) //To inverse up to down
{
index=numPixelsHigh3ii-1;
ii++;
}
buffer[index]=data_pixel[k];
index--;
}
else
{
buffer[index]=data_pixel[k];
index++;
}
}
String Strbuffer = new String(buffer);
if((numPixelsHigh*3*numBranchPerBoard)>=1500)
{
String str1="0",str2="1";
str1+=Strbuffer.substring(0,numPixelsHigh*3*6);
str2+=Strbuffer.substring(numPixelsHigh*3*6,numPixelsHigh*3*numBranchPerBoard);
udp.send(str1, ip+str(i+10), port); //max byte to send must <= 1500 byte
udp.send(str2, ip+str(i+10), port); //max byte to send must <= 1500 byte
}
else
{
Strbuffer="0"+Strbuffer;
udp.send(Strbuffer, ip+str(i+10), port); //max byte to send must <= 1500 byte
}
}
//int tt=buffer[0];
//println(tt);
//udp.send(message, ip+“25”, port);
//print(Strbuffer);
//output.print(Strbuffer);
//output.close();
/while(true)
{
}/
background(255);
for (j = 0; j < numPixelsWide; j++)
{
for (i = 0; i < numPixelsHigh; i++)
{
fill(movColors[jnumPixelsHigh + i]);
if(DisplayMode==Disp_mode.Small)
{
rect(j,i,1,1);
}
else if(DisplayMode==Disp_mode.Larg)
{
rect(wj,h*i, w,h);
}
}
}
}