Forum Rule: Always post complete source code & details to reproduce any issue!
Page 16 of 16 FirstFirst ... 6 14 15 16
Results 376 to 399 of 399

Thread: Teensy APA102 POV Poi / Pixel Poi Build. Tutorial

  1. #376
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    917
    @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.

  2. #377
    Junior Member
    Join Date
    Jun 2019
    Posts
    11
    Quote Originally Posted by mortonkopf View Post
    @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!

  3. #378
    Senior Member
    Join Date
    Sep 2015
    Location
    Taiwan, Asai. (Traditional Chinese)
    Posts
    165
    @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.

  4. #379
    Senior Member
    Join Date
    Sep 2015
    Location
    Taiwan, Asai. (Traditional Chinese)
    Posts
    165
    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 by Po Ting; 06-13-2019 at 03:21 PM.

  5. #380
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    917
    Quote Originally Posted by Po Ting View Post
    completed item video on FB
    @po ting, these look great.

  6. #381
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    917
    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

  7. #382
    Junior Member
    Join Date
    Jun 2019
    Posts
    11
    Quote Originally Posted by Po Ting View Post
    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.

  8. #383
    Junior Member
    Join Date
    Jun 2019
    Posts
    11
    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.


    Click image for larger version. 

Name:	2MHz 1.png 
Views:	30 
Size:	48.2 KB 
ID:	16817
    Click image for larger version. 

Name:	2MHZ 2.png 
Views:	17 
Size:	27.3 KB 
ID:	16818

    Click image for larger version. 

Name:	12 MHz 2.png 
Views:	15 
Size:	29.6 KB 
ID:	16819
    Click image for larger version. 

Name:	12MHz 1.png 
Views:	25 
Size:	51.7 KB 
ID:	16820

    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
       }
     }

  9. #384
    Senior Member
    Join Date
    Sep 2015
    Location
    Taiwan, Asai. (Traditional Chinese)
    Posts
    165
    @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)

  10. #385
    Junior Member
    Join Date
    Nov 2019
    Posts
    6
    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?

  11. #386
    Senior Member
    Join Date
    Sep 2015
    Location
    Taiwan, Asai. (Traditional Chinese)
    Posts
    165
    @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

  12. #387
    Junior Member
    Join Date
    Nov 2019
    Posts
    6
    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.

  13. #388
    Senior Member
    Join Date
    Sep 2015
    Location
    Taiwan, Asai. (Traditional Chinese)
    Posts
    165
    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.

  14. #389
    Senior Member
    Join Date
    Sep 2015
    Location
    Taiwan, Asai. (Traditional Chinese)
    Posts
    165
    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


  15. #390
    Junior Member
    Join Date
    Nov 2018
    Posts
    17
    Quote Originally Posted by Po Ting View Post
    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.

  16. #391
    Junior Member
    Join Date
    Nov 2018
    Posts
    17
    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/...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

  17. #392
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    917
    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.

  18. #393
    Senior Member
    Join Date
    Sep 2015
    Location
    Taiwan, Asai. (Traditional Chinese)
    Posts
    165
    Quote Originally Posted by masterslave View Post
    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

  19. #394
    Junior Member
    Join Date
    Nov 2018
    Posts
    17
    Quote Originally Posted by Po Ting View Post
    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)

  20. #395
    Junior Member
    Join Date
    Nov 2019
    Posts
    6
    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_' )

  21. #396
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    917
    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.

  22. #397
    Senior Member
    Join Date
    Sep 2015
    Location
    Taiwan, Asai. (Traditional Chinese)
    Posts
    165
    Quote Originally Posted by Janezek View Post
    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

  23. #398
    Junior Member
    Join Date
    Nov 2019
    Posts
    6
    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 )

  24. #399
    Senior Member
    Join Date
    Sep 2015
    Location
    Taiwan, Asai. (Traditional Chinese)
    Posts
    165
    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 by Po Ting; 06-12-2020 at 05:35 PM. Reason: typo

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •