Tengis
Supreme [H]ardness
- Joined
- Jun 11, 2003
- Messages
- 6,090
I recently put together a 92 WS2812B LED setup for my home theater. I can get it working in XBMC but I would like to get it going in Windows so I can use it with a plain media player like Media Player Classic.
Has anyone gotten it to work?
I tried following this guide but I cannot get it to work. Here is the code I used for Processing;
Has anyone gotten it to work?
I tried following this guide but I cannot get it to work. Here is the code I used for Processing;
Code:
import java.awt.*;
import java.awt.image.*;
import processing.serial.*;
static final int timeout = 5000; // 5 seconds
Serial openPort() {
String[] ports;
String ack;
int i, start;
Serial s;
ports = Serial.list(); // List of all serial ports/devices on system.
for(i=0; i<ports.length; i++) { // For each serial port...
System.out.format("Trying serial port %s\n",ports[i]);
try {
s = new Serial(this, ports[i], 230400);
}
catch(Exception e) {
// Can't open port, probably in use by other software.
continue;
}
// Port open...watch for acknowledgement string...
start = millis();
while((millis() - start) < timeout) {
if((s.available() >= 4) &&
((ack = s.readString()) != null) &&
ack.contains("Ada\n")) {
return s; // Got it!
}
}
// Connection timed out. Close port and move on to the next.
s.stop();
}
// Didn't locate a device returning the acknowledgment string.
// Maybe it's out there but running the old LEDstream code, which
// didn't have the ACK. Can't say for sure, so we'll take our
// changes with the first/only serial device out there...
return new Serial(this, ports[1], 115200);
}
/*
// using 12 RGB LEDs
static final int led_num_x = 4;
static final int led_num_y = 4;
static final int leds[][] = new int[][] {
{1,3}, {0,3}, // Bottom edge, left half
{0,2}, {0,1}, // Left edge
{0,0}, {1,0}, {2,0}, {3,0}, // Top edge
{3,1}, {3,2}, // Right edge
{3,3}, {2,3}, // Bottom edge, right half
};
*/
// using 72 RGB LEDs
static final int led_num_x = 28;
static final int led_num_y = 18;
static final int leds[][] = new int[][] {
{27,17},{26,17},{25,17},{24,17},{23,17},{22,17},{21,17},{20,17},{19,17},{18,17},{17,17},{16,17},{15,17},{14,17},{13,17},{12,17},{11,17},{10,17},{9,17},{8,17},{7,17},{6,17},{5,17},{4,17},{3,17},{2,17},{1,17},{00,17}, // Bottom
{0,17},{0,16},{0,15},{0,14},{0,13},{0,12},{00,11}, {00,10}, {0,9}, {0,8},{00,07},{00,06},{00,05},{00,04},{00,03},{00,02},{00,01},{00,00}, //LEFT
{00,00},{01,00},{02,00},{03,0},{04,0},{05,0},{06,0},{07,00},{8,0},{9,0},{10,0},{11,0},{12,0},{13,0},{14,0},{15,0},{16,0},{17,0},{18,0},{19,0},{20,0},{21,0},{22,0},{23,0},{24,0},{25,0},{26,0},{27,0}, //UP
{27,0},{27,1},{27,2},{27,3},{27,4},{27,5},{27,6},{27,7},{27,8},{27,9},{27,10},{27,11},{27,12},{27,13},{27,14},{27,15},{27,16},{27,17}, //RIGHT
};
static final short fade = 75;
static final int minBrightness = 120;
// Preview windows
int window_width;
int window_height;
int preview_pixel_width;
int preview_pixel_height;
int[][] pixelOffset = new int[leds.length][256];
// RGB values for each LED
short[][] ledColor = new short[leds.length][3],
prevColor = new short[leds.length][6];
byte[][] gamma = new byte[256][3];
byte[] serialData = new byte[218];
int data_index = 0;
//creates object from java library that lets us take screenshots
Robot bot;
// bounds area for screen capture
Rectangle dispBounds;
// Monitor Screen information
GraphicsEnvironment ge;
GraphicsConfiguration[] gc;
GraphicsDevice[] gd;
Serial port;
void setup(){
int[] x = new int[16];
int[] y = new int[16];
// ge - Grasphics Environment
ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
// gd - Grasphics Device
gd = ge.getScreenDevices();
DisplayMode mode = gd[0].getDisplayMode();
dispBounds = new Rectangle(0, 0, mode.getWidth(), mode.getHeight());
// Preview windows
window_width = mode.getWidth()/5;
window_height = mode.getHeight()/5;
preview_pixel_width = window_width/led_num_x;
preview_pixel_height = window_height/led_num_y;
// Preview window size
size(window_width, window_height);
//standard Robot class error check
try {
bot = new Robot(gd[0]);
}
catch (AWTException e) {
println("Robot class not supported by your system!");
exit();
}
float range, step, start;
for(int i=0; i<leds.length; i++) { // For each LED...
// Precompute columns, rows of each sampled point for this LED
// --- for columns -----
range = (float)dispBounds.width / led_num_x;
// we only want 256 samples, and 16*16 = 256
step = range / 16.0;
start = range * (float)leds[i][0] + step * 0.5;
for(int col=0; col<16; col++) {
x[col] = (int)(start + step * (float)col);
}
// ----- for rows -----
range = (float)dispBounds.height / led_num_y;
step = range / 16.0;
start = range * (float)leds[i][1] + step * 0.5;
for(int row=0; row<16; row++) {
y[row] = (int)(start + step * (float)row);
}
// ---- Store sample locations -----
// Get offset to each pixel within full screen capture
for(int row=0; row<16; row++) {
for(int col=0; col<16; col++) {
pixelOffset[i][row * 16 + col] = y[row] * dispBounds.width + x[col];
}
}
}
// Open serial port. this assumes the Arduino is the
// first/only serial device on the system. If that's not the case,
// change "Serial.list()[0]" to the name of the port to be used:
// you can comment it out if you only want to test it without the Arduino
//port = new Serial(this, Serial.list()[0], 115200);
port = openPort();
// A special header expected by the Arduino, to identify the beginning of a new bunch data.
serialData[0] = 'o';
serialData[1] = 'z';
}
void draw(){
//get screenshot into object "screenshot" of class BufferedImage
BufferedImage screenshot = bot.createScreenCapture(dispBounds);
// Pass all the ARGB values of every pixel into an array
int[] screenData = ((DataBufferInt)screenshot.getRaster().getDataBuffer()).getData();
data_index = 2; // 0, 1 are predefined header
for(int i=0; i<leds.length; i++) { // For each LED...
int r = 0;
int g = 0;
int b = 0;
for(int o=0; o<256; o++)
{ //ARGB variable with 32 int bytes where
int pixel = screenData[ pixelOffset[i][o] ] ;
r += pixel & 0x00ff0000;
g += pixel & 0x0000ff00;
b += pixel & 0x000000ff; }
// Blend new pixel value with the value from the prior frame
ledColor[i][0] = (short)(((( r >> 24) & 0xff) * (255 - fade) + prevColor[i][0] * fade) >> 8);
ledColor[i][1] = (short)(((( g >> 16) & 0xff) * (255 - fade) + prevColor[i][1] * fade) >> 8);
ledColor[i][2] = (short)(((( b >> 8) & 0xff) * (255 - fade) + prevColor[i][2] * fade) >> 8);
serialData[data_index++] = (byte)ledColor[i][0];
serialData[data_index++] = (byte)ledColor[i][1];
serialData[data_index++] = (byte)ledColor[i][2];
float preview_pixel_left = (float)dispBounds.width /5 / led_num_x * leds[i][0] ;
float preview_pixel_top = (float)dispBounds.height /5 / led_num_y * leds[i][1] ;
color rgb = color(ledColor[i][0], ledColor[i][1], ledColor[i][2]);
fill(rgb);
rect(preview_pixel_left, preview_pixel_top, preview_pixel_width, preview_pixel_height);
}
if(port != null) {
// wait for Arduino to send data
for(;;){
if(port.available() > 0){
int inByte = port.read();
if (inByte == 'y')
break;
}
}
port.write(serialData); // Issue data to Arduino
}
// Benchmark, how are we doing?
println(frameRate);
arraycopy(ledColor, 0, prevColor, 0, ledColor.length);