Teensy APA102 POV Poi / Pixel Poi Build. Tutorial

@abrownnm - sorry, but I haven't used that abstraction of the poi code so can't help with that. However, have you run your setup with just using the firstlight Fastled example in the examples dropdown? I know it sounds odd, but always good to go right back to basics at this point, to just doublecheck that all lads are working as should. Run examples>FastLed>firstlight with your lads type and led number, and your pins as they are for the poi project. This will give you confidence to discount wiring as an issue.
 
@abrownnm - sorry, but I haven't used that abstraction of the poi code so can't help with that. However, have you run your setup with just using the firstlight Fastled example in the examples dropdown? I know it sounds odd, but always good to go right back to basics at this point, to just doublecheck that all lads are working as should. Run examples>FastLed>firstlight with your lads type and led number, and your pins as they are for the poi project. This will give you confidence to discount wiring as an issue.

Yeah,

This is Invisibug's version. I tried yours and got the same error as post #55 and couldn't seem to remedy as described.

So, I am not totally helpless. I got a basic image to show up on the poi after tinkering around with it tonight. Used a simple red heart repeated and got that to do what I expected and flash what looked like proper colors..stuck it in the tube, held onto the wires and waved it fast enough to see one replication of the image. Pretty rudimentary, but it felt like a breakthrough after all the time with nothing really working out.

Still a bit confused at why certain images seem to work and what each setting I am toying with does.. some run smooth and some seem to just freeze up after a second or two. Followed a few tips from reading the thread and went from there.

I was toying with the speed of the processor after reading that it doesn't run well at certain speed (i.e 24Mhz) and that was having varying effects dependent upon the image. Seemed a bit random to me. Keeping all else the same, sometimes wouldn't run at a starting 180 Mhz or 16Mhz for example, but I got it to tun at 2Mhz then ramped up to 180Mhz and it seemed to work then. Not sure what all the settings do, Also played around with Optimization settings. Any advice here for a Teensy in general, specifically the 3.6 is appreciated.

I think now that I have a bit of confidence that I can at least get an image up I am going to start securing parts and doing my solders to make more reliable connections and pretty much build the whole thing so I can spin it up for testing live in a more realistic way without worrying about all the wires and bare components hanging about.

Any advice on generally getting this working smoother that you all have found would be cool, settings you use, any caps or resistors that are crucial if any, the sizing you chose etc..

@Invisibug

I'll send over the code I got to work ( at least partially in the morning and maybe we can compare what changed that worked?

Also, the next step for me once I get the images running smooth would be learning how to set up phases of different images using your code so I can test that out..Perhaps you have a code setup with multiple switching images that you use which I can utilize as a template?

Then, I can worry about coding for the switching button, and wiring up the cutoff properly on my circuit.. haven't looked too much into those yet beyond basic wiring up.

Sorry if I am asking too much of you all, I am just really excited to get this going. I am sure I could eventually struggle through it on my own with what's out there already (and I've been doing a ton of research) but your help is super beneficial to getting to the point quickly.

Thanks again!
 
@abrownmn : freezing sounds like a power supply bug,
if you have your image squeezed, you can adjust settings yourself for a good effect.
I recommend at a speed that repeats letters "ABCD..." less than 40 units a second, and compact pictures "a face, pikachu or something" not more than 20 units/second.

if you need a switch button for changing image, that was far more coding to do, you can start from using a POV automatically change picture ~8 second or something ,
than turn that work to a button. I suggest Timer ISR (I use flexitimer 2 library ) for button management.
 
Sorry to interrupt, sharing my work on POV :)

Here's my latest POV, 36 pixels with Teensy LC setup, surely it should run well with Teensy 3.6 I think? I'll do that later in JULY.
I've completed adding on nrf24 module into my POV and achieved wireless synchronize, while MTP cannot be used with it due to lack of RAM :(

Using time splice hybrid with rest and radio listening, I achieved a radio-active (can be wake by other prop) state with only <800uA current in total,
a typical nRF on radio listening took ~14mA alone.
which is good as it can stay in power for more than 60 days with 18650, usually 1~2 day is enough.

completed item video on FB
 
Last edited:
well, this is my barebones code:

Code:
/*
*This sketch outputs images to persistence of vision led strips
*It uses FastLed to drive APA102 leds, sending colour values from
*arrays held in flash memory (designated by 'const'). You need to
*set the number of slices you have made your image into,
*e.g. bmp image of 60 pixels high by 150 wide
* would give 60 num_leds and
* 150 slices (number of slices you have made your image into)
*/

#include "FastLED.h"

#define NUM_LEDS 60
#define DATA_PIN 2
#define CLOCK_PIN 3
CRGB leds[NUM_LEDS];
int numberOfSlices = 150;

void setup() {

delay(200);
  FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN>(leds, NUM_LEDS);
}

const unsigned int array1[] = { 0x000100, 0x000100, 0x000100, 0x000100, 0x000100, 0x000100, /*etc .. add your values here*/}; //end of array

const unsigned int array2[] = { /*different image output from the tool goes here if additional images wanted - just rename array1[] to another name, any name will do*/}; //end of array

void loop() {
PoiSonic(8000,array1);
//PoiSonic(2000, array2); 
/*first value is time to show the image, second value is array of colour values to use*/
/*put other code for patterns and more arrays here*/
}

void PoiSonic(unsigned long time, const unsigned int array[]){
unsigned long currentTime = millis();
 while (millis()< currentTime + (time)) {

int f= numberOfSlices;
int z; //a counter
int j=NUM_LEDS;

    for (int x=0;x<f;x++){
     for(z=NUM_LEDS;z>0;z--){
       leds[z-1]=array[x+((j-z)*f)];}
     FastLED.show();
     delayMicroseconds(40); //may need to increase / decrease depending on spin rate
     }       
    delayMicroseconds(1000); //may need to increase / decrease depending on spin rate
   }
 }
the simplest way to add different patterns and images and make a play set is to just the functions in loop. you can go as complicated as you like with coding a set, but just writing some maths patterns, giving each pattern a function and then listing them, is a simple way to go.

you can write a function with a length of run time added as a variable that is passed as you go through the loop, this way you can reuse the same pattern again later, but just pass it a different time to run for.

eg, write a function that displays bouncing dots for an amount of time, in your loop you would list the functions
untested code:
Code:
void bouncing(unsigned long time);

void bouncing(unsigned long time) {
unsigned long currentTime = millis();
while (millis()< currentTime + (time)) {
for(int i = 0; i < NUM_LEDS; i++) {
    leds[i] = CRGB(255,255,255);
    leds[NUM_LEDS - 1 - i] = CRGB(255,255,255);
    FastLED.show();
    leds[i] = CRGB::Black;
    leds[NUM_LEDS - 1 - i] = CRGB::Black;
    FastLED.show();}
    }
}

in the loop you just list 
bouncing(5000);
after you poisonic routine
 
Sorry to interrupt, sharing my work on POV :)

Here's my latest POV, 36 pixels with Teensy LC setup, surely it should run well with Teensy 3.6 I think? I'll do that later in JULY.
I've completed adding on nrf24 module into my POV and achieved wireless synchronize, while MTP cannot be used with it due to lack of RAM :(

Using time splice hybrid with rest and radio listening, I achieved a radio-active (can be wake by other prop) state with only <800uA current in total,
a typical nRF on radio listening took ~14mA alone.
which is good as it can stay in power for more than 60 days with 18650, usually 1~2 day is enough.

completed item video on FB

Congrats man!

Those look really great, thanks for the advice as well.
 
Hello Again,

So I wanted to start getting some real data and tests in before searching for more help here. A co-worker hooked the setup to a scope and it appears like we are getting some dirty data utilizing SPI and it's causing issues with freezing and inconsistency.

Maybe I am missing something simple here about how everything should be setup. Do I need to add caps, resistors anywhere in particular to help with this? I am doubtful it's a power issue, but possible? The wires were fairly long for the data and clock line, perhaps this leads to more issues than I'd expect? Hopefully someone here can chime in and shed some light on what's going on. Let me know what you all think.

See attached scope captures and sketch.

First set of captures were taken at 120MHz core clock and 2MHz SPI clock rate
Second set of captures were taken at 120MHz core clock and 12MHz SPI clock rate
The green trace is SCK (Clock) and the yellow trace is MOSI (Data from Teensy to LED strip)
The attached image was used to create the array in the sketch.


2MHz 1.png
2MHZ 2.png

12 MHz 2.png
12MHz 1.png

The code used is below.

Code:
/*
*This sketch outputs images to persistence of vision led strips
*It uses FastLed to drive APA102 leds, sending colour values from
*arrays held in flash memory (designated by 'const'). You need to
*set the number of slices you have made your image into,
*e.g. bmp image of 60 pixels high by 150 wide
* would give 60 num_leds and
* 150 slices (number of slices you have made your image into)
*/

#include "FastLED.h"

#define NUM_LEDS 64
#define DATA_PIN 11
#define CLOCK_PIN 13
CRGB leds[NUM_LEDS];
int numberOfSlices = 64;

void setup() {

delay(200);
  FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, BGR, DATA_RATE_MHZ(12)>(leds, NUM_LEDS);
  FastLED.setBrightness( 30 );
}

const unsigned int array1[] = { 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcc2222, 0xcb2126, 0xcc2027, 0xcc2027, 0xcc2127, 0xcc2127, 0xcc2027, 0xcc2127, 0xcd2127, 0xcd1f26, 0xc61c1c, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xce2424, 0xcd1f26, 0xcb2127, 0xcb2126, 0xcb2127, 0xcc2226, 0xcb2126, 0xcb2128, 0xcd2328, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xc91f27, 0xcb2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2227, 0xca202a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcc2225, 0xcb2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcb2127, 0xc61c2a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xc61c1c, 0xcc2228, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2027, 0xaa0000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcd2328, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2027, 0xaa0000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xca202a, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcb2127, 0xd42a2a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcd2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcd2127, 0xcc2222, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xd01c26, 0xcc2126, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xd01c26, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xc61c1c, 0xcc2228, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xd01c26, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xd42a2a, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2222, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xd42a2a, 0xcc2128, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xd42a2a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcb2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcd2127, 0xd42a2a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcc2027, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcd2127, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcd2327, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2228, 0x000000, 0x000000, 0x000000, 0x000000, 0xcb2128, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcb2126, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xaa0000, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcd2328, 0x000000, 0x000000, 0xcd232a, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xd42a2a, 0x000000, 0x000000, 0x000000, 0x000000, 0xcd1f26, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0x000000, 0x000000, 0xcc2126, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcd2127, 0x000000, 0x000000, 0x000000, 0x000000, 0xcc2027, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2225, 0xce1f28, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xaa0000, 0x000000, 0x000000, 0xcc222a, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2027, 0xcc2126, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2226, 0x000000, 0x000000, 0xcc2227, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2028, 0x000000, 0x000000, 0xcb2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2027, 0x000000, 0x000000, 0xcc2126, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xc61c1c, 0xc61c1c, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xce1e24, 0xce1e24, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xd23c41, 0xde6e72, 0xe79799, 0xeaa3a5, 0xe99da0, 0xe17e82, 0xd5474c, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2225, 0xca2028, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xdb6267, 0xeeb6b8, 0xfae8e9, 0xffffff, 0xffffff, 0xffffff, 0xfcf2f2, 0xf1c4c5, 0xde7074, 0xcc2228, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcb2127, 0xcc2225, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xd1363b, 0xefb8ba, 0xffffff, 0xffffff, 0xffffff, 0xfbeff0, 0xf9e4e5, 0xfcf1f1, 0xffffff, 0xffffff, 0xffffff, 0xf0bfc0, 0xd1353a, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcb2128, 0xcc2228, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xd1353a, 0xf6d6d7, 0xffffff, 0xffffff, 0xedafb1, 0xd9595d, 0xd0343a, 0xce2b30, 0xd1373c, 0xdb6267, 0xf2c6c7, 0xffffff, 0xffffff, 0xf4d0d1, 0xcf2d33, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2226, 0xcb2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2228, 0xefbabc, 0xffffff, 0xfefafa, 0xde7175, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcd242a, 0xedb1b3, 0xffffff, 0xffffff, 0xe89d9f, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcb2128, 0xcc2226, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xda5e62, 0xffffff, 0xffffff, 0xe4898d, 0xcc2127, 0xcc2228, 0xdf7377, 0xe38488, 0xd03136, 0xcc2127, 0xcc2127, 0xcc2127, 0xd03238, 0xfbecec, 0xffffff, 0xfcf4f4, 0xd64c51, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2228, 0xd01c26, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xedb2b4, 0xffffff, 0xf8e2e3, 0xce292f, 0xcc2127, 0xe89b9e, 0xffffff, 0xffffff, 0xecacaf, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xeeb4b6, 0xffffff, 0xffffff, 0xe59093, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xca2025, 0x000000, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xf8e1e2, 0xffffff, 0xebaaac, 0xcc2127, 0xd23a40, 0xfdf7f7, 0xffffff, 0xffffff, 0xf5d3d5, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xe99ea1, 0xffffff, 0xffffff, 0xeba7a9, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xd42a2a, 0x000000, 0xcc2027, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xfaebec, 0xffffff, 0xe58f92, 0xcc2127, 0xd85459, 0xffffff, 0xffffff, 0xffffff, 0xedb2b4, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xeba6a9, 0xffffff, 0xffffff, 0xeaa5a8, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2228, 0x000000, 0x000000, 0xcc2225, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xf8e0e1, 0xffffff, 0xe99ea1, 0xcc2127, 0xd5494e, 0xfefcfc, 0xffffff, 0xffffff, 0xdf7579, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xf1c1c3, 0xffffff, 0xffffff, 0xe69295, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcb2127, 0x000000, 0x000000, 0xaa0000, 0xcc2126, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xecacaf, 0xffffff, 0xf8e1e1, 0xd03136, 0xcd262c, 0xf8e1e1, 0xffffff, 0xfdf5f5, 0xd23b40, 0xcc2127, 0xcc2127, 0xcc2127, 0xcf2e34, 0xfaebec, 0xffffff, 0xfefcfc, 0xdb6166, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xaa0000, 0x000000, 0x000000, 0x000000, 0xcb2126, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xd64e53, 0xfefcfc, 0xffffff, 0xe27f82, 0xce2b31, 0xfcf0f1, 0xffffff, 0xf2c8ca, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xde7175, 0xffffff, 0xffffff, 0xf5d5d6, 0xcf2e34, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcb2127, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcd2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xdf7477, 0xfaeaeb, 0xd95a5f, 0xd9585c, 0xffffff, 0xffffff, 0xf1c2c4, 0xcc2127, 0xcc2127, 0xcc2127, 0xd03136, 0xf8dfe0, 0xffffff, 0xffffff, 0xe17c7f, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2027, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xca202a, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xd03339, 0xcc2228, 0xe69497, 0xffffff, 0xffffff, 0xfffdfd, 0xe28386, 0xd23d42, 0xd9595d, 0xf4cfd0, 0xffffff, 0xffffff, 0xf3cacb, 0xcd272d, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2227, 0xc61c2a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcb2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xf2c6c7, 0xffffff, 0xfdf6f7, 0xfefcfc, 0xffffff, 0xfdf8f8, 0xffffff, 0xffffff, 0xffffff, 0xf4d1d2, 0xd1393e, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcb2126, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcb2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xd03237, 0xfbeded, 0xffffff, 0xefbbbd, 0xda5e62, 0xf4d1d2, 0xfefbfb, 0xfef9f9, 0xf7dbdc, 0xe58f92, 0xcf2c32, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcd2027, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcd2026, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xd9585c, 0xffffff, 0xffffff, 0xe48a8d, 0xcc2127, 0xcc2329, 0xd33f44, 0xd33f44, 0xcd262c, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2226, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcb2129, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xe38689, 0xffffff, 0xffffff, 0xd8555a, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2027, 0xcc222a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcc222a, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xe9a1a4, 0xffffff, 0xf8e2e3, 0xce2b30, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcb2126, 0xd42a2a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xd42a2a, 0xcb2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xeaa4a6, 0xffffff, 0xe4888b, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2227, 0xcb2127, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcb2126, 0xcc2228, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xeba9ab, 0xf9e6e6, 0xce2b31, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2027, 0xcc2222, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xd42a2a, 0xcc2228, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xe28083, 0xdb6367, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcd2027, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcd232a, 0xcc2126, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2227, 0xd42a2a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcd2026, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2228, 0xce1f28, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcc2222, 0xcd2126, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2026, 0xd42a2a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xca2028, 0xcc2227, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xca2028, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcc2222, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2027, 0xcc222a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcc2226, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcd2127, 0xc61c1c, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcd2027, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2226, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcd2328, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcd2028, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcb2127, 0xcc2227, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcb2127, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcb2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcd2028, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcc2228, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcb2127, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcd1f26, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2227, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcc2028, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2127, 0xcc2027, 0xaa0000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xaa0000, 0xcc2126, 0xcc2127, 0xcc2127, 0xcc2127, 0xce2424, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xd01c26, 0xcc2127, 0xcc2127, 0xcc2226, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xcc2027, 0xcc2226, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0xd42a2a, 0xcc2228, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, }; //end of array 
//const unsigned int array2[] = { /*different image output from the tool goes here if additional images wanted - just rename array1[] to another name, any name will do*/}; //end of array

void loop() {
PoiSonic(8000,array1);
//PoiSonic(2000, array2); 
/*first value is time to show the image, second value is array of colour values to use*/
/*put other code for patterns and more arrays here*/
}

void PoiSonic(unsigned long time, const unsigned int array[]){
unsigned long currentTime = millis();
 while (millis()< currentTime + (time)) {

int f= numberOfSlices;
int z; //a counter
int j=NUM_LEDS;

    for (int x=0;x<f;x++){
     for(z=NUM_LEDS;z>0;z--){
       leds[z-1]=array[x+((j-z)*f)];}
     FastLED.show();
     delayMicroseconds(40); //may need to increase / decrease depending on spin rate
     }       
    delayMicroseconds(1000); //may need to increase / decrease depending on spin rate
   }
 }
 
@abrownmn : did you meet any problem using with the hardwares?

Not sure if cap/resistors matter,
I did add a 47uF between my power battery
teensy have enough cap on the board
and apa102 were pretty robust and don't need extra cap to work fine,

adding some 470R between apa102 data<-teensy MOSI and CLK<-teensy SCK would help protect the Teensy,
as sometimes mis-shorting Vdd and dat pin on the apa102-strip could lead to damage of Teensy chip, if you power the apa102 with 5V or directly with lithium battery(4.2V)
(though I didn't add in my design anyway)
 
I'm starting a similar project and I just read through the whole thread - great stuff!

Since I'm using a whole lot of LEDs (1200 WS2812Bs - not using them for POI but the underlying coding principles are similar) and a large BMP (1,200x15,000px) I'm trying to get as much speed as possible out of my setup.

Below is the code I'm using (adapted from mortonkopf's post #223):

The things I changed are:

- int paintSpeed =50; -> int paintSpeed =1;
- uint8_t povidx = 0; -> uint16_t povidx = 0; (to be able to use more than 256 LEDs)

Further things to try:
- remove all serial.prints
- upgrade from Teensy 3.2 to 3.6 (has anyone tried this on 4.0?)

Also I'm rethinking my choice of LEDs, the WS2813's dead pixel resistance is very appealing for mounted installations. Perhaps the upgraded PWM speed (2000 vs 400Hz) would have an improvement to speed as well...?

Any other suggestions? I only need about 60leds/meter.


Code:
/*
  This code uses the T3.6 onboard sd card slot, BMP stored on the card are light painted using a cheap strip of ws2811 leds using FastLed
  code derived from lightpainting sketch:
  https://forum.pjrc.com/threads/24535-OctoWS2811-POV-reading-BMP-from-SD-card
  and this post:
  ------> https://forum.pjrc.com/threads/40871-Teensy-6-5-SDFat-BMP-file-read-fail
*/

#include <SPI.h>
#include <SD.h>
#include <FastLED.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;


File bmpFile;
const int chipSelect = 10;

// you can remove all Serial.print when you have your paint staff
// set up, this is just for debug

int bmpWidth, bmpHeight;
uint8_t bmpDepth, bmpImageoffset;
#define BUFFPIXEL 2048

unsigned int Color(byte b, byte r, byte g); //placed here to avoid compiler error

// How many leds in your strip?
#define NUM_LEDS 1150

#define DATA_PIN 2 //the pin that Led strip is attached to
CRGB leds[NUM_LEDS];
int paintSpeed = 1; //adjust this to vary image refresh rate



void setup(void) {
  Serial.begin(9600);
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(1);

  //test our led strip - you can remove this to the comment line "// if you dont get ..."
  for (int x = 0; x < NUM_LEDS; x++) {
    leds[x] = CRGB::Green;
  }
  FastLED.show();
  delay(500);
  for (int x = 0; x < NUM_LEDS; x++) {
    leds[x] = CRGB::Red;
  }
  FastLED.show();
  delay(500);
  for (int x = 0; x < NUM_LEDS; x++) {
    leds[x] = CRGB::Blue;
  }
  FastLED.show();
  delay(500);
  for (int x = 0; x < NUM_LEDS; x++) {
    leds[x] = CRGB::Black;
  }
  FastLED.show();
  delay(500);
  // if you dont get all leds lighting red then going off, check your wiring

  Serial.println("init");
  delay(500);
  Serial.print("Initializing SD card...");

  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("SD OK!");

}
void loop() {

  bmpDraw("1.bmp");//example filename
}

//////////////////Function to read BMP and send to Led strip a row at a time/////////////////////
void bmpDraw(char* filename) {

  File   bmpFile;
  int      bmpWidth, bmpHeight;   // W+H in pixels
  uint8_t  bmpDepth;              // Bit depth (currently must report 24)
  uint32_t bmpImageoffset;        // Start of image data in file
  uint32_t rowSize;               // Not always = bmpWidth; may have padding
  uint8_t  sdbuffer[3 * BUFFPIXEL]; // pixel in buffer (R+G+B per pixel)
  uint32_t povbuffer[BUFFPIXEL];  // pixel out buffer (16-bit per pixel)//////mg/////this needs to be 24bit per pixel////////
  uint32_t  buffidx = sizeof(sdbuffer); // Current position in sdbuffer
  boolean  goodBmp = false;       // Set to true on valid header parse
  boolean  flip    = true;        // BMP is stored bottom-to-top
  int      w, h, row, col;
  int  r, g, b;
  uint32_t pos = 0, startTime = millis();
  uint16_t  povidx = 0;
  boolean  first = true;


  // Open requested file on SD card
  bmpFile = SD.open(filename);
  Serial.println(filename);
  // Parse BMP header
  if (read16(bmpFile) == 0x4D42) { // BMP signature
    Serial.print("File size: ");
    Serial.println(read32(bmpFile));
    (void)read32(bmpFile); // Read & ignore creator bytes
    bmpImageoffset = read32(bmpFile); // Start of image data
    Serial.print("Image Offset: ");
    Serial.println(bmpImageoffset, DEC);
    // Read DIB header
    Serial.print("Header size: ");
    Serial.println(read32(bmpFile));
    bmpWidth  = read32(bmpFile);
    bmpHeight = read32(bmpFile);
    if (read16(bmpFile) == 1) { // # planes -- must be '1'
      bmpDepth = read16(bmpFile); // bits per pixel
      Serial.print("Bit Depth: "); Serial.println(bmpDepth);
      if ((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed

        goodBmp = true; // Supported BMP format -- proceed!
        Serial.print("Image size: ");
        Serial.print(bmpWidth);
        Serial.print('x');
        Serial.println(bmpHeight);

        // BMP rows are padded (if needed) to 4-byte boundary
        rowSize = (bmpWidth * 3 + 3) & ~3;

        // If bmpHeight is negative, image is in top-down order.
        // This is not canon but has been observed in the wild.
        if (bmpHeight < 0) {
          bmpHeight = -bmpHeight;
          flip      = false;
        }

        w = bmpWidth;
        h = bmpHeight;

        for (row = 0; row < h; row++) {
          if (flip) // Bitmap is stored bottom-to-top order (normal BMP)
            pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
          else     // Bitmap is stored top-to-bottom
            pos = bmpImageoffset + row * rowSize;
          if (bmpFile.position() != pos) { // Need seek?
            bmpFile.seek(pos);
            buffidx = sizeof(sdbuffer); // Force buffer reload
          }

          for (col = 0; col < w; col++) { // For each column...
            // read more pixel data
            if (buffidx >= sizeof(sdbuffer)) {
              povidx = 0;
              bmpFile.read(sdbuffer, sizeof(sdbuffer));
              buffidx = 0; // Set index to beginning
            }
            // set pixel
            r = sdbuffer[buffidx++];
            g = sdbuffer[buffidx++];
            b = sdbuffer[buffidx++];
            Serial.print(r); Serial.print(" "); Serial.print(g); Serial.print(" "); Serial.println(b);
            //we need to output BRG 24bit colour//
            povbuffer[povidx++] = (b << 16) + (g << 8) + r;
          }

          for (int i = 0; i < NUM_LEDS; i++) {
            leds[i] = povbuffer[i];
          }
          FastLED.show();
          delay(paintSpeed);// change the delay time depending effect required
        } // end scanline

      } // end goodBmp
    }
  }//end of IF BMP
  Serial.println();

  bmpFile.close();
}

//*************Support Funcitons****************//
// These read 16- and 32-bit types from the SD card file.
// BMP data is stored little-endian, Arduino is little-endian too.
// May need to reverse subscript order if porting elsewhere.
uint16_t read16(File& f) {
  uint16_t result;
  ((uint8_t *)&result)[0] = f.read(); // LSB
  ((uint8_t *)&result)[1] = f.read(); // MSB
  return result;
}
uint32_t read32(File& f) {
  uint32_t result;
  ((uint8_t *)&result)[0] = f.read(); // LSB
  ((uint8_t *)&result)[1] = f.read();
  ((uint8_t *)&result)[2] = f.read();
  ((uint8_t *)&result)[3] = f.read(); // MSB
  return result;
}


Are there any other speed improvements that can be made? As a last resort perhaps updating two pixels at once instead of one?
 
@Janezek

I suggest using octows2812 library, available at PJRC website libraries
which splices your LED chain into 8 parallel chains and uses DMA for maxima speed

but you'll need more setup on hardware connection , more wires to solder but shouldn't be a problem
 
Thank you I'll give it a shot, I already have a OctoWS adapter lying around somewhere.

Any ideas perhaps about how to achieve an exact refresh rate, for example 25 lines of bitmap per second? I'm trying to sync the animation to music.
 
I use some of a elapsed microseconds and use other things to do that,
and check if time is favored or not before FastLED.show(), or DMAshow(), whatever draws the LED
this part of my

Code:
unsigned long targetmicros = 0;
elapsedMicros nowmicros;
all other variables are accordingly, with my lines below my Frame Per Second "FPS" was pretty stable and precise, also can be change any time of the program by my function "setFPS(unsigned int fps)"
Code:
void setFPS(unsigned int fps) {
  setfps = fps;
  FPSchecker = (setfps > FPSlimits);
  if (FPSchecker) {
    screen = (1000000 / setfps) - 4;
    targetmicros = nowmicros + screen;
  }
}
Code:
 if (FPSchecker) {
    while (nowmicros < targetmicros) {
      //
      delayMicroseconds(1);
    }
    targetmicros = nowmicros  + screen;
  }
FastLED.show();

hope this helps, you can write function that works like this.
 
Hello, Happy new year community :)

I have did another build of POV ( is this still POV anyway? lol) for a drum.
featuring Teensy LC and 4m (1m*4) of apa102(60pixel per meter) in parallel of meters.
time-coding is so flexible for any kind of performance :
It can make some time-specific and well-defined light show for my drummer friend

 
Hello, Happy new year community :)

I have did another build of POV ( is this still POV anyway? lol) for a drum.
featuring Teensy LC and 4m (1m*4) of apa102(60pixel per meter) in parallel of meters.
time-coding is so flexible for any kind of performance :
It can make some time-specific and well-defined light show for my drummer friend

Great work as always Po Ting!!

I would just add some milky plastic or silicone over the leds to achieve more organic loook.
 
guys i have one problem i cant solve now because my programing skill is to low :)

I used converter tool that was availible on address: http://kavanet.co.uk/Pages/Projects/Arduino Projects/Orbit/Image Converter.html

but the page doestnt exist any more. And i also had no succes in contacting author.

I found another converter but the output is not the same: http://www.orchardelica.com/poisonic/poi_page.html

What i get from this converter:

const unsigned int array1[] = { 0x030303, 0x040203, 0x060206, 0x030303, 0x030304, 0x030303,

What i need:

const char pinki[][totalLEDs][3] = {{{173, 0, 149}, {58, 0, 50}, {4, 0, 3}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}

i know that is just a different way to tel the led on wich color to turn on. Do you have any idea where to get converter that can convert picture to format: {{{173, 0, 149}, {58, 0, 50}, {4, 0, 3}, {0, 0, 0.................. ??

thank you in advance
 
you can use the code in message #381 of this thread with the converter on orchardelica. You should be able to use webpages offline by keeping a copy saved for offline use. That way you don't need to go online to convert your images.
 
Great work as always Po Ting!!

I would just add some milky plastic or silicone over the leds to achieve more organic loook.

Thanks, hope you have progress on your work too!
at first I've think ROM at chop is not enough so I focus on using a SD, very well established library, and seek on ROM chip but not successful
its quite enough on T3.6 or T4 but not at T3.1 or arduino


For everyone: here's another record of the drum using with the actual artist ~
https://youtu.be/SlOZlGj9Dvc
 
Thanks, hope you have progress on your work too!
at first I've think ROM at chop is not enough so I focus on using a SD, very well established library, and seek on ROM chip but not successful
its quite enough on T3.6 or T4 but not at T3.1 or arduino


For everyone: here's another record of the drum using with the actual artist ~
https://youtu.be/SlOZlGj9Dvc

Wow quite an audience!!

I made another staff.. this is for my friend. I tryed to make it as best as possible. It is good solid product with 4h of play time.

https://imgur.com/a/Djwoqae

I made also a short promo:

https://youtu.be/9_MgeDwTTzg

Still didnt find a solution how to turn images to rgb code (000, 000, 000) :(
 
I'm using this wonderful POV project to draw BMPs on to an installation, but I'm having some glitching when using the drawBMP function.
You can see the glitching here:

https://youtu.be/Np8I5BMz4nE

However, interestingly, it doesn't glitch when drawing onto the pixels using code (e.g. leds[x] = CRGB::Blue;}

Could someone please take a look at my code and see if there is something that's causing this?

I've tried multiple SD cards of multiple brands and it hasn't helped.
I'm using the Teensy 3.6 on a OctoWS2811 board, with WS2815 leds, everything is powered by two 12V PSUs, each for one half of the rings. There is a step-down converter from 12v to 5v to power the Teensy.

Also, another weird thing is that when the sketch uses the bmpDraw function, my radio starts to produce some white noise in the background. The moment I switch it from bmpDraw to coded animation, the noise stops.


Code:
/*
This code uses the T3.6 onboard sd card slot, BMP stored on the card are light painted using a cheap strip of ws2811 leds using FastLed
 code derived from lightpainting sketch:
 https://forum.pjrc.com/threads/24535-OctoWS2811-POV-reading-BMP-from-SD-card
 and this post:
  ------> https://forum.pjrc.com/threads/40871-Teensy-6-5-SDFat-BMP-file-read-fail
*/

#include <SPI.h>
#include <SD.h>
#include <FastLED.h>

File bmpFile;
const int chipSelect = BUILTIN_SDCARD;

// you can remove all Serial.print when you have your paint staff 
// set up, this is just for debug

int bmpWidth, bmpHeight;
uint8_t bmpDepth, bmpImageoffset;
#define BUFFPIXEL 1531

unsigned int Color(byte b, byte r, byte g); //placed here to avoid compiler error

// How many leds in your strip?
#define NUM_LEDS 1531

#define DATA_PIN 7 //the pin that Led strip is attached to
CRGB leds[NUM_LEDS];
int paintSpeed = 0.001; //adjust this to vary image refresh rate


void setup(void) {
  Serial.begin(9600);

  FastLED.addLeds<WS2813, DATA_PIN, GRB>(leds, NUM_LEDS);

//test our led strip - you can remove this to the comment line "// if you dont get ..."
for(int x=0;x<NUM_LEDS;x++){
leds[x] = CRGB::Green;}
  FastLED.show();
  delay(500);
for(int x=0;x<NUM_LEDS;x++){
leds[x] = CRGB::Red;}
  FastLED.show();
  delay(500);
for(int x=0;x<NUM_LEDS;x++){
leds[x] = CRGB::Blue;}
  FastLED.show();
  delay(500);
  for(int x=0;x<NUM_LEDS;x++){
  leds[x] = CRGB::Black;}
  FastLED.show();
  delay(500);
// if you dont get all leds lighting red then going off, check your wiring

  Serial.println("init");
  delay(500);
  Serial.print("Initializing SD card...");
 
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("SD OK!");

}
void loop() {




 bmpDraw("8.bmp");//example filename

}

//////////////////Function to read BMP and send to Led strip a row at a time/////////////////////
void bmpDraw(char* filename){

  File   bmpFile;
  int      bmpWidth, bmpHeight;   // W+H in pixels
  uint8_t  bmpDepth;              // Bit depth (currently must report 24)
  uint32_t bmpImageoffset;        // Start of image data in file
  uint32_t rowSize;               // Not always = bmpWidth; may have padding
  uint8_t  sdbuffer[3*BUFFPIXEL]; // pixel in buffer (R+G+B per pixel) 
  uint32_t povbuffer[BUFFPIXEL];  // pixel out buffer (16-bit per pixel)//////mg/////this needs to be 24bit per pixel////////
  uint32_t  buffidx = sizeof(sdbuffer); // Current position in sdbuffer
  boolean  goodBmp = false;       // Set to true on valid header parse
  boolean  flip    = true;        // BMP is stored bottom-to-top
  int      w, h, row, col;
  int  r, g, b;
  uint32_t pos = 0, startTime = millis();
  uint16_t  povidx = 0;                   // TO SMO DALI IZ 8 NA 16
  boolean  first = true;
 
 
  // Open requested file on SD card
  bmpFile = SD.open(filename);
Serial.println(filename);
  // Parse BMP header
  if(read16(bmpFile) == 0x4D42) { // BMP signature
    Serial.print("File size: "); 
    Serial.println(read32(bmpFile));
    (void)read32(bmpFile); // Read & ignore creator bytes
    bmpImageoffset = read32(bmpFile); // Start of image data
    Serial.print("Image Offset: "); 
    Serial.println(bmpImageoffset, DEC);
    // Read DIB header
    Serial.print("Header size: "); 
    Serial.println(read32(bmpFile));
    bmpWidth  = read32(bmpFile);
    bmpHeight = read32(bmpFile);
    if(read16(bmpFile) == 1) { // # planes -- must be '1'
      bmpDepth = read16(bmpFile); // bits per pixel
      Serial.print("Bit Depth: "); Serial.println(bmpDepth);
      if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
 
        goodBmp = true; // Supported BMP format -- proceed!
    Serial.print("Image size: ");
    Serial.print(bmpWidth);
    Serial.print('x');
    Serial.println(bmpHeight);
    
        // BMP rows are padded (if needed) to 4-byte boundary
       rowSize = (bmpWidth * 3 + 3) & ~3;
 
        // If bmpHeight is negative, image is in top-down order.
        // This is not canon but has been observed in the wild.
        if(bmpHeight < 0) {
          bmpHeight = -bmpHeight;
          flip      = false;
        }
 
        w = bmpWidth;
        h = bmpHeight;
 
     for (row=0; row<h; row++) {       
         if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
            pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
          else     // Bitmap is stored top-to-bottom
            pos = bmpImageoffset + row * rowSize;
          if(bmpFile.position() != pos) { // Need seek?
            bmpFile.seek(pos);
            buffidx = sizeof(sdbuffer); // Force buffer reload
          }
          
          for (col=0; col<w; col++) { // For each column...
            // read more pixel data
           if (buffidx >= sizeof(sdbuffer)) { 
             povidx = 0;         
              bmpFile.read(sdbuffer, sizeof(sdbuffer));
              buffidx = 0; // Set index to beginning
           }
            // set pixel
            r = sdbuffer[buffidx++];
            g = sdbuffer[buffidx++];
            b = sdbuffer[buffidx++];
          Serial.print(r);Serial.print(" ");Serial.print(g);Serial.print(" ");Serial.println(b);
          //we need to output BRG 24bit colour//
            povbuffer[povidx++] =(b<<16) + (g<<8) +r;
          }
          
        for(int i=0;i<NUM_LEDS;i++){
          leds[i]=povbuffer[i];}
           FastLED.show();
            delay(paintSpeed);// change the delay time depending effect required
          } // end scanline
 
      } // end goodBmp
    }
  }//end of IF BMP
  Serial.println();
   
  bmpFile.close();
}

//*************Support Funcitons****************//
// These read 16- and 32-bit types from the SD card file.
// BMP data is stored little-endian, Arduino is little-endian too.
// May need to reverse subscript order if porting elsewhere.
uint16_t read16(File& f) {
  uint16_t result;
  ((uint8_t *)&result)[0] = f.read(); // LSB
  ((uint8_t *)&result)[1] = f.read(); // MSB
  return result;
}
uint32_t read32(File& f) {
  uint32_t result;
  ((uint8_t *)&result)[0] = f.read(); // LSB
  ((uint8_t *)&result)[1] = f.read();
  ((uint8_t *)&result)[2] = f.read();
  ((uint8_t *)&result)[3] = f.read(); // MSB
  return result;
}


I don't think I've made any major changes except adapting the sketch a bit to support 1531 pixels (I've changed this line "uint8_t povidx = 0;" from 'uint8_t' to 'uint16_' )
 
hi there. Does it still glitch when all Serial.print comments are removed? There is still one in the file read section that should not be there when in operation. Thats about all I can think of, apart from repeated calls to open / close the file too quickly. Also "int paintSpeed = 0.001; //adjust this to vary image refresh rate" should probably be a float not int if using a non int value.

Does it still glitch if open file, read file, close file than do something else before trying to open the file again. ITs been w while since I used this sketch, so sorry I can't be more helpful.
 
I'm using this wonderful POV project to draw BMPs on to an installation, but I'm having some glitching when using the drawBMP function.
You can see the glitching here:

...

Hi Janezek, not sure what your glitch is like, can you be more specific? or is there a normal group to compare with?

I saw you have 1531 pixels, if you're using ws pixels you might need to care for power supply and refresh rate,
It is not strange when static color like CRGB::Blue won't glitch but refreshing with high speed and bmpdrawing,

I suggest you start with lower amount of pixels and speed to see if it happens
 
Hi mortonkopf and thank you for the helpful comment,

I will try removing the serial commands, change "int paintSpeed = 0.001" to "float paintSpeed = 0.001", but how do I slow down the rate of calls to open and close the file? Does that mean there will be pauses between the end and beginning of a bmpDraw cycle?
I do faintly recall that last time I was testing that it was perhaps glitching less when I had a call for a static color in the loop together with the bmpDraw.
I'll try this when I get to to the project this evening and report back.

and hello Po ting and thank you as well,

There is a youtube link in my previous post, perhaps the forum doesn't allow me to post links? It's youtube address is "Np8I5BMz4nE"
To sum up, the glitch is that every few seconds of animating from the BMP, the strip flashes in a different color. If its blue then the glitches - flashes are reddish-pink, if it's white it's rainbow colored...
I did notice at times that it didn't glitch as much when I started feeding in later on in the strip - so less total pixels, but I'm not 100%.
For the changing of speed, do you mean the paintSpeed value? Or CPU speed of the Teensy?
Actually the speed of animation is already on the low end of what I'd like to achieve, but for 1531 pixels on a single pin I probably can't ask for more.

I think I have plenty of power, very thick power cables, with grounds connected together, and it glitches even with drastically llower brightness or with only a small section being lit up at a time (as seen in the video below.)


I've added another video of the glitching: https://youtu.be/bcTMC4fnHm0
(youtube: bcTMC4fnHm0 )
 
Hi Janezek,

yes both the youtube links is visit-able, I'm just not sure what's the glitch but I see it clearly now
the data transfer rate or even frame per second could do something to the ws strips at early version, causing ugly flickering , not sure if yours do the same

your second video shows that the farther rings have glitches,
I think you can try split chaining the rings data with extra pins, try to shorten each strip to a limit under 100,
but that require some effort modify the code to splice them

also please try the rings one by one, different strips sometimes have hardware issues and works magically slightly different, even if from same provider
I see you use many pixels, do they came from same shop? or did you check them separately and all fine?

If hardware are fine, hope the splicing method could work
 
Last edited:
Back
Top