OCTOWS2811: 8 strips via 8 pins vs. one pin and one looong strip?

Status
Not open for further replies.

mcsteeze

Active member
The documentation is very clear that you can use the octoWS2811 library and have 8 strips on 8 pins of the teensy. However, could I change (in the code) the number of leds / strip to something very long (like 1,000) and just use one strip?

I am going for one long row of pixels rather than a display and it would be simpler if I just use one pin...
 
Yes, it should work. So far, nobody has confirmed actually driving a 1000 long strip. If you do this, I hope you'll follow up with the results.

With OctoWS2811, you'd configure it for 8000 LEDs, but only connect 1000. This of course is quite wasteful, memory-wise, since you have to allocate memory for all 8000 LEDs, even though the other 7000 are unused. But memory is cheap, and a $20 Teensy 3.1 is probably the cheapest part of a 1000 LED project.

8000 LEDs with double buffering requires 48000 bytes of RAM. Teensy 3.1 has 64K, of which about 4K is usually needed for the USB stack and other code that gets automatically built into most programs. That still leaves you with 12K of memory left, which is probably plenty, assuming the rest of your project doesn't have any major memory requirements.
 
Also, you should be aware than the LED strips do not conduct power very well. So even if you connect 1000 in a very long strip, data-wise, you'll still have to run power wires to deliver power to many locations along the length of the strip.

A general rule is power delivered every 90 to 120 LEDs.

For more specific info, you should take a length of the actual strips you're using and set them to be all white (or the brightest setting you'll actually use). Then use a voltmeter to carefully measure the voltage. At the strip input, you should see 5.0 volts. At the far end, you'll see less than 5.0 volts.

For example, the old WS2812 strips (not the "B" version) which I used on the original 1920 LED board for developing OctoWS2811 have about 0.25 volt loss at the far end of the strip, after traversing 60 LEDs. I've been told some of the newer strips are better. These LED strips rarely come with good and reliable engineering data (and what little data does exist is often broken English and simply copied from competitors without any regard for whether it actually applies), so the only reliable way to tell how much voltage you lose is to actually measure with the LEDs running at maximum brightness.
 
Sorry to revive this thread —

Paul, is there any way to modify the Octo library such that it does not allocate memory across 8 strips, but instead allocates it only to one? Or is there a very specific reason for the 8-strip paradigm?

I have the same ask as the OP here, but things such as adding an additional teensy+octo board may not be amendable. A friend of mine installed a huge strip of these guys in his house and wants them driven (ignoring my advice to hold off on installing them, but cest la vie!) and only broke out the data line at the end of the strip, so breaking out additional data lines would involve a de-install and re-install.

Any thoughts?
 
Paul, is there any way to modify the Octo library such that it does not allocate memory across 8 strips, but instead allocates it only to one?

No.

Please, tell me how I can make this clearer on the OctoWS2811 web page. This question comes up over and over. How I can make this clearer?

Or is there a very specific reason for the 8-strip paradigm?

Yes, there is a good technical reason.

The DMA engine moves data in 8, 16 or 32 bit sizes. 8 bits is the minimum word size.
 
No.

Please, tell me how I can make this clearer on the OctoWS2811 web page. This question comes up over and over. How I can make this clearer?

Quite clear that the library is set up to work that way, my question is not along the lines of if there's a flag I can set or method I can call, and more along the lines of if there is something that can be modified within the code of the Octo lib itself to accommodate. Your answer to my second question (why) reveals that there is not — figured there was a reason for it :)

I will look into FastLED. The strips have power spliced in every few meters, just only one data line.
 
Hi Paul,
Why does OctoWS2811 use 6 ints per LED? Surely there is a very good reason, but I am unable to find it.
"displayMemory: The memory used for display data. Use an array of "int" 6 times ledsPerStrip." <- so if ledperstrip=1,
i.e. for single Led, displaymemory is 6 ints. = 24 bytes..??
Thank you
 
Last edited:
That's LEDs per strip. There's 8 strips, so 24 bytes for each 8 LEDs is 3 bytes per LED.

They're declared as 32 bit integers, rather than bytes, so the compiler will automatically align the memory to a 32 bit boundary. Being 32 bit aligned allows for a memory copy to make best use of the 32 bit bus to move 4 bytes at once.
 
OK, Thanks Paul,
I am attempting to modify VideoDisplay and came across two items of interest that I am unable to figure out:
Item 1:
I declare LED_WIDTH=256; LED_HEIGHT=8; (yes, I know this is 2K leds) however I intend to connect one long string
of 256 LEDS on only one pin ( as a test case).

So I have a local memory of 256 ints that I want to copy into drawingMemory as follows:
for(int i=0;i<256;i++) {
for(int j=0;j<6;j++) { drawingMemory[i+j] = locmem;}
}
which should fill up drawingMemory. However, the locmem appears to have been destroyed after the above loop
as I have a print statement before and after the above loop. (Still checking my code..) if you have any insight
pl. let me know.

Item 2:
if I try to remove the times 6 in the declaration displayMemory[size *6], and compile and load the teensy3.1 appears to not respond to serial PuTTy . How does the times 6 not being there hang Teensy 3.1 (or apparently hang)?

Thank you
 
Hi Paul,
Sorry I was about to cancel this post when I realized "forum rule" but you beat me to it!.
But memcpy helped :)
Thanks
 
Hi Paul,
Still have an issue with my setup. Perhaps I am not using the library as intended.
I have modified the videodisplay.ino for this test case. Code included below.

The test case uses a local memory (not shared with library) that is filled with
colors for LED string. The filling is alternate pixels are turned on. The color is random.

Then the local memory is used with leds.setpixel() to display LEDs leds.show() which works just fine.

Then the local memory is copied into drawingMemory, using memcpy, then leds.show() generates "flashes" or incorrect LEDs color or intensity ( too bright)

Then once again the localmemory is copied into drawingMemory in a for loop, then leds.show() which again generates incorrects LEDs color or intensity.

I have attempted to include a [video]https://www.dropbox.com/lightbox/home/videos[/video][/URL] showing the effect of my code running on Teensy3.1.

Also Included is a test file showing debug output of local memory and drawing memory.

At one point I thought that I need to toggle pin12 for the DMAs to start, so I included appropriate code
within a #ifdef. But pin12 does not seem to matter.

Please let me know, if I am using the library as intended, if not what to fix?
Thank you

==============VideoDisplayWLocalmem.ino
/* OctoWS2811 VideoDisplay.ino - Video on LEDs, from a PC, Mac, Raspberry Pi
http://www.pjrc.com/teensy/td_libs_OctoWS2811.html
Copyright (c) 2013 Paul Stoffregen, PJRC.COM, LLC

Permission is hereby granted, ....edited for brevity
*/

#include <OctoWS2811.h>

#define LED_WIDTH 256 // number of LEDs horizontally hk: fake panel for 1 pin
#define LED_HEIGHT 8 // number of LEDs vertically (must be multiple of 8)
#define LED_LAYOUT 0 // 0 = even rows left->right, 1 = even rows right->left

#define VIDEO_XOFFSET 0
#define VIDEO_YOFFSET 0 // display entire image
#define VIDEO_WIDTH 100
#define VIDEO_HEIGHT 100

//#define VIDEO_XOFFSET 0
//#define VIDEO_YOFFSET 0 // display upper half
//#define VIDEO_WIDTH 100
//#define VIDEO_HEIGHT 50

//#define VIDEO_XOFFSET 0
//#define VIDEO_YOFFSET 50 // display lower half
//#define VIDEO_WIDTH 100
//#define VIDEO_HEIGHT 50


const int ledsPerStrip = LED_WIDTH * LED_HEIGHT / 8;

DMAMEM int displayMemory[ledsPerStrip*6];
int drawingMemory[ledsPerStrip*6];
int localmem[ledsPerStrip*6];

float gma = 1.7;
int gammatable[256];

elapsedMicros elapsedUsecSinceLastFrameSync = 0;

const int config = WS2811_GRB | WS2811_800kHz; // color config included for this test

OctoWS2811 leds(ledsPerStrip, displayMemory, drawingMemory, config);

void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
Serial.begin(9600);
Serial.setTimeout(50);
for (int i=0; i < 256; i++) { // from movie2serial
gammatable = (int)(pow((float)i / 255.0, gma) * 255.0 + 0.5);
}
leds.begin();
leds.show();
}
// fill local memory with one random color for all LEDs,
// Set alternating LEDs in strip with random color.
void fillmem() {
int index; int ledindex=0; int randclr;
unsigned char red,green,blue;
//blank out localmem and drawingMemory
for (index=0; index<ledsPerStrip*6;index++) {
localmem[index] = 0; drawingMemory[index] = 0;
}
// get a random color in the low power range
red=gammatable[random(8,16)];
green=gammatable[random(8,16)];
blue=gammatable[random(8,16)];
randclr=(red<<16)|(green<<8)|(blue);
for(ledindex=0;ledindex<ledsPerStrip*6;ledindex+=2) {
localmem[ledindex] = randclr; // every alternate LED is ON with randclr
drawingMemory[ledindex]=randclr; // If I use this in leds.setpixel it does not work
}

}
// LEDsOn turns on the whole string by three ways:
// 1. by using leds.setpixel() call, followed by leds.show
// 2. by using memcpy , to compy localmem to drawingMemory followed by leds.show
// 3. by using a for loop to copy each localmem pixel value to drawingMemory then leds.show
// Do not know if pin 12 actually turn on DMA internal to Teensy3.1
// so I included the code to generate sync any way. However
// it did not seem to make any difference if I included timing or not.
// To include timing, uncomment the next lines define.
// #define INC_TIME_DELAY_AND_PIN12 1
void LEDsON()
{ int k=0; int i; int j;
unsigned int startAt = micros();
unsigned int usecUntilFrameSync = 0;
fillmem(); // Get pattern of led turned ON all to one random color.
for(i=0;i<ledsPerStrip;i++) {
leds.setPixel(i, localmem); // using drawingMemory here does not work
}
Serial.println("Will display localmem via setpixel:");
printlocalmem();
leds.show();
delay(5000); // now wait a few secs and re do with memcpy
fillmem();
Serial.println("Will print drawingMemory after memcpy:");
memcpy(drawingMemory,localmem,ledsPerStrip*6); // after first numleds, rest of *6 is zero
printdrawingmem();
#ifdef INC_TIME_DELAY_AND_PIN12
unsigned int endAt = micros();
unsigned int usToWaitBeforeSyncOutput = 100;
if (endAt - startAt < usecUntilFrameSync) {
usToWaitBeforeSyncOutput = usecUntilFrameSync - (endAt - startAt);
}
digitalWrite(12, HIGH);
delayMicroseconds(usToWaitBeforeSyncOutput);
digitalWrite(12, LOW);
#endif
// WS2811 update begins immediately after falling edge of frame sync
leds.show();
delay(5000);
fillmem();
for(i=0;i<ledsPerStrip*6;i++) {
drawingMemory=localmem;
}// i
Serial.println("Will print drawingMemory after for loop copy:");
printdrawingmem();
#ifdef INC_TIME_DELAY_AND_PIN12
endAt = micros();
usToWaitBeforeSyncOutput = 100;
if (endAt - startAt < usecUntilFrameSync) {
usToWaitBeforeSyncOutput = usecUntilFrameSync - (endAt - startAt);
}
digitalWrite(12, HIGH);
delayMicroseconds(usToWaitBeforeSyncOutput);
digitalWrite(12, LOW);
// WS2811 update begins immediately after falling edge of frame sync
#endif
leds.show();
delay(5000);
}
// Following routines for displaying contents of local/drawing memories
// on a serial PuTTy terminal connected to Teensy3.1

// The color to ascii routine returns one character:
// if pixel has value return "*" else return "."
char clrtoascii(int v)
{
char c;
if(v>0) {c = '*';} else {c='.';}
return c;
}
// Print drawingMemory contents
void printdrawingmem() // print a 48 x 32 array of chars
{
int x,y;
for (y=0;y<32;y++) {
for(x=0;x<48;x++) {
Serial.write(clrtoascii(drawingMemory[x+(48*y)]));
}
Serial.println();
}
Serial.println();
}
// Print localmemory contents
void printlocalmem() // print a 48 x 32 array of chars
{
int x,y;
for (y=0;y<32;y++) {
for(x=0;x<48;x++) {
Serial.write(clrtoascii(localmem[x+(48*y)]));
}
Serial.println();
}
Serial.println();
}

void loop() {
digitalWrite(13, HIGH);
LEDsON();
digitalWrite(13, LOW);
delay(2000);
}

============== Debug print text out
Will display localmem via setpixel:
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.

Will print drawingMemory after memcpy:
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.

Will print drawingMemory after for loop copy:
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
 
Your code is directly writing to drawingMemory (or writing to localmem and then copying it to drawingMemory) without any awareness of the special format OctoWS2811 requires.

If you want to manipulate your own memory for 256 LEDs, perhaps using a 32 bit integer for each color (the low 24 bits), I'd suggest defining localmem like this:

Code:
int localmem[256];  // one 32 bit int per pixel, using low 24 bits

You must NOT simply memcpy or otherwise copy your array's data directly into drawingMemory[]. OctoWS2811 uses a special arrangement of the bits and bytes within drawingMemory.

To copy your 256 pixels, I'd recommend code like this:

Code:
for (int i=0; i < 256; i++) {
  leds.setPixel(i, localmem[i]);
}

It seems you have this in part of your code, but in other places you're directly copying localmem[] to drawingMemory[]. Do not write directly into drawingMemory.

Unless you write code that manipulates drawingMemory[] the same way as setPixel(), like the Processing movie2serial.pde, you must not touch drawingMemory[].
 
Status
Not open for further replies.
Back
Top