Telescope Flat Field Panel

Telescope flat field panel
Flat Field Panel for a 12" LX600 Scope

Flat fields are necessary, but are difficult to squeeze in if you rely on twilight as a source. A flat field box is a handy contraption that allows you to create your flat fields any time during the night, but it can be bulky and fragile. To get around some of the bulk, I decided to try an EL panel. The panel I chose was the 14.14" circular panel from It is just the right size for the 12" f/8 ACF with its tube front outside diameter of 13-5/8". The flat frame kit cost $130.00 with tax and shipping, and comes with an inverter and a battery holder for 8 AA cells. The EL panel is an improved version of one that has been around for a while. The phosphor is treated to resist light aging a little better than the old ones. More on aging at the bottom. The new one has a rubber boot over the AC connections, where the old one had electricians tape. ellumiglow makes panels in 14", 10", 8", 5", and 2" round.

The small inverter, dubbed the "Jumbo Inverter", converts 12VDC into 104VAC. Lowering the inverter input voltage causes the panel to shift toward cyan or blue, whereas when powered by 12V it is almost white. Because of the color shift, I decided not to try to dim it, but went with full brightness. I added a pair of diffusers and an ND filter to help even out the light and dim it a bit. The surface of the EL panel is smooth and even, but when lit it shows a very fine graininess. The diffusers take that out, where the ND filter merely dims - it does not diffuse at all.

Telescope flat field box mechanics
Conceptual Drawing


  1. 1/2" plywood with 13-3/4" cutout
  2. 1/8" Clear Plex
  3. Mylar Diffuser
  4. 2mm Black foam sheet (with cutout)
  5. Mylar Diffuser
  6. 1/8" Clear Plex
  7. 2mm Black foam sheet (with cutout)
  8. EL Panel
  9. 2mm Black foam sheet
  10. 1/2" plywood
Telescope flat field panel with ND filter
Flat Field Panel with ND Filter

The unit is 16" square, made from two pieces of 1/2" plywood with a 13-3/4" hole in the front part. Assembled from the back panel forward, I put the four screws in and then added a full sheet of 2mm neoprene foam to protect the EL panel from the hard plywood. Then a 2mm foam piece with a 13-3/4" hole holds the EL panel down. A piece of 1/8" plexiglas goes on top of that to protect the diffusers from any unevenness in the foam below. On top of that is a diffuser (matte mylar drafting film), another piece of foam with a hole in it, and a second diffuser with an ND filter on top. Another piece of 1/8" plexiglas protects the diffuser from the end of the scope tube. The front piece finishes the stack, and the four knobs hold it all together.

I didn't go with a translucent white plexiglas because I didn't know where to start. With the mylar I can add or remove sheets to change the diffusion. I also added an ND 1.2 filter to dim it to 1/16 brightness. The luminance exposure time for 2x2 binning was 0.125 seconds, and that means the shutter spends a large fraction of the exposure moving across the CCD. Exposures are now 3 seconds for L, and 10 seconds for R, G and B filters.

I know that some have had trouble with spectral response of EL panels, but I haven't seen that. The luminance, having a clear filter, gets 100% of the flux and for that I had to use a shorter exposure. The RGB filters each pass approximately 1/3 of the flux, so I used a single exposure length of 10 seconds. The average levels are:

  • L = 39954
  • R = 38985
  • G = 33553
  • B = 30322

Reasonably close to one another and certainly all in the area where the math works well. It could be the brand of panel. It could also be the Edmund LRGB filters I'm using. I hear it is a different thing for one-shot color or a DSLR, since the response is different for each color of pixel, but the exposure length must of course be the same.


A little box with an Arduino Nano and an IRFZ44N MOSFET allows the computer to control the light using the Alnitak Generic Commands spec from Optec, Inc. The controller has to handle all of the commands, because Indi will try to open the lid before making normal images then close it and set the brightness to make flats and darks. Some response is required to each command, even though the actual functions are not implemented. For instance, when commanded to open or close, it responds that it has completed the task, and updates the status to reflect that, but takes no real action.

#define LIGHT_CTL 2

#define OFFSET_COVER 2
#define COVER_CLOSED '1'
#define COVER_OPEN '2'
#define COVER_TIMED_OUT '3'

#define OFFSET_LIGHT 1
#define LIGHT_OFF '0'
#define LIGHT_ON '1'

#define OFFSET_MOTOR 0
#define MOTOR_STOPPED '0'
#define MOTOR_RUNNING '1'

#define PROD_FLAT_MAN_XL "10"
#define PROD_FLAT_MAN_L "15"
#define PROD_FLAT_MAN "19"
#define PROD_FLIP_MASK "98"
#define PROD_FLIP_FLAT "99"

#define CMD_PING 'P'
#define CMD_OPEN 'O'
#define CMD_CLOSE 'C'
#define CMD_LIGHT_ON 'L'
#define CMD_LIGHT_OFF 'D'
#define CMD_STATE 'S'
#define CMD_VERSION 'V'

char status[4];
char product_id[3];
uint8_t version;
uint8_t inbuf[6];
uint8_t outbuf[9];
uint8_t incursor;
char brightness[4] = {"000"};
bool in_read;

void setup() {
    strcpy(product_id, PROD_FLIP_FLAT);
    pinMode(LIGHT_CTL, OUTPUT);
    digitalWrite(LIGHT_CTL, LOW);

void loop() {
    uint8_t ch;

    if (Serial.available()) {
        ch =;
        if (ch == '>') {
            // Start character received.
            incursor = 0;
        inbuf[incursor++] = ch;
        if (incursor == sizeof(inbuf)) {
            incursor = sizeof(inbuf) - 1;
        if (ch == 0x0a || ch == 0x0d) {
            // End character received.
            memset(outbuf, 0, sizeof(outbuf));
            switch (inbuf[1]) {
                case CMD_PING:
                    sprintf(outbuf, "*P%s000\n", product_id);
                case CMD_OPEN:
                    status[OFFSET_COVER] = COVER_OPEN;
                    sprintf(outbuf, "*O%s000\n", product_id);
                case CMD_CLOSE:
                    status[OFFSET_COVER] = COVER_CLOSED;
                    sprintf(outbuf, "*C%s000\n", product_id);
                case CMD_LIGHT_ON:
                    status[OFFSET_LIGHT] = LIGHT_ON;
                    digitalWrite(LIGHT_CTL, HIGH); 
                    sprintf(outbuf, "*L%s000\n", product_id);
                case CMD_LIGHT_OFF:
                    status[OFFSET_LIGHT] = LIGHT_OFF;
                    digitalWrite(LIGHT_CTL, LOW);
                    sprintf(outbuf, "*D%s000\n", product_id);
                case CMD_SET_BRIGHTNESS:
                    memset(brightness, 0, sizeof(brightness));
                    strcpy(brightness, inbuf+2);
                    sprintf(outbuf, "*B%s%s\n", product_id, brightness);
                case CMD_GET_BRIGHTNESS:
                    sprintf(outbuf, "*J%s%s\n", product_id, brightness);
                case CMD_STATE:
                    sprintf(outbuf, "*S%s%s\n", product_id, status);
                case CMD_VERSION:
                    sprintf(outbuf, "*V%s101\n", product_id);
            if (strlen(outbuf) > 0) {
                Serial.write(outbuf, strlen(outbuf));
Telescope flat field image
A Flat


I put the flat fielder on the end of the scope at dusk and run a job that includes any needed darks, and the flats for the entire evening, then pull the flat fielder and start the imaging as a separate sequence. It is done that way because Indi will "open the lid" after the calibration frames are made and start the imaging sequence, and that doesn't leave me any time to get the flat panel off the scope. There is probably a way to script around that, but I'm not sure it would be any better unless it could text me when the flats were done.

The flats are the best I've had, and easy to make, but all I really have to compare them with is a white T-shirt over the end of the tube. I do LRGB so can't speak from experience how the panel works for narrow band filters, but I have heard EL panels in general aren't bright enough for narrow band filters.

A cautionary note: As weird as it sounds, EL panels are sensitive to light. It bleaches the phosphor. They age in direct or indirect sunlight, florescent lights, white LED light bulbs, or even their own light. A panel is good for about 2,000 or 3,000 hours, which is more than I will ever need, but it could be as little as 1,000 hours if exposed to enough light. They also discolor, as the red goes away first, leaving the light very cyan. I have experience. My first panel was inadvertently exposed to the direct light from a standard 6 watt LED light bulb off and on for quite a few weeks, and now gives off a cyan light with speckles of blue. I keep it around for testing. The new panel is protected from light when stored. I treat it like a piece of unexposed photographic film.