The author has started a new hobby/obsession: fountain pens, ink, and paper. Part of this is an effort to improve his handwriting. A part of this is handwritten letters to and from penpals. This may be a little out of place, maybe, for someone so immersed in technology, but in many ways it's because of it rather than in spite of it, trying to get away from the screen occasionally and doing something more artistic. There's something almost magical about your words taking form under the tip of a pen skating across a page.

Therein lies the problem: not only is my handwriting well out of practice, so is the ability to write in a straight line. The usual solution is to place a heavily lined ruled guide sheet under your paper. The problem is that with good paper, it's not always very visible. Technology to the rescue! Oh the irony.

This guide describes how to build what's commonly called a light table. It places a light behind the guidesheet and writing paper, making it much easier to see the lines through the paper. Light tables are also handy for slide photography, tracing, and reading film x-rays!

You can buy a simple one fairly inexpensively, or a professional quality one for much more. But that's not what Makers do; we build our own!

This guide uses the Feather nRF52840 Express as the controller for the project. It provides plenty of processing power to work in CircuitPython and, more importantly, it has a solid Bluetooth capability.

In addition to being able to 3D print the pieces (or have them printed), you'll need some basic soldering skills: soldering wires and attaching headers. You should also be comfortable working with superglue as it is used extensively to assemble the frame.


The parts required are listed below. 

Angled shot of a Adafruit Feather nRF52840 Express.
The Adafruit Feather nRF52840 Express is the new Feather family member with Bluetooth Low Energy and native USB support featuring the nRF52840!  It's...
Out of Stock
Hand flexing NeoPixel RGB Neon-like LED Flex Strip with Silicone Tube
No joke, we have been looking for this exact product for over 5 years, and we've finally got the perfect one in stock! You love NeoPixels, and you love silicone diffusion? Peep...
In Stock
Prototyping feather wing PCB with loose headers
A Feather board without ambition is a Feather board without FeatherWings!This is the FeatherWing Proto - a prototyping add-on for all Feather boards. Using our...
In Stock
Wall wart power supply with 2.1mm DC output.
This is a really nice power supply. It's a switching DC supply so it's small and light and efficient. It is thin so it fits in power strips without blocking other outlets. The...
Out of Stock
1 x 5V 1.5A Linear Voltage Regulator - 7805 TO-220
Takes 7 to 35 volts and outputs 5 volts
1 x Panel Mount 2.1mm DC barrel jack
Designed to easily attach to a panel up to 8mm thick (0.315" or 5/16") and fit 2.1mm power plugs
1 x Female headers
Header Kit for Feather - 12-pin and 16-pin Female Header Set
1 x Hook-up Wire Spool Set - 22AWG Solid Core - 6 x 25 ft
For connecting the power jack to the board.
1 x USB Micro-B Breakout Board
This board has a USB Micro-B connector with all 5 pins broken out
1 x 1000uF 25v Electrolytic Capacitor
Capacitor used to soften the startup surge to the LED strip.
1 x M2.5x5mm
Machine screws to attach the Feather.
1 x Acrylic sheet for the top
Acrylic White Sheet, Translucent 55%, 12" x 12", 1/8" Thick

Additionally, you'll need some superglue to assembly the 3D printed pieces.

Only a few parts are required since the Feather has much of the functionality built-in.

There are three sections.


The entire circuit is powered through a 2.1mm DC barrel jack to which you connect the 12v power supply. As is best practice with a longer NeoPixel strip, there is a 1000 microFarad capacitor between 12v and ground. This reduces the initial sudden surge of voltage that can cause damage to the NeoPixels.  Unlike most NeoPixel products, the strip used in this project is powered by 12v. The filtered 12v is attached to the strip. The Feather, however is powered by 5v. To accomplish this we need to use a 5v regulator as shown.


The power for the "neon" NeoPixel strip is, as mentioned, connected to the 12v. The data-in of the strip is connected to A0 on the Feather.


For flexibility and ease of mechanical design, the Feather's USB connection isn't directly exposed. Instead, an extension is made using a micro USB jack breakout, a DIY Micro USB plug, and a 10mm (4in) piece of 5-wire ribbon cable. This is cut from the 10-wire ribbon cable listed. The easiest way to get the connections right is to insert the plug into the socket and check the connectivity as you go.

CircuitPython is a programming language based on Python, one of the fastest growing programming languages in the world. It is specifically designed to simplify experimenting and learning to code on low-cost microcontroller boards. Here is a guide which covers the basics:

Be sure you have the latest CircuitPython for the Feather nRF52840 Express loaded onto your board, as described here

CircuitPython is easiest to use within the Mu Editor. If you haven't previously used Mu, this guide will get you started.


Plug your FeathernRF52840 Express board into your computer via a USB cable. Please be sure the cable is a good power+data cable so the computer can talk to the Feather board.

A new disk should appear in your computer's file explorer/finder called CIRCUITPY. This is the place we'll copy the code and code library. If you can only get a drive named FTHR840BOOT, load CircuitPython per the Feather guide above.

Create a new directory on the CIRCUITPY drive named lib.

Download the latest CircuitPython driver package to your computer using the green button below. Match the library you get to the version of CircuitPython you are using. Save to your computer's hard drive where you can find it.

With your file explorer/finder, browse to the bundle and open it up. Copy the following folders and files from the library bundle to your CIRCUITPY lib directory you made earlier:

  • adafruit_ble
  • adafruit_bluefruit_connect
  • neopixel.mpy

All of the other necessary libraries are baked into CircuitPython!

Your CIRCUITPY/lib directory should look like the snapshot below.

The code

It starts by setting up the NeoPixel and Bluetooth drivers. The main loop waits for a connection (typically to the bluefruit app). Once it has a connection, it repeatedly listens for a color command. When it receives such a command, the NeoPixels are updated. If the connection is lost, the inner loop exits and the outer one tries to re-establish a connection.

# SPDX-FileCopyrightText: 2019 Dave Astels for Adafruit Industries
# SPDX-License-Identifier: MIT

Lightbox driver program.

Adafruit invests time and resources providing this open source code.
Please support Adafruit and open source hardware by purchasing
products from Adafruit!

Written by Dave Astels for Adafruit Industries
Copyright (c) 2018 Adafruit Industries
Licensed under the MIT license.

All text above must be included in any redistribution.

import board
import neopixel

from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from import UARTService

from adafruit_bluefruit_connect.packet import Packet
from adafruit_bluefruit_connect.color_packet import ColorPacket

pixel_pin = board.A0
num_pixels = 20

pixels = neopixel.NeoPixel(pixel_pin, num_pixels)

ble = BLERadio()
uart = UARTService()
advertisement = ProvideServicesAdvertisement(uart)

while True:
    while not ble.connected:

    # Now we're connected

    while ble.connected:
        if uart.in_waiting:
            packet = Packet.from_stream(uart)
            if isinstance(packet, ColorPacket):
                # Change the NeoPixel color.


If you don't have access to a 3D printer, you can use a service like 3D hubsmakeXYZ and shapeways. Adafruit also carries 3D printers in the online shop. We suggest also checking your local library, makerspace, or school.

Monoprice Inventor II 3D Printer with Touchscreen and WiFi
The Monoprice Inventor II 3D Printer Touchscreen with WiFi is a perfect entry-level 3D printer with small footprint and reliable performance. It comes equipped with...
Out of Stock
Filament for 3D printers in various colors and types stacked together.
Having a 3D printer without filament is sort of like having a regular printer without paper or ink.  And while a lot of printers come with some filament there's a good chance...
Out of Stock

The Pieces

The frame is made in 4 identical parts. Print 4 copies of lightbox.stl. Orient it when you slice so that the latticed surface is on the print bed. You shouldn't need supports, although the USB breakout opening will require some degree of post-print cleanup.

The top acrylic panel is attached to the frame using 8 clips: 4 for the corners and 4 for the sides. Slice the side clips on their side so no support is required. Slice the corners on their tops and use support from everywhere so that where the panel sides in is filled with support material. It will need to be carefully removed after printing.

The final pieces are the clips that are used to hold paper in places. You will need at least two of these for the top of your paper, and if using a letter size or A4 paper, a couple on the bottom are a good idea as well.

You'll also need a mounting tray for the Feather board. You can get that from Thingiverse.

Power Circuitry

As shown above, the capacitor and regulator can be mounted and wired on an Adafruit Feather Proto-Wing. 12v and the NeoPixel strip are also connected to the wing.


Above you can see the USB and Power jack attached to the case. The USB breakout fits snug enough that you may not need anything further. If not, a couple drops of super glue will fix it in place. A 2-wire JST connector was used to make installation easier. The power wires are a little thinner than might be ideal, but it works. The matching connector/wires are used to connect power to the wing.

Mounting the Feather

The feather is attached to the printed mounting plate with the M2.5 screws. Metal ones are listed, but if you have a set of nylon ones, they'll work as well but might take a bit more effort to get threaded. Attach the tray to the frame (as shown in the image below) with some superglue.

Black Nylon Screw and Stand-off Set with M2.5 Threads, kit box
Totaling 380 pieces, this M2.5 Screw Set is a must-have for your workstation. You'll have enough screws, nuts, and hex standoffs to fuel your maker...
In Stock

Assembling the Frame

First, use superglue to attach the Feather mounting plate to the frame near the power and USB connectors. Once that has set, carefully glue the four frame pieces together.

It works well if you glue pairs of pieces together, being careful to get everything lined up exactly. Then take the two frame halves and glue them together. You'll notice that one of the pieces shown is different. It was a previous iteration of the design but was functionally the same. No point wasting it.

Adding the Strip

The strip can be attached to the lattice of the frame with drops of superglue. Coil it loosely so as to get the light spread throughout the space.  It's a good idea to connect it to the controller first to ensure that the wired end is close enough to be connected.

This is a good time to load the code onto the Feather if you haven't yet. This will also ensure that the USB jack is securely mounted and won't get pushed out of place if you later try to plug into it.

Final Assembly

Use the corner and side mounting pieces to attach the acrylic plate. This can be a little fiddly.

Start by fitting the corner pieces onto the plate. The slot the plate fits into will be filled with support material and has to be well cleaned out. Test the fit as you go and clean out what you need to in order to have the plate fit smoothly all the way in. It needs to go all the way into the corner.

The side pieces print without support so they shouldn't present any problem.

With all mounting pieces on the plate, gradually work the pieces into place on the frame with the side pieces centered over the joint between the pieces of frame. This serves to strengthen the frame. You will likely need to carefully tap the corner pieces onto the frame a little at a time, going from corner to corner.

Holding Paper in Place

To trace or write, you need to secure what you are working with. The clips take care of that. They are designed to slip over the edge of the acrylic plate and exert a slight pressure. Use them to hold the template and paper in place by carefully slipping them over the plate and papers as shown above.

Shown above is a piece of stationery over a piece of vellum with guidelines printed on it. With the back lighting the lines show through nicely.

Setting the Color

You can use the Bluefruit LE Connect app on iOS and Android to control your lightbox. There's a guide to get it up and running and talking to your lightbox. Specifically, you'll be using the color picker feather of the app. See the bottom of this page in the guide.

Set the color such that your light strip illuminates your workspace to the color and intensity you like.

This guide was first published on Apr 17, 2019. It was last updated on Apr 17, 2019.