Teensy APA102 POV Poi / Pixel Poi Build. Tutorial

Ah thanks - so it just resizes it according to the input variables and spits it out as hex values?

The problem I was finding was that the part of the image nearest the point of rotation was narrower than that near the circumference. Obviously I know why this is but I was hoping for some kind of clever transformation.

I am currently trying to display whole circular images and FWIW (not much so far) am writing some convoluted max/msp patch to convert an images into a similar matrix.

Sorry not to make more sense but I don't know what I'm doing! Hopefully I'll get there soon!
 
hi thank you sir for replay. i found that my cable was damage so i did try with my smartphone cable and finaly i could see the led on teensy on again :) so defenly not fragile!
@gulga, I compiled your posted code, but removed the array content at end, this bit - "......................,", and it compiled without an issue. I am using Arduino 1.6.8 and teensyduino 1.2.8. Also, teensy is not fragile, but sensitive to sticking current in the wrong place.
 
14813126_562424787298439_591762090_o.jpg https://youtu.be/oHhHPZ6qq5s got it running and i have use the PoiSonic Poi APA102 image converter wich work like a charm but i found that i need to use a sensor like hall sensor to make the image stay still. how can i add in my code the sensor to count the rotations? i dont mind to pay for the code cause i need to finish my project to show in college.


#include "FastLED.h"

#define NUM_LEDS 43//number of leds in strip length on one side


CRGB leds[NUM_LEDS];
int numberOfSlices = 50 ;

void setup() {

delay(200);
FastLED.addLeds<APA102, BGR>(leds, NUM_LEDS);
pinMode(7, OUTPUT);
digitalWrite(7, HIGH); // enable access to LED

}


const unsigned int array1[] = { 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe, 0xfefefe }; //end of array*



void loop() {
PoiSonic(2000,array1); //call method, with duration to show (2sec) and array name.

}


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
}
}
 
Last edited:
Ah thanks - so it just resizes it according to the input variables and spits it out as hex values?
Yep, thats exactly what it does, and I avoided doing any antialiasing work. Yes, I have thought about single images spread across the whole rotation, especially good for some fast weaves, and did have some maths embedded into a java application to create the output. i did not do much with it as found that the more simple approach of images around the arc were more than adequate. Unfortunately, I don't have that work to hand, but it got into some ugly cos, sin and pi maths.... Good luck!
 
@guiga. I have not used a hall effect sensor, but I am sure that a number of users on the forum could support. There seems to be a couple of ways to introduce the effect into the sketch. A simple "single shot" trigger of the image for each pass of the magnet, such as shown here: http://www.hobbytronics.co.uk/arduino-tutorial11-hall-effect
in that instance you could try adapting the lines in the loop:
Code:
hallState = digitalRead(hallPin);
  if (hallState == LOW) {     
    // turn LED on:    
    digitalWrite(ledPin, HIGH);  <---- change this line to call the poisonic function instead.

or use of interrupts.
Either way, you should change the call to the poisonic function by removing the amount of time that the image displays for to a minimum, or not at all, so that the image shown just once for each time it is triggered by passing the magnet.
 
Last edited:
Yep, thats exactly what it does, and I avoided doing any antialiasing work. Yes, I have thought about single images spread across the whole rotation, especially good for some fast weaves, and did have some maths embedded into a java application to create the output. i did not do much with it as found that the more simple approach of images around the arc were more than adequate. Unfortunately, I don't have that work to hand, but it got into some ugly cos, sin and pi maths.... Good luck!

Yes I started into the trigonometry which brought back (half) memories.
Then I tried (in software) rotating the image 1 degree at a time and grabbing a thin segment of the image and converting it to rgb to get 150 segments.
Not quite there yet though!

Even with images around the arc I guess you need to to a bit of stretching to stop images from distorting. Or maybe it doesn't really matter!

@guiga can't you use a timer to work out the approximate speed of the wheel and from there alter the speed of the image to fit?

Edit: I've got the full circle images translation working finally. The main advantage for me as I have the LEDS mounted on a bike wheel is that I get a bit more resolution/bigger image. Saying that the images around the arc look good too and are alot less forgiving re rpm. I might try out a magnet/reed switch system myself.
 
Last edited:
thank you @mortonkopf. after searching loads of examples how use hall sensor, this is my failled code!
it give me error "poiSonic" was not declared in this scope! dont know why im studing electronics when i cant even do a simple pov globe!

#include "FastLED.h"
#define NUM_LEDS 43
//#define DATA_PIN 11
//#define CLOCK_PIN 13
// sensor setup
const int hallPin = 3; // define the Arduino sensor pin
int hallState = 0; // variable for reading the hall sensor status

CRGB leds[NUM_LEDS];
int numberOfSlices = 43 ;

void setup() {

delay(200);
//FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN>(leds, NUM_LEDS);
pinMode(hallPin, INPUT);
pinMode(7, OUTPUT);
digitalWrite(7, HIGH); // enable access to LED
FastLED.addLeds<APA102, BGR>(leds, NUM_LEDS);
}
const unsigned int array1[] = { 0x850402, 0xdf0000, 0x30000d, 0x180000, 0xf26d11, 0xef690f, 0xf36609, 0xf26607, 0x270000, 0xd96f19, 0xca8135, 0x26ffda, 0xc6832f, 0x22090a, 0x300a03, 0xd4d817, 0xf9ff06, 0xdfe60d, 0xc7cd1a, 0xb1b33e, 0xa9a8b3, 0xf9fdfd, 0xecebf0, 0x525252, 0x2b2b2b, 0x1c1c1c, 0x141414, 0x101010, 0x1a1a1a, 0x161616, 0x151515, 0x090909, 0x171717, 0x151515, 0x191919, 0x2b2b2b, 0x575757, 0xeeeeee, 0xf8f8ff, 0xa2a1a5, 0xa1a83a, 0xc8cd18, 0xe3eb22, 0xf6ff12, 0xd1db29, 0x611abd, 0x4e168e, 0xc98828, 0x2afeda, 0xce8536, 0xe27627, 0x220409, 0xf56107, 0xf06600, 0xe5670f, 0xe9630b, 0x0f0e00, 0x1c0107, 0xee0003, 0x860414, 0xde0100, 0x3b273b, 0xce080c, 0x110001, 0xc24d0c, 0xf66604, 0xef6409, 0xf26607, 0x360603, 0xe76b0c, 0xd56e10, 0xab8c47, 0x21fced, 0x3d353b, 0xe27515, 0x301414, 0xccd61e, 0xfaff05, 0xfcfe0c, 0xffff1e, 0xedf340, 0xc3bfc2, 0xfefffc, 0xd9d9d9, 0x505050, 0x2b2b2b, 0x191919, 0x101010, 0x171717, 0x181818, 0x191919, 0x1b1b1b, 0x0d0d0d, 0x1e1e1e, 0x2a2a2a, 0x4f4f4f, 0xdcdcdc, 0xfdfdfd, 0xbfbfc0, 0xf6fb42, 0xfffe1e, 0xfdff0e, 0xf9fd06, 0xd7dc11, 0x3a0f24, 0xdd6f23, 0x334128, 0x1cfde8, 0xb99851, 0xdf7a21, 0xeb660e, 0x300804, 0xf9660c, 0xea6902, 0xf16504, 0xc44c0b, 0x06060a, 0xd80208, 0x2b3431, 0xe50008, 0xed020a, 0xe40300, 0xe3000b, 0x290000, 0x080f0b, 0xe26912, 0xed610c, 0xf16506, 0x460a02, 0xee6704, 0xea7314, 0xcf7930, 0x8eb667, 0x17fcea, 0xc58331, 0xe27618, 0x261d1f, 0xb7c040, 0xc5ca04, 0x939310, 0x8c881c, 0x9c9a4e, 0xdbd8e2, 0xfdfefa, 0xbfbfbf, 0x505050, 0x2c2c2c, 0x1c1c1c, 0x0d0d0d, 0x181818, 0x171717, 0x191919, 0x191919, 0x242424, 0x474747, 0xc6c5c9, 0xfefffb, 0xd6d7d2, 0x8c8b42, 0x938f24, 0x9b9c1c, 0xc7c913, 0xb4bd14, 0x111d06, 0xd67224, 0xbf912f, 0x0cfff0, 0x96b069, 0xd4730f, 0xe06a0d, 0xed6406, 0x3a0805, 0xf86407, 0xef6004, 0xf76613, 0x020a07, 0x14070c, 0xe20000, 0xe70104, 0xf3000a, 0xf5030e, 0xce0500, 0xe6060b, 0xe70700, 0x8c000b, 0x160725, 0xe55f0a, 0xf1640a, 0x57190f, 0xee6703, 0xf06905, 0xcd6122, 0xdd7e30, 0x5fb29a, 0x11fff1, 0xb88728, 0xae5d1f, 0x33120a, 0xd0dd20, 0xfafc0a, 0xffff06, 0xffff2b, 0xf5fb48, 0xece7ed, 0xffffff, 0xafafaf, 0x4a4a4a, 0x2f2f2f, 0x1e1e1e, 0x090909, 0x1b1b1b, 0x202020, 0x262626, 0x3f3f3f, 0xa9a9a9, 0xfcfef4, 0xe7e7e6, 0xfaff54, 0xfdfa32, 0xfdfd16, 0xfefe10, 0xc5d015, 0x140600, 0xbf681b, 0xce8b2d, 0x25ffe5, 0x3ecb99, 0xcc7b2a, 0xd3640a, 0xef6700, 0xf76203, 0x591208, 0xf46306, 0xe95716, 0x010624, 0x8c0610, 0xea0007, 0xe80000, 0xe70104, 0xf10006, 0x6f0003, 0xb9000c, 0xee0201, 0xd70207, 0xe90103, 0x97000c, 0x221400, 0xe56905, 0x7f2701, 0xee690c, 0xf4640a, 0xbe5321, 0xea7013, 0x82541e, 0x41e7c0, 0x22fedd, 0x937048, 0xda782a, 0x2d100d, 0x565527, 0x7c731c, 0x736b09, 0xaaa91d, 0xd7df6e, 0xf1f1f2, 0xfbfcff, 0x8e8e8e, 0x464646, 0x242424, 0x1d1d1d, 0x151515, 0x2c2c2c, 0x444444, 0x939393, 0xfffffd, 0xeff0f8, 0xd8dc5e, 0xb1b425, 0x7e7c26, 0x74660d, 0x574604, 0x391310, 0xe37f0f, 0x947238, 0x32efe9, 0x30e6c2, 0x7f5034, 0xe07114, 0xc04a14, 0xee6a11, 0xf1640a, 0x852708, 0xf3630c, 0x250200, 0x7e0507, 0xe20100, 0xde0000, 0xec0002, 0xc1020d, 0x540300, 0xe50000, 0xfe0009, 0x050000, 0xef0006, 0xe90009, 0xd50d00, 0x3e0500, 0x39040b, 0xb54309, 0xf36502, 0xf1660f, 0xa13e1d, 0xef6400, 0xc25622, 0xb88c28, 0x2bffd9, 0x22ffdc, 0xb99136, 0xbe5b0e, 0x2a1521, 0xd0d222, 0xf7fe04, 0xffff10, 0xfefa1f, 0xf6ff3f, 0xfefbff, 0xf7f7f7, 0x7b7b7b, 0x424242, 0x2c2c2c, 0x2e2e2e, 0x484848, 0x7d7d7d, 0xf8f8f8, 0xfaf7fb, 0xffff70, 0xffff20, 0xfffc10, 0xf9f90c, 0xa9189e, 0xa700b4, 0xa70e8e, 0xb40689, 0x48ece5, 0x1dfcde, 0xc88434, 0xb15119, 0xf0660b, 0xa83c0b, 0xee670d, 0xf26910, 0xa64524, 0x691100, 0x290700, 0xe10000, 0xef0000, 0xe70000, 0x190004, 0xf50002, 0xf30100, 0x130900, 0xdb0000, 0xe90007, 0xd61f38, 0x532f2d, 0xce0009, 0xf20300, 0x1b130f, 0x6e321b, 0xee6701, 0xf6620e, 0x792e16, 0xf26a10, 0xe25c0d, 0xdc761f, 0xc58c42, 0x1cffff, 0x2af2c0, 0xb88139, 0xdd7214, 0x32120b, 0x61562c, 0xa09339, 0xd5d04b, 0xeff823, 0xfcff4e, 0xfffdf8, 0xf9f9f7, 0x676767, 0x464646, 0x454545, 0x5f5f5f, 0xfefffc, 0xfffcff, 0xf1ff5f, 0xf7ff2d, 0xcad213, 0x9da200, 0x8e079f, 0x95009f, 0xb2039f, 0x96098f, 0x683b94, 0x38d7e1, 0xd08133, 0xdf7516, 0xde5a18, 0xf26607, 0x872d22, 0xf95e0b, 0xf06802, 0x7c3c17, 0x130d0d, 0xde0308, 0xd40a00, 0x5a1d32, 0xb22d53, 0xe70a06, 0xfd0414, 0x28002a, 0x09070d, 0x340600, 0xf30103, 0xeb0100, 0xe70011, 0x6a0a22, 0xb40002, 0xe60000, 0x0e1d04, 0xf06410, 0xf6620c, 0x5e1106, 0xed6709, 0xf76009, 0xf56710, 0xd6781a, 0x4a4b41, 0x0effff, 0x55dfba, 0xc9862b, 0xe56d14, 0x310a66, 0xc8d234, 0xffff0a, 0xffff15, 0xffff37, 0xf7ff57, 0xf9fbf0, 0xf6f6f7, 0x787878, 0x767676, 0xfefefe, 0xfcfcff, 0xfaff60, 0xfffe24, 0xfffd09, 0xfefd00, 0xcbcd15, 0x4c1435, 0xa93e38, 0x964a3c, 0x7341a0, 0x64439f, 0x543364, 0xc97619, 0xea6812, 0xf7610f, 0xf26607, 0x680f0f, 0xf65f0e, 0xe55d1d, 0x0e1310, 0xf80003, 0xc00010, 0x66000a, 0xe40000, 0xeb0005, 0xe80000, 0x6c042c, 0x41004b, 0x090909, 0x0b0b0b, 0x970008, 0xe10200, 0xec020b, 0xe60003, 0xef0004, 0x560b0d, 0xe10017, 0x11191f, 0xf76000, 0x280701, 0xeb6601, 0xfc6a0b, 0xf36d00, 0xe26e0a, 0x57221a, 0xb59a50, 0x1efdff, 0x53db9f, 0xc0862c, 0x391435, 0x351631, 0x9ea328, 0xe7f103, 0xf9ff0e, 0xfaff37, 0xf6ff62, 0xfdfefc, 0xfcfcfc, 0xf8fdfa, 0xfefbff, 0xfcff71, 0xf8fd37, 0xfafe17, 0xf9ff0d, 0xf6ff16, 0x3f3407, 0x470a33, 0x9b474b, 0x6d6c8a, 0x51489e, 0x882573, 0x701069, 0xe36a12, 0xf36905, 0xea670a, 0xf26607, 0x360613, 0xf26501, 0x171f1e, 0xed000e, 0x4c0e0c, 0xcf0004, 0xdf0100, 0xe20102, 0xe20000, 0x9d0609, 0x410049, 0x210028, 0x0b0b0b, 0x0d0d0d, 0x020f11, 0x410309, 0xeb0100, 0xe60003, 0xf70012, 0xe10800, 0xbb080b, 0x07221e, 0x211219, 0x371118, 0xeb6600, 0xff6901, 0xf4600a, 0xf26200, 0x548d7c, 0xa0a460, 0xa9a762, 0x18fffd, 0x73ca8f, 0x42325d, 0xe86d0b, 0x2c1c31, 0xbfbc2f, 0xf4f406, 0xfcfc18, 0xf9fc51, 0xf2f89f, 0xffffff, 0xfcfffc, 0xf3fb7b, 0xf7fa28, 0xf8ff17, 0xfdfd0a, 0xf9ff13, 0xe8da1a, 0xe66d17, 0x471b43, 0x74687c, 0x3594bb, 0x7f2d77, 0x970d82, 0x570b47, 0xed640c, 0xea680c, 0xf86903, 0xf26607, 0x3d060f, 0x211710, 0x231c1b, 0xc30400, 0xe10803, 0xde0000, 0xf60205, 0xe80001, 0x4f060c, 0x110c07, 0x2f0a2e, 0x150615, 0x0c0c0c, 0x0c0c0c, 0x101010, 0x0c0d08, 0x830310, 0xa70111, 0xe20000, 0xe30203, 0xee0005, 0xe20600, 0x631111, 0x271912, 0xf15c00, 0xea6b0b, 0xf0620a, 0x9f7137, 0x454326, 0x86a57b, 0xb9934c, 0x87b97b, 0x1cfff9, 0x2b8b8f, 0xbe8227, 0xea690a, 0x36162f, 0xbec020, 0xf2fc20, 0xfeff4f, 0xfdfdd8, 0xfffaf3, 0x984f60, 0x9c125c, 0x7e0c50, 0xf6ff11, 0xe3ea0b, 0xd1ea10, 0xe56b14, 0xd1862d, 0x3f7777, 0x4887b9, 0x776070, 0x9a355f, 0x921076, 0x481519, 0xf56104, 0xf05f04, 0xe76411, 0xfa640d, 0x251a0b, 0x55120a, 0xe70004, 0xef0000, 0xe90000, 0xe40006, 0xa40002, 0x8c080d, 0x101010, 0x0e0e0e, 0x0f0f0f, 0x0b0b0b, 0x080808, 0x0f0f0f, 0x111111, 0x151006, 0x210e07, 0xdf0c00, 0x3c9eb3, 0xd20010, 0xed0004, 0xe70006, 0xf30000, 0x41181f, 0x9b3110, 0xf15f04, 0xde5b04, 0x876c2f, 0x50362a, 0x9e7023, 0x7ac28a, 0xaa7c42, 0x6ed386, 0x1bffff, 0x90ad6e, 0xd18032, 0xc94d2f, 0x4c3331, 0xc7d24d, 0xf7fccc, 0xfcffff, 0xeff3a1, 0xb71356, 0xc21c6b, 0xbd276e, 0x812743, 0x442b2f, 0xcd4e2b, 0xcd782b, 0x9ca36f, 0x1efaff, 0x69cd9a, 0x9e523d, 0xa13047, 0xe56c0f, 0x641d1b, 0xf26002, 0xe75e09, 0xf0650a, 0x9c3f1c, 0x231d16, 0xeb0302, 0xe60003, 0xf7000e, 0xd6030b, 0x3aa4ab, 0xe50000, 0x291b1d, 0x151515, 0x090909, 0x0d0d0d, 0x0c0c0c, 0x0c0c0c, 0x070707, 0x131313, 0x141414, 0x161616, 0x33060b, 0xe50006, 0xdf1121, 0x401217, 0xe70208, 0xe20006, 0xe70000, 0x21231d, 0xec5615, 0x714d2f, 0x4e695b, 0x59493a, 0xa56630, 0x7b7039, 0xb86329, 0xc6862b, 0x46ddba, 0x0ffeff, 0xa7a05c, 0xc19832, 0xee8838, 0xb3a8aa, 0xfdfcff, 0xfffeab, 0xa67041, 0xc12373, 0xbc2868, 0x9a4664, 0x9d175c, 0xed6f0d, 0xb45940, 0x97a55d, 0x13ffff, 0x4dd3b1, 0xca822e, 0xbd630b, 0xf36b03, 0xf1650b, 0x7f2a16, 0xef5f00, 0xdd5a08, 0xd25814, 0x211b25, 0xe30200, 0xe20700, 0xea0400, 0x5d080c, 0xdd0e34, 0xe80000, 0x5a080a, 0x191919, 0x141414, 0x121212, 0x030303, 0x0d0d0d, 0x101010, 0x0a0a0a, 0x131313, 0x161616, 0x171717, 0x1b191a, 0x990200, 0xee0203, 0xdc0900, 0xa7071e, 0x910a10, 0xf10001, 0xde0208, 0x1c2726, 0xc14b0d, 0xa16526, 0x57663d, 0x6a7b3b, 0xef6400, 0xa04215, 0xe47215, 0x8e754e, 0x39f5c3, 0x1cffff, 0x9cb468, 0xe1c291, 0xfcfefe, 0xe8e7d6, 0xdadb50, 0xaa861a, 0xc41a61, 0xcb1b78, 0xc41874, 0x9c1151, 0xdc7728, 0x90854d, 0x07fff3, 0x2ffabe, 0x827348, 0xd57713, 0xbc4312, 0xf25f06, 0xee650e, 0x9f3917, 0xf26405, 0xb74a14, 0x222324, 0xeb0003, 0xdf0505, 0x96080e, 0x7f070e, 0xe20300, 0xeb0003, 0xae0110, 0x161a20, 0x181818, 0x151515, 0x131313, 0x161616, 0x0c0c0c, 0x101010, 0x121212, 0x030303, 0x141414, 0x141414, 0x1c1c1c, 0x191c1e, 0xd60010, 0xf20107, 0xe80503, 0xe60005, 0x4384a6, 0xe10000, 0xc70719, 0x151020, 0xf5631f, 0x6a622f, 0xec6d0b, 0xf4660e, 0x785353, 0xe86009, 0xce5e2b, 0xcd8844, 0x41f8db, 0x66fff4, 0xfffcff, 0xffffdb, 0xfff93a, 0xf9fc1b, 0xfeff08, 0x991055, 0xc42161, 0xad285b, 0x99412f, 0xbc923f, 0x23fcff, 0x28fbcd, 0xbc8d34, 0xbc5f1a, 0xec690d, 0x9f4a2e, 0xd96009, 0xf86714, 0xce4c12, 0xf16411, 0x16261b, 0xb61525, 0xde0014, 0x407f96, 0xee0200, 0xe60000, 0xee0003, 0xdf0013, 0x1e1e1e, 0x1c1c1c, 0x0a0a0a, 0x161616, 0x161616, 0x121212, 0x090909, 0x111111, 0x131313, 0x181818, 0x050505, 0x191919, 0x1c1c1c, 0x20201e, 0x13110d, 0xe9050b, 0xe50000, 0xdf0701, 0xe40000, 0xe51012, 0x4b4076, 0x88263b, 0x1e2030, 0xd94b00, 0xde6800, 0xec650f, 0xbf2d61, 0xfb6413, 0xe56613, 0xee812e, 0xcda963, 0xfafdfa, 0xebfef6, 0xd9dd48, 0xf7ae2f, 0xfda51a, 0x5c501a, 0x574b2b, 0x83003a, 0x9f5021, 0xb78f3b, 0x21fcec, 0x23ffff, 0xc58631, 0xd97b24, 0xde631b, 0xef6608, 0x8a2e12, 0xe55c01, 0xf45c00, 0xde591a, 0x3c100d, 0x7b154e, 0x324d61, 0xe40c11, 0xf0000f, 0xec0002, 0xea0600, 0xe40511, 0x1a1c19, 0x1e1e1e, 0x1d1d1d, 0x171717, 0x0b0b0b, 0x171717, 0x141414, 0x121212, 0x0f0f0f, 0x151515, 0x161616, 0x1a1a1a, 0x121212, 0x1e1e1e, 0x202020, 0x1f1f1f, 0x000704, 0x551314, 0xd90300, 0xe20400, 0xf00006, 0xe80004, 0xb70006, 0x15251e, 0xbf0c6d, 0xe1670f, 0xfc6100, 0xd7058e, 0xeb670a, 0xe76a37, 0xff883a, 0xfffdff, 0xfffee5, 0xf5f83c, 0xfcfc28, 0xfdfd1d, 0xffcc1c, 0xc10022, 0xcd0e21, 0xd97614, 0xcd8234, 0x26fff5, 0x13fffa, 0xc0d1ce, 0xd97a17, 0xde7808, 0xf06800, 0xf26607, 0x571c1e, 0xee5e00, 0xf26b09, 0x632c31, 0x1a2322, 0xa30807, 0xeb0004, 0xe70701, 0xee0001, 0xe00002, 0x630a1e, 0x1c1d1c, 0x141414, 0x1b1b1b, 0x171717, 0x1c1c1c, 0x1c1c1c, 0x090909, 0x101010, 0x111111, 0x000000, 0x101010, 0x161616, 0x161616, 0x181818, 0x1e1e1e, 0x1f1f1f, 0x1f1f1f, 0x281f24, 0x27090b, 0x690f17, 0xc50006, 0xdd0002, 0xe80002, 0xdd0000, 0xf20008, 0xc600d0, 0x2e0fa0, 0x441297, 0xa9279c, 0xb8453b, 0xf67d29, 0xfff6e4, 0xfff7e5, 0xf8f540, 0xf5ec25, 0x93ff8a, 0x6dfba6, 0xbe8144, 0xf36a00, 0xd9601a, 0xc28c33, 0x46eacc, 0x13ffff, 0xbb974c, 0xdecc70, 0xe76609, 0xe56000, 0xef6600, 0xf06506, 0x330007, 0xf36100, 0xca4e0d, 0x272118, 0xf50008, 0xe40400, 0xf10007, 0xec0000, 0xc60a10, 0x610b0a, 0x54131b, 0x242424, 0x212121, 0x090909, 0x181818, 0x1c1c1c, 0x1a1a1a, 0x131313, 0x111111, 0x111111, 0x171717, 0x030303, 0x0f0f0f, 0x1c1c1c, 0x1c1c1c, 0x131313, 0x202020, 0x1b1b1b, 0x262022, 0x212222, 0x890012, 0xe30405, 0x3c1d0e, 0xdb0201, 0xea0005, 0xe60006, 0x740044, 0x580c96, 0x411696, 0xd12fb4, 0xa72495, 0xffd8b1, 0xf9f9cf, 0xf8ff24, 0xfaf61f, 0xfbfc0a, 0xe2dd22, 0x11ffee, 0xf36a00, 0xe46c1b, 0xb27c44, 0x58e6bc, 0x12fdf9, 0xa3a361, 0xd67e30, 0xf6d137, 0xf46205, 0xf46603, 0xf26000, 0xf36507, 0x4c1c1e, 0xed6007, 0x1a272f, 0xed0000, 0xe80000, 0xf40001, 0xf70000, 0x341d22, 0xd80002, 0x8d0716, 0x19231e, 0x212121, 0x1f1f1f, 0x232323, 0x0a0a0a, 0x161616, 0x1a1a1b, 0x161712, 0x0e1209, 0x0e0e0e, 0x111111, 0x151515, 0x121212, 0x1b1b1b, 0x1d1d1d, 0x1c1c1c, 0x040404, 0x252525, 0x212121, 0x212121, 0x1e2a25, 0xce010b, 0xee0505, 0xc50408, 0x651219, 0xef0104, 0x9d0419, 0x701f7f, 0x3d1c9d, 0xd834bd, 0xb42ca2, 0xffffcc, 0xfffe2e, 0xfcfb27, 0xf6ef00, 0xe9c600, 0xdd732a, 0xf65c13, 0xdf6e13, 0xc68b32, 0x4fdc9d, 0x3c377d, 0x492264, 0xd48027, 0xec6d10, 0xe2b01b, 0xf46102, 0xf4610c, 0xf56110, 0xf46507, 0x6b2669, 0x2a231e, 0xd3000b, 0xf40302, 0xe50104, 0x6f0c16, 0xb90000, 0xea0502, 0xda0007, 0x1f2021, 0x151515, 0x1e1e1e, 0x1e1e1e, 0x1f1f1f, 0x1e1e1e, 0x131313, 0x1b1c18, 0x17171a, 0x15131b, 0x090909, 0x141414, 0x171717, 0x131313, 0x1a1a1a, 0x1f1f1f, 0x1e1e1e, 0x161616, 0x080808, 0x222222, 0x282828, 0x212522, 0x0f1b19, 0xe6000a, 0xeb030d, 0xea0000, 0x7b110b, 0xa50010, 0x6b1f8d, 0x60149b, 0xd32eb9, 0xb22a98, 0xf7fa22, 0xf8f432, 0xfeff09, 0x4f27b5, 0x5735c4, 0xf06505, 0xda661c, 0xd18536, 0x89ba8b, 0x10ffff, 0x51616f, 0x6c3745, 0xe37312, 0xef6809, 0xb9720a, 0xef6202, 0xec6f05, 0xec6600, 0xf6610b, 0x766693, 0xa0121b, 0xec0000, 0xb0011b, 0x74120c, 0xe20307, 0xed0001, 0xee0004, 0x232223, 0x221f21, 0x202020, 0x060606, 0x1f1f1f, 0x202020, 0x212121, 0x1b1b1b, 0x111011, 0x91a073, 0x748762, 0x131313, 0x131313, 0x161616, 0x1d1d1d, 0x050505, 0x1c1c1c, 0x1e1e1e, 0x202020, 0x212121, 0x202020, 0x1e1e1e, 0x232323, 0x151e19, 0x0e0500, 0xe40000, 0xf00004, 0xe10801, 0xe50006, 0x801d4b, 0xbc26a2, 0xb02297, 0xbc904a, 0xfdff17, 0xffff17, 0xfeca06, 0x5b37b7, 0x6138ca, 0xed6c15, 0xd46f29, 0x9cb064, 0x18ffff, 0x50dab3, 0x7e4241, 0x7e3f3f, 0xe76713, 0xf26506, 0x923924, 0xea6400, 0xf88200, 0xea600d, 0xfeb417, 0xf2b75b, 0xd90000, 0x532220, 0xec040b, 0xe70002, 0xea0002, 0xe50103, 0x1e1815, 0x202020, 0x282828, 0x232323, 0x212121, 0x090909, 0x212121, 0x181818, 0x1f1f1f, 0x11110f, 0x0f1610, 0x080f07, 0x131313, 0x111111, 0x171717, 0x161616, 0x191919, 0x060606, 0x202020, 0x252525, 0x232323, 0x212121, 0x212121, 0x222222, 0x1e2524, 0x262725, 0x270800, 0xe20604, 0xe20008, 0xe7000f, 0xf0421b, 0xd8ae33, 0xf0cb31, 0xe7f136, 0xfcff0b, 0xe8c200, 0xf75305, 0xb44d25, 0x8d4045, 0xdb8122, 0xa58c4b, 0x1ef9ff, 0x63cf98, 0xb09151, 0xd66428, 0xcd6532, 0xf26305, 0xe56808, 0xd45422, 0xf46b03, 0xf08505, 0xf38c16, 0xe4f727, 0xe8a21d, 0xc91a22, 0xee0000, 0xe8040f, 0xe30000, 0xe30206, 0x6d1916, 0x1f2322, 0x111111, 0x272727, 0x252525, 0x212121, 0x202020, 0x171717, 0x202020, 0x1b1b1b, 0x1b1c1b, 0x0b0907, 0x141214, 0x131313, 0x0a0a0a, 0x141414, 0x181818, 0x1b1b1b, 0x1f1f1f, 0x0b0b0b, 0x1f1f1f, 0x202020, 0x1d1d1d, 0x0c0c0c, 0x252525, 0x232323, 0x232323, 0x302830, 0x241e17, 0xa30525, 0xe7640e, 0xf7fd11, 0xf8ff17, 0xffff0f, 0xffff0d, 0xb0b310, 0x8f4011, 0xc74f0e, 0xcb2b5c, 0xcc2258, 0x9a6844, 0x18ffff, 0x4ae1ae, 0xd18239, 0xdc721c, 0x981b47, 0x77059e, 0xd9590e, 0xec6c00, 0xdf591a, 0xf46402, 0x9f3818, 0xa5dd38, 0xe88d0b, 0xeb0005, 0xec0000, 0xe60706, 0xed0400, 0xaa0d15, 0x22231d, 0x2a2228, 0x232323, 0x222222, 0x0d0d0d, 0x242424, 0x212121, 0x202020, 0x202020, 0x1e1e1e, 0x1b1b1b, 0x1b1b1b, 0x161616, 0x090909, 0x131313, 0x101010, 0x050505, 0x171717, 0x181818, 0x181818, 0x1f1f1f, 0x1b1b1b, 0x202020, 0x1f1f1f, 0x1f1f1f, 0x050505, 0x242424, 0x232323, 0x272622, 0x2e1a23, 0xcb2316, 0xa08b1d, 0xe07619, 0xf99e13, 0xf7d111, 0xe97109, 0xd40200, 0x631719, 0x971a32, 0xda2457, 0xd82d5a, 0x9b0b40, 0x23e8cd, 0xbe8628, 0xe97820, 0x950090, 0xc900d3, 0xc506de, 0xb500cb, 0xe85909, 0xf56503, 0xf16605, 0x521a24, 0xd50200, 0xdb0709, 0xf00008, 0xec0000, 0xe20f03, 0x997513, 0xcb041d, 0x1a2421, 0x162720, 0x242424, 0x202020, 0x252525, 0x0b0b0b, 0x202020, 0x1f1f1f, 0x1d1d1d, 0x0a0a0a, 0x1f1f1f, 0x1c1c1c, 0x181818, 0x1a1a1a, 0x111111, 0x121212, 0x151515, 0x050505, 0x181818, 0x1c1c1c, 0x222222, 0x161616, 0x202020, 0x202020, 0x212121, 0x262626, 0x121212, 0x292929, 0x23271a, 0xa09a1b, 0xf7ff18, 0xfffb0e, 0xfffc13, 0xfbf90a, 0xf2970f, 0xf80910, 0xf36116, 0xb90e0c, 0x9c342d, 0xda2757, 0xde285a, 0x893052, 0x6e3d39, 0xcc7414, 0xdc5f0c, 0xc400cc, 0xea01f4, 0xea00f3, 0xda02e8, 0x9600a0, 0xf46b04, 0xd06c11, 0xbc000c, 0xef0006, 0xea0000, 0xe7000a, 0xffd811, 0xdb0504, 0xed0700, 0xf9fd10, 0x908e2d, 0x040906, 0x262626, 0x232323, 0x232323, 0x232323, 0x1d1d1d, 0x1e1e1e, 0x1f1f1f, 0x1d1d1d, 0x020202, 0x1b1b1b, 0x141414, 0x151515, 0x0d0d0d, 0x121212, 0x151515, 0x171717, 0x161616, 0x1a1a1a, 0x1a1a1a, 0x303030, 0x060606, 0x202020, 0x212121, 0x252525, 0x242323, 0x202020, 0x7b7b3a, 0xced000, 0x99a308, 0x736310, 0xf24b22, 0xe71f08, 0xa80a17, 0xff670d, 0xff6114, 0xd10b0a, 0xc48e2d, 0xa3173b, 0xa71e40, 0xc98632, 0x692123, 0xe9660d, 0xae254b, 0xd900d7, 0xe700ef, 0xe000e8, 0xe103ef, 0xb400c5, 0x59dba0, 0xdc4819, 0xe20000, 0xef0600, 0xe81912, 0x981e31, 0xe60905, 0xdc0206, 0x717327, 0xa9a227, 0xd7d901, 0x7b880a, 0x020203, 0x232323, 0x232323, 0x2a2a2a, 0x131313, 0x232323, 0x1f1f1f, 0x1c1c1c, 0x141414, 0x0c0c0c, 0x1b1b1b, 0x151515, 0x0a0a0a, 0x101010, 0x131313, 0x151515, 0x171717, 0x191919, 0x1b1b1b, 0x1f1f1f, 0x202020, 0x010101, 0x1f1f1f, 0x222222, 0x2e382b, 0xacb421, 0xf4f603, 0xf1f80a, 0xf7ff17, 0xfef51c, 0xa09a1f, 0xd80013, 0xff591f, 0xf06c0e, 0xe66c14, 0xaf251c, 0x5de2b2, 0x1afff0, 0xb98f28, 0xd9781b, 0x811e1b, 0xef6901, 0xc63844, 0xd400dd, 0xe900f4, 0xe700f0, 0xe301ea, 0xb600bc, 0x28f4d9, 0xdb0709, 0xd60208, 0xe54215, 0x424041, 0xa31720, 0xe80507, 0xc3a039, 0xfffc14, 0xfcfd05, 0xfefe18, 0xfdfd0e, 0xafb522, 0x1c1623, 0x222225, 0x202020, 0x262626, 0x101010, 0x1b1b1b, 0x1e1e1e, 0x1a1a1a, 0x1c1c1c, 0x121212, 0x121212, 0x111111, 0x0a0a0a, 0x161616, 0x151515, 0x161616, 0x0c0c0c, 0x191919, 0x1b1b1b, 0x1d1d1d, 0x191919, 0x171717, 0x222222, 0xb1b730, 0xfaf600, 0xf0f612, 0xbdc916, 0x888e11, 0x4e4d10, 0x1b2422, 0xfa6312, 0xf54c11, 0xe16a08, 0xc28028, 0x7e8c79, 0x1cffff, 0xc4742d, 0xdc740f, 0xe7690e, 0xa5240f, 0xf16803, 0xf06b00, 0xbf00c7, 0xea01f4, 0xe600ef, 0xd903e8, 0x932484, 0xe10000, 0x38eac9, 0xdd0006, 0x692d38, 0x7b678e, 0x825c86, 0xf72a0b, 0x271a16, 0x555020, 0x878413, 0xc5c516, 0xeff51a, 0xf9fb0f, 0xa5af21, 0x212422, 0x1e1e1e, 0x1a1a1a, 0x1e1e1e, 0x080808, 0x161616, 0x181818, 0x191919, 0x0d0d0d, 0x0f0f0f, 0x0f0f0f, 0x121212, 0x0c0c0c, 0x131313, 0x161616, 0x171717, 0x0a0a0a, 0x1b1b1b, 0x1d1d1d, 0x1a1d17, 0x1c1a22, 0xbdc628, 0xf7ff00, 0xf9ff19, 0xfbfe12, 0xffff22, 0x909414, 0x2c192e, 0xab3f1a, 0xee6606, 0xce4514, 0xdd7e20, 0xafa651, 0x0dfbfa, 0xb88b3a, 0xca5924, 0xea670c, 0xf26a06, 0xc64618, 0xf16904, 0xf05607, 0xb12957, 0xb503cd, 0xb700bb, 0x9b01a6, 0xe63804, 0xe71215, 0xe70a10, 0xe40200, 0x5f4e5d, 0x7c6387, 0x846585, 0xed7019, 0xb43f0e, 0x281b13, 0x9ca012, 0xfcff0e, 0xffff09, 0xfffe0a, 0xf9ff1b, 0xb5b726, 0x181b16, 0x1e1e1e, 0x1d1d1d, 0x1e1e1e, 0x111111, 0x131313, 0x151515, 0x131313, 0x060606, 0x0e0e0e, 0x111111, 0x0e0e0e, 0x101010, 0x141414, 0x161616, 0x181818, 0x161616, 0x1c1c1c, 0x1b1f14, 0xbac729, 0xfcfb02, 0xfeff06, 0xf9fb0e, 0xe3e70a, 0x888527, 0x1f0e11, 0xff6303, 0xc54e0f, 0xea6a10, 0x8c441c, 0xb18534, 0x0affff, 0xc3673b, 0xcf791f, 0xec3003, 0xef6402, 0xf1630a, 0xb23c39, 0xf16a02, 0xf65908, 0xf16400, 0xf2660a, 0xa82b23, 0xf64203, 0xeb0000, 0xee0001, 0xea010a, 0xe10501, 0x9d3249, 0x7e6785, 0x6a4f66, 0xf06100, 0xc64a00, 0xfa610e, 0x2d151e, 0xc49a2d, 0xeae711, 0xf9f90f, 0xffff15, 0xfaf413, 0xbdc11a, 0x1d1d1d, 0x1b1b1b, 0x1d1d1d, 0x1c1c1c, 0x111111, 0x141414, 0x121212, 0x141414, 0x0c0c0c, 0x0c0c0c, 0x101010, 0x040404, 0x121212, 0x161616, 0x161616, 0x181714, 0x151814, 0xbcc42c, 0xdfe403, 0xf6ff0d, 0xf6fe05, 0xfefd0d, 0x979511, 0x232417, 0xf56c05, 0xec6400, 0xd05b17, 0xdf7a1e, 0x543c27, 0x25b598, 0xac8e49, 0xc25e1f, 0xea6b10, 0xea2203, 0xea6503, 0xf0650e, 0xef3f1e, 0xf66403, 0xf2520c, 0xf66505, 0xe45403, 0xdf280e, 0xe40300, 0xe70003, 0xec0104, 0xe70800, 0xb74b34, 0xdc0500, 0x19f8ea, 0x624c29, 0xee7624, 0xde570e, 0xe96707, 0xf3650f, 0x37232c, 0x8a932d, 0xfefa0b, 0xf7ff0f, 0xf5ff0b, 0xe5e813, 0xb5bd00, 0x171b09, 0x191919, 0x171717, 0x0e0e0e, 0x111111, 0x101010, 0x0f0f0f, 0x0b0b0b, 0x0b0b0b, 0x0e0e0e, 0x101010, 0x080808, 0x171717, 0x151515, 0x161f1c, 0xd0d412, 0xfbfc12, 0xfaf90d, 0xfbff09, 0xfdff12, 0x7e8409, 0x281713, 0x531e17, 0xe96902, 0xf16d09, 0xde6815, 0xde761e, 0x358c7c, 0x704934, 0xcf7716, 0xee590b, 0xf06508, 0xbc1e17, 0xea6809, 0xed6c00, 0xfa4d17, 0xf36300, 0xcf3511, 0xc33402, 0xf14500, 0xf00104, 0xec0004, 0xe70104, 0xcd1617, 0xdf0e00, 0xe00203, 0xd4611d, 0xb28b3e, 0x430775, 0x914737, 0xe3620b, 0xf57309, 0xf35f06, 0x4f1617, 0x281728, 0x8b8b16, 0xfcff09, 0xf9fd08, 0xfbff0c, 0xfeff0b, 0xced81b, 0x191919, 0x171717, 0x131313, 0x080808, 0x111111, 0x0e0e0e, 0x0b0b0b, 0x080808, 0x0d0d0d, 0x0f0f0f, 0x101010, 0x080808, 0x161616, 0x6e750f, 0xa4ab11, 0xc6cc03, 0xeaf313, 0xf8ff0f, 0x8f8816, 0x26221c, 0xe46712, 0x471420, 0xef6307, 0xef740e, 0xe37124, 0x6ed089, 0x43554d, 0xd37413, 0xec680e, 0xef6010, 0xf16607, 0xda0709, 0xf26401, 0xf46401, 0xf1550c, 0xe96600, 0x602411, 0x21031c, 0x2c061f, 0xc20119, 0xe12003, 0xeb300a, 0x9a0034, 0x590568, 0xee2c00, 0xe47015, 0x530d72, 0x6312a5, 0x571195, 0xdf6e0b, 0xe96b0e, 0xef6607, 0x481b20, 0xf8680e, 0x1e221b, 0x777d11, 0xffff0a, 0xeaf00d, 0xcfd818, 0xa1a211, 0x777811, 0x0d1300, 0x111409, 0x111111, 0x070707, 0x0c0c0c, 0x0a0a0a, 0x050505, 0x0a0a0a, 0x0e0e0e, 0x0d0d0d, 0x0f0f0f, 0xe8f429, 0xfdfd12, 0xf0f20f, 0xfcff03, 0xfeff1c, 0x898d09, 0x111613, 0xf5720f, 0xe7670d, 0x41040c, 0xef6c0c, 0xe86c23, 0xb1a14a, 0xc3903e, 0x46221d, 0xe76809, 0xf46a02, 0xf36507, 0xf26607, 0xe80006, 0xf35d0c, 0xf35e03, 0xf46613, 0xf8530c, 0xda0003, 0x350a18, 0x38011d, 0x270f18, 0xef0100, 0xf40000, 0x5000be, 0x5b00bf, 0xe36524, 0xea6c0a, 0x5a115f, 0x6615a8, 0x520c8e, 0xaba14f, 0xe56f13, 0xeb6a0d, 0x3a0b1d, 0xfd6f0a, 0xff620d, 0x1a1c08, 0x717800, 0xf8fd10, 0xfafc06, 0xfeff08, 0xfdff02, 0xe7ea17, 0x161513, 0x0f0f0f, 0x0d0d0d, 0x080808, 0x0a0a0a, 0x080808, 0x060606, 0x0c0e03, 0x0e0f09, 0x777420, 0x777b05, 0x717710, 0x9eae0b, 0xcdcc14, 0x656d00, 0x040919, 0xff680a, 0xee6809, 0xf0670e, 0x350504, 0xe96d05, 0xdb7e2e, 0xc88030, 0xe87414, 0x400a0c, 0xe7620a, 0xf36709, 0xf36306, 0xf26607, 0xdb0010, 0xee6900, 0xf06502, 0xf76b0f, 0xdc0033, 0xc00000, 0x390626, 0x35081d, 0x38080c, 0xd90c00, 0xe7060e, 0x49009f, 0x4600ba, 0xf86800, 0xf66017, 0xf06500, 0x4d166f, 0xd86d2f, 0xbf832a, 0xd47927, 0xe76e11, 0x3c0404, 0xe8640d, 0xf2660c, 0xf8631b, 0x140d12, 0x5d6013, 0xd5dd0c, 0x9ea20f, 0x7d7f19, 0x6b6c09, 0x697115, 0x060905, 0x0e0a06, 0x060606, 0x090909, 0x090909, 0x080808, 0x0b081b, 0xe8ed1f, 0xfcfd28, 0xffff06, 0xf7ff0e, 0xf1ff00, 0x7a7f01, 0x150d2a, 0xff610c, 0xe76420, 0xf45e0b, 0xea670f, 0x60271f, 0xe06c0b, 0xd0782b, 0xe17205, 0xe96d0b, 0x56110c, 0xed650e, 0xe75d0d, 0xf66505, 0xf26607, 0x930a20, 0xf36808, 0xf7680c, 0xe8000a, 0xe90600, 0xe50205, 0x260914, 0x2a0819, 0x720c1d, 0x6a1c6f, 0x5b2167, 0x3f0a31, 0xf16f02, 0xec6509, 0xf1600b, 0xe96300, 0x691a1c, 0xe86e0a, 0xe56e09, 0xd8772b, 0xe46f15, 0x6c220f, 0xf36300, 0x403d90, 0xa64d26, 0xf26007, 0x101000, 0x8c8d0e, 0xffff0c, 0xfdfe07, 0xfafb06, 0xf5f40b, 0xfdff28, 0x0d0f0f, 0x0c0c0c, 0x030303, 0x000012, 0x12160b, 0xf1ff2a, 0xc4d300, 0x83820d, 0x5a5217, 0x69720e, 0x101400, 0x110c22, 0x973c08, 0xf26607, 0xcf5011, 0xeb6414, 0xef6b08, 0x8e361f, 0xde6f09, 0xc86018, 0xeb6b09, 0xeb640c, 0x7a2615, 0xf66303, 0xe05708, 0xf66508, 0xf46509, 0xa6171d, 0xfb6803, 0xa1170b, 0xe10103, 0xeb0004, 0xe90004, 0xe70000, 0xf20003, 0xb30711, 0x4f1b56, 0x703068, 0x3e2589, 0xec6412, 0xf56709, 0xdc5512, 0xf46507, 0x872507, 0xef6713, 0xea6000, 0xe05826, 0xe07316, 0x91301b, 0xeb6c15, 0x30204c, 0xbc4e21, 0xf46506, 0xa0370d, 0x000800, 0x262119, 0x6b6316, 0x463c1f, 0x8a8f00, 0xc6ce18, 0xe0f51e, 0x06050c, 0x050505, 0x0d1103, 0xffff1d, 0xeff300, 0xfaf80d, 0xfdfa1a, 0xf7fc00, 0x6c7700, 0x0b0804, 0xfb6a1e, 0xb1481d, 0xf26607, 0xb33704, 0xe96510, 0xeb6b0a, 0xa84d24, 0xe36c08, 0xb04010, 0xf76509, 0xf06800, 0x9a3b21, 0xf66304, 0xc44a01, 0xf76300, 0xf46509, 0xae2831, 0xb63c17, 0x830001, 0xe50003, 0xe70004, 0xe90004, 0xf00000, 0xee0000, 0x810542, 0x4d0a4e, 0x642e43, 0x49205e, 0xf46205, 0xeb6915, 0xbc4712, 0xf46507, 0x993518, 0xef630a, 0x80830c, 0x8e8614, 0xdd731e, 0xac4c1b, 0xe6710c, 0xef6214, 0xa03c09, 0xf26003, 0xc54c10, 0xf96f00, 0x0a0000, 0x70720e, 0xffff0a, 0xfdfe00, 0xfaff04, 0xfeff1a, 0xffff29, 0x050505, 0xfbff26, 0xffff08, 0xd9eb04, 0xb4bf04, 0x787013, 0x313112, 0x051407, 0xf46318, 0xec6b02, 0xd35b15, 0xf26607, 0x7c290c, 0xea6c15, 0xeb6d14, 0xc65311, 0xeb6708, 0x962e0d, 0xf16610, 0x3d2fe2, 0x63276e, 0xf56816, 0xa83810, 0xeb6402, 0xf76a0d, 0xa33123, 0x45030d, 0xe60000, 0xdb0003, 0xec000b, 0xe70017, 0xc90002, 0xec0104, 0x700a41, 0x6a0346, 0x181a39, 0x3c215c, 0xfb6713, 0xf0680d, 0x97340f, 0xf26604, 0xb9460b, 0xa2901c, 0xcbe132, 0xc6e72c, 0x9eb529, 0xca5212, 0xec6a14, 0xec6905, 0x7b230d, 0xed620e, 0xd85618, 0xe56409, 0xf36d19, 0x181809, 0x39320b, 0x706c00, 0xafb916, 0xdcf301, 0xffff18, 0xfbff16, 0xfaf800, 0xffff07, 0xfdff0c, 0xffff0a, 0x6b7404, 0x120b02, 0x300c20, 0xed6e15, 0xe16705, 0xe55f0b, 0xf26607, 0x601100, 0xe76c10, 0xe96c0b, 0xd35a10, 0xf26504, 0x6b1501, 0xaa4728, 0x5438ef, 0x3f37d7, 0xe6670b, 0x802211, 0xf16604, 0xf5630a, 0x2e0916, 0xe5050f, 0xe60101, 0xc90008, 0xe30006, 0xeb0204, 0xea0407, 0xe8000d, 0xcc0007, 0xea000b, 0xc50016, 0x241d47, 0xee6511, 0xec5e00, 0x822604, 0xf16502, 0xdb4f06, 0xaac62b, 0xd7f12c, 0xd1ed32, 0xbdd026, 0xd76004, 0xee660a, 0xee6800, 0x620800, 0xf26811, 0xeb5f19, 0xf16304, 0xed670c, 0x381016, 0x13000d, 0x69690e, 0xffff17, 0xf9fb05, 0xfffb0d, 0xf0fa00, 0xffff1a, 0xf8fb06, 0xd4e217, 0x696301, 0x040a0c, 0xe45e1b, 0x220b07, 0xef6509, 0xed6c00, 0xe65f11, 0xf26509, 0x3c120e, 0xe56d00, 0xf56402, 0xe56413, 0xec6204, 0x510b01, 0xe86518, 0x4031cf, 0x7f3160, 0xca600c, 0x411512, 0x171b17, 0x0e0d1f, 0xb4010d, 0xec0000, 0x800212, 0xd5000e, 0xe80006, 0xf20006, 0xe70104, 0xea0007, 0xe80205, 0x3a1314, 0xef0002, 0xd90007, 0x1e1b14, 0x16080a, 0x27230d, 0xce5406, 0xd2631d, 0xa6c11c, 0xd9f32e, 0xd4f030, 0xbcd628, 0xf05700, 0xef6d05, 0xef6709, 0x3d120a, 0xf06d08, 0xe8620c, 0xf26607, 0xf26607, 0x290500, 0xdc650e, 0x0f030b, 0x58570a, 0xdddf0d, 0xeef70b, 0xfbfc18, 0xf6f800, 0xffff0d, 0x666707, 0x050b0b, 0xe25b0b, 0xec6107, 0x1b0500, 0xf66c0f, 0xfb6302, 0xec6d0c, 0xf26509, 0x220401, 0xe9690b, 0xf2690e, 0xeb6204, 0xcf5f0f, 0x29140a, 0x07131b, 0x191008, 0x1a1617, 0x05111c, 0x131002, 0x0d1119, 0x720d00, 0x6f0300, 0xaa0216, 0xeb0100, 0xde0102, 0xea0009, 0xf2000b, 0xec000d, 0xea0007, 0xe90705, 0xec0010, 0xa8070d, 0x64028f, 0x790909, 0x161215, 0x1c140d, 0x0a1115, 0x0e182e, 0x717a2a, 0xcbe233, 0xc8e824, 0xa5ae2e, 0xf66400, 0xe96910, 0xef6709, 0x370807, 0xe96100, 0xf36205, 0xf26607, 0xf26607, 0x220200, 0xeb6b06, 0xf45b05, 0x070008, 0x6a700a, 0xf2fc02, 0xfdf100, }; //end of array

void loop() {
hallState = digitalRead(hallPin);

if (hallState == LOW) {

PoiSonic(40,array1); //call method, with duration to show (2sec) and array name.
}
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(2000); //may need to increase / decrease depending on spin rate
}
}


any one feel free to help me please. thanks
 
it looks like you have placed a curly bracket in the wrong place. This means that the declaration of void poiSonic is inside of the if function, which is not correct. you need to close loop and declare the void poiSonic function outside.
 
Hi,

You define/prototype your PoiSonic() function within the if ( hallState == LOW ) statement. Suggest moving the prototype to global space.

best,
Michael

edit: Actually, as MortonKopf mentioned, you have other bracketing problems as well...
 
thanks, i have removed 1 bracket from if ( hallState == LOW ) { to if ( hallState == LOW ) and it compiles with few errors , im sure i need to work more in the code. tomorrow will add the hall sensor and see how it goes.
 
I'm still working on this project but I've moved off the Teensy and onto the Wemos D1R2. I'm making pov on a bike wheel but development was so annoying having to stop the wheel and plug the teensy in all the time that I've mounted the LEDS on a fan and have wifi sketch uploading ota! Yes!

I might well move back to the Teensy when its ready though as its faster and maybe more reliable.

So yeah I've been playing not with a hall sensor but a reed switch/magnet combo which I guess has the same effect.
I'm working not with a repeating pattern but a whole image so I am adjusting the timing to display one 'frame' in the time it takes for one revolution.
I think I need to put the reed switch on an interrupt though or I can end up missing revolutions if the draw routine hasn't finished in time. Its just about fine with a fairly predictable electric fan but for spoke pov or poi I think interrupts are better. Unfortunately I think I need to turn the wifi off for interrupts to work so I'll just have to turn the wifi on when the wheel isn't spinning.

All in all I can see the advantage of using repeating patterns - its much easier and alot more forgiving! Complete images look great on a bike wheel/fan though! Maybe it doesn't make as much sense with poi?

The other thing I was wondering about @Mortonkopf was the way you ordered the data - I think its in pixel order? ie pixel 1 slice 1, pixel 1 slice 2,pixel 1 slice 3 ......pixel 2 slice 1 etc
Is that correct? For me it makes more sense to store the data the same way that the Leds Array is structured ie pixel 1 slice 1, pixel 2 slice 1, pixel 3.......

Anyway what do I know I've been staring at a strobing, blinky picture of Marge Simpson all day!
 
I can't believe that this thread is still going, wow! Anyhow, @gavspav, the way that the data is ordered is by slice, each pixel, then next slice each pixel.

Code:
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();

As you can see from the above, the pixel data held in the array is taken to fill the first slice for each led then shows, and then goes to the array and fills the second slice for each led then shows. the array location for the data runs in the combined sum "array[x+((j-z)*f)]". where x will only increment by one after each slice of led data has been sent. This way the array data is moved through sequentially. Hopefully that makes sense. Sorry if it doesn't, or am I missing something?
 
Yeah I'm keeping the thread alive by being well behind the curve!

All I meant with the data was that if it was stored in the large array in the order pixel 1 slice 1, pixel 2 slice 1, pixel 3 slice 1 you could use memcpy or pointers or something to get the data into the leds array. You wouldn't have to loop through and it might be a bit cheaper/faster. But tbh it doesn't really make much difference - just fitted the conversion patch I made in Max a bit better!
 
memcpy should work as the data is arranged as slice 1 led1 led2 led3 etc. memcpy, which I have not used, grabs a data in predetermined block sizes doesn't it? so you think that memcpy the whole slice as a single block and then set each led value by a location within that block. not sure how much faster allocating led values like that would be as I have no experience with it. But, the data should be in the right order for that to work.
 
came back to check in,
Teensy 3.5-3.6 had SDIO interface,
had anyone tried on POV with SDIO?
I've just ordered my 3.5 and not yet started
 
hi everyone , im still strugling to finish my code for the POV GLOBE.
been trying to fuse codes this time using arduino.

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

float rpm; //the RPM, updated every 100 rotations
int rotations; //the number of rotations since the start of the program
int go; //start toggling lights when this is 1, otherwise 0
int seconds; //seconds since the start of the program
int lastUpdate; //millis since last RPM update
float radsPerSec; //the rpm converted to the angular velocity

#define NUM_LEDS 43
#define DATA_PIN 51
#define CLOCK_PIN 52

//const int hallPin = 3;
//int hallState = 0;
CRGB leds[NUM_LEDS];
int numberOfSlices = 43 ;
int PoiSonic[11];


void setup() {
//setup an interrupt on digital pin 3 so we know when the sensor is at midnight
attachInterrupt(1, hallIsOn, RISING);
FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, BGR>(leds, NUM_LEDS);
//Serial.begin(9600);
}
const unsigned uint32_t array1[] = { 0x8f140c, }; //end of array example
//setup output pins for LEDS, when these pins are high they on

for(int i = 0; i < 11; i++)
{
pinMode(PoiSonic, OUTPUT);
digitalWrite(PoiSonic, LOW);
}

go = 0;
rpm = 0;
lastUpdate = 0;
seconds = 0;
radsPerSec = 0;
}

void loop()
{
//print of every 20th rotation
//if(rotations % 20 == 0)
//{
// Serial.println(rotations, DEC);
//}

float t = 0;
int pi2DivBy60 = 0;

//Update RPM every 100 rotations
if (rotations >= 100)
{
//calculate rpm from the milliseconds it look to do the last 100 rotations
rpm = 60.0*1000.0/((float)(millis() - lastUpdate))*rotations;

//convert rpm to angular velocity
radsPerSec = rpm * .1047;

//set the lastUpdate time to now
lastUpdate = millis();

//reset rotations to 0
rotations = 0;

//"t" is the milliseconds it takes to get from midnight (0) to 1 second (2pi/60), given the current radial velocity
t = 1000*2*3.14159/60/radsPerSec;

//the delay routine expects an integer
pi2DivBy60 = int(1000*2*3.14159/60/radsPerSec);

//print out rpm via serial
//Serial.println(rpm, DEC);
}

if(go)
{
//"seconds" is the current position of the second hand
seconds = (millis() / 1000) % 60;

delay(pi2DivBy60*seconds); //wait the time required to travel from midnight to the current second

//digitalWrite(11, HIGH); //toggle the LEDS on
for(int i = 0; i < 11; i++)
{
digitalWrite(PoiSonic, HIGH);
}

delay(pi2DivBy60); //wait the time required to travel 1 second

//digitalWrite(11, LOW); //togle the LEDS off
for(int i = 0; i < 11; i++)
{
digitalWrite(PoiSonic, LOW);
}

go = 0;
}
}

void hallIsOn()
{
rotations++;
go = 1;
}

void PoiSonic( const unsigned uint32_t array[]) {

int z; //a counter
for (int x = 0; x < numberOfSlices; x++){
for(z = NUM_LEDS; z > 0; z--){
leds[z - 1] = array[x + ((NUM_LEDS - z) * numberOfSlices)];
}

FastLED.show();

}


its full of errors and im the biggest noob around. cant do it ! can anyone help me please? i should had finish long time ago.
 
Did you get the original poisonic sketch working?

It seems the best way to do what you want is to have the hall sensor trigger the start of the image display and then adjust the time of the image display to fit.
 
Hi, there are a few things that you need to do to sort out the code. you still have curly brackets that don't match, meaning you need to go through the code and fit an opening bracket with a closing one for each section of the ode that you want to work as a segment. There is code that is outside of a function that will never be called as it is the wrong side go the closing bracket, and try changing the array type def to int rather uint32_t for the array[]. I have not looked any further than that right now, as I am not sure on where the orphan code should go. Run through he code systematically, making sure that it can reach each of the tasks that you set for it.
 
Last edited:
hi , thanks @namate and @mortonkopf for the replay. im studing electronic but i havent learn to program yet so thats why im strugling to put this working to get my 20 lol. been using a extension to visual studio to help me programing and codebender aswell but im to dumb for this lol.
 
Thanks for all your help in this. I 'finished' my project.
Here's a photo:

sicklicklelights.jpg

I didn't end up using your code @mortonkopf or the teensy in the end but they were invaluable starting points.
I used wemos d1 boards because they have wifi, loads of eeprom memory and were cheaper.
I didn't end up using the wifi or the memory and the cost difference was negligible so it was possibly a poor choice!
The finished work is very hard to photo as all the wheels travel at a different speed.

The image quality (in real life) didn't seem to be as good as some of the led poi I have seen though - I'm not sure why, the spacing between the pixels seems identical.
Perhaps it is that bike wheels are quite small and poi travels in a wider arc, perhaps the poi is a higher resolution.
Or perhaps I made some error in image preparation/coding!
Not sure - I might look into it. I never really felt like I got the same image quality as the photos on the first page of this thread.
The esp8266/apa102 combination I was using limited me to 200 slices per revolution at the speeds I was rotating the wheels at.
Anyway the piece was largely successful - visitors could hand crank the four bike wheels and another bike (out of shot) also with spoke pov turned the pixel curtain on when it was pedalled.
Thanks again.
 
Last edited:
That looks really nice. I think that the photo is great. Did you use a hall sensor?

Image visual quality is definitely linked to pixel density in the x plane, and so slice density. The DNA image in the 2nd post is 150 slices repeated six times for each rotation, so 900 slices of image total per rotation compared to the 200 you were using, and at 0.5sec per rotation. But then, I think that visitors will not have noticed, too busy going "wow".
 
hi gaspav , ur project looks cool. i really love it :) . been trying for ages to write a code with a hall sensor for my pov globe. is there any chanses to get a copy of ur code? if u needed u can send to my email
best regards
 
Last edited:
I used reed switches and magnets as opposed to hall sensors but the code should be pretty much the same.

In setup I timed how long it took to draw a complete image then in the main loop I timed how long it took for the last complete revolution.
I took the the first value from the second and divided it by the number of slices to get the variable delay.

I've attached the code FWIW but if you can't work out how to code it yourself I'm not sure it will help you much as it has a bunch of other stuff in it, is written for a different board and is poorly organised and not cleaned up.

I'll have a play with the slice density and see what it looks like. Yeah it didn't really make alot of difference to the general public.

The main problem was the chains kept bloomin' coming off!
 
Last edited:
Back
Top