The Elroy Lamp: A transparent LCD table lamp

Elroy is a table lamp with a unique feature — the shade can dynamically change, at the swipe of a finger, to a new style or pattern to complement your mood, the time of day, or an event, all from your phone or web browser.

Elroy is a concept and personal DIY project. I’ll share some learnings and details on how I built it. These aren’t step-by-step instructions, but I hope they’ll be helpful to anyone that’s inspired to build their own design.


Elroy is essentially a computer with a 4-way display, backlit by a bright LED bulb. The four sides of the lamp shade are made from translucent LCD displays, and acrylic and paper diffusion layers. The light source is a very bright 35W LED bulb. The displays are driven by a single board computer running Linux and custom software to display and manage images. The lamp is controllable over wifi via a simple web app.

Translucent LCDs

I salvaged some 13” LCD displays from old laptops and found additional matching displays on ebay. I disassembled each display, removing the frame, backing layer, diffusion film, and backlight. This took some practice to get right. The LCD glass is quite fragile. I broke 2 panels during disassembly and had to find replacements. The trick is to remove the electrical tape that holds the display together without flexing the LCD glass so much that it cracks.

What’s inside? From top: 1) A shiny white paper layer to reflect the back light 2) a transparent polycarbonate sheet with a film to scatter the back light 3) a stack of different diffusion films 4) metal frame 5) the LCD glass panel with circuit board.
The backlight is a row of super bright LEDs tucked into a channel in the metal frame. Some other LCD panels use a cold florescent tube instead of LEDs.

The remaining LCD panel is translucent: LCD displays are a sandwich of transparent glass embedded with liquid crystals and tiny transistors, surrounded by layers of polarizing film. In the photo below, I wrote a message on a piece of letter paper, placed it on a clear piece of acrylic, on top of a bright backlight. You can see the LCD display on the right is translucent, but similar to a pair of sunglasses, the polarizing film only permits a fraction of the backlight to emit through the panel.

A message on paper.
Looking through the LCD panel.

Polarizing film is necessary for the function of an LCD display.

Lamp Light & Diffusion

Given the low amount of light emitted through the display, to create a sufficiently bright lamp, a very bright light source is needed. Also, though an LCD display is typically backlit by a light with a cold color temperature (around 5000K), lamp light is typically a warm color temperature (like 2700K). So the ideal bulb must be bright and warm.

A 4-bulb array I experimented with.
The gigantic 9″ long 35W LED bulb I chose beside an ordinary LED lamp bulb.

I experimented with multi-bulb arrays, and different bulb options, but settled on this 35W (300W equiv) LED bulb. This bulb is giant and takes up quite a bit of space within the shade. It’s bright enough that it shouldn’t be directly exposed — it would be uncomfortable (maybe dangerous?) to look at directly.

Next, without some work, the light from the bulb, when viewed through the LCD panels, would be a harsh point-light concentrated in the center. I wanted to diffuse the light evenly across the surface and produce a textured, fabric-like aesthetic. I experimented with different acrylic and polycarbonate sheets and paper materials.

Diffusion through mulberry paper.

Here’s one experiment result I really liked, but didn’t end up using. This is mulberry paper, which has a unique texture that’s simultaneously woody and linen-like, has nice diffusion properties, and transmits a lot of light. This looked great with black and white patterns and particularly complemented a Japanese lantern aesthetic. I felt like the large and non-uniform fibers didn’t work as well with a diverse set of patterns.

I found the best combination was this sandwich (starting from the inside):

  • Frosted acrylic 1/8″ 90% emission (film facing out)
  • Vellum tracing paper
  • LCD
  • Rice paper
  • Clear anti-glare polycarbonate 3/32”
Close up of lamp where texture is visible.

The acrylic and polycarbonate sheets also add some structure to protect the LCD glass from flexing and breaking. I wrapped the edges of each sandwich in acetate cloth electrical tape to keep the sheets together.


I needed a small SBC (single-board computer), capable of driving 4 displays. I happened to have an Nvidia Jetson Nano, which has DisplayPort 1.2 output with support for MST (multi-stream transport), which means it’s able to drive multiple displays. The Jetson Nano is a powerful, tiny computer that operates on 5V power and can run a standard Linux distribution like Ubuntu.

I wrote some custom software based on Pygame to display images, with a simple web app and server to give me control over the images.

The LCD panels take EDP (Embedded DisplayPort) video input. Each display required an adapter from DisplayPort to EDP. These adapters are bulky and have a lot of functionality I didn’t actually need, like 12V power and brightness control for a backlight (which I removed from each panel) and a control interface for display settings. I also needed an MST Hub to break out 4 DP ports from the 1 DP port on the Nvidia Jetson Nano. This configuration is something I think I could make cheaper and more compact in a future revision, but it worked great for this concept.


I designed the lamp structure in Rhino3D and chose to make wooden parts from walnut. This makes the shade rather heavy, but the lamp is stable with the walnut base.

The shade frame, glued-up, sanded, and ready to stain.

I cut all parts for the shade and base, then shaped them on a router table. I’m not an experienced woodworker, but this came together pretty easily. I had an adventure making tongue-and-groove joints for the first time. This is the 3rd time I’ve used walnut for a project and I always like the result.

The side-edges of the frame have brass threaded inserts that enable the top and bottom to attach via M2 machine screws.

3D Printed Parts

Most of the electronic components, including the power supply, SBC, MST Hub, switches, and wiring are mounted in a 4.5” square 3D printed “sleeve” that fits inside the walnut base. There is also a vented platform that connects the sleeve to the bottom of the shade.

Drawing of sleeve and vented platform. The sleeve was printed in 6 parts. The top of the sleeve peeks out 2 inches above the walnut base and houses the toggle switches.
The sleeve in 2 parts that fit inside the walnut base. In this photo you can see most of the main components. From the right: The DisplayPort hub, Nvidia Jetson Nano, and 5V / 12V power supply. The white cylinder on the left is a ceramic E26 light bulb socket.
The sleeve, ready to insert into the walnut base. I primed and painted the 3D printed sleeve. Only the top 2 inches is visible when the lamp is assembled, so the rough spots here aren’t a problem.

If I were building this lamp for production … or if I had access to the right tools, I’d want to make the sleeve and platform out of sheet metal to improve heat dissipation.

On top of the shade, I added a louvered cover. This enables the shade to emit additional light from the top, while obscuring the bulb, which is too bright to look at directly. This also permits heat to escape. I printed these parts out of translucent PETG, which has a higher plasticization temperature than some other common 3D printing filament materials. This isn’t strictly necessary because the surface temperature of the bulb doesn’t really get that hot. Even after hours of continuous use, the temperate is <130 degrees Fahrenheit.

Drawing of shade with louvers and vented platform.
The 3D printed louvered vent while the interior bulb is off.

Making it better

This lamp is mostly a proof of concept, but it works and looks good enough that I plan to keep it and use it. If I make another, I have a few ideas for improvement.

  • Sheet metal. Replace the 3D printed sleeve and vented platform with sheet metal to help dissipate heat.
  • Replace the DisplayPort MST hub and adapters. These take up a lot of space and add significant expense (~$250 for the hub and 4 adapters). One theoretical alternative is a DisplayLink adapter based on the DL-4100, which would drive displays over USB and support EDP. I haven’t been able to find such a device on the market yet. Another option to drive displays from USB3 would be to use an SBC with Displayport Alt Mode. I would still need to adapt Displayport to eDP. Adapter boards that do this are bulky and have a lot of components because they provide power and control to the backlight. Since I’m not using a backlight, I could make a simpler adapter that just maps pins for the different connectors.
  • Finally, reconsider the closed frame design. Elroy’s shade is basically a closed box. I made this choice  to obscure the bulb and hide some electronic components like the EDP ribbon cables and adapters. An open frame design might be possible. One idea is to backlight the panels with edge lighting so I can reduce or eliminate the high wattage bulb.




  • 1 X Nvidia Jetson Nano w/ SD Card

DC Power



  • 1 X Yasutomo Sulphite Pulp Unryu Paper Roll, Cut
  • 4 x Sheets, vellum paper
  • 4 X Frosted Acrylic 11 7/8″ X 6 7/8″, 1/8″, “90%”
  • 4 X Clear, anti-glare Polycarbonate, 11 7/8″ X 6 7/8″, 3/32”


Brain Puzzle

A few weeks back, I saw a great video from Maker’s Muse on YouTube, describing how to make custom 3×3 puzzles (eg. a Rubik’s cube) out of any 3 dimensional model. I’ve always been curious about how these puzzles work, so what better way to learn than to make my own?

Final puzzle. 3D printed and painted.

Yup. It’s a brain.

From brain scan to brain surgery

I started with this brain model from Thingiverse. These puzzles work best when there is good symmetry across X/Y/Z axes, so I scaled the model asymmetrically to improve its overall symmetry.

Scaled brain with deep folds and crevices.

I had to create a solid “core” for the model, because there is a large gap between lobes and several deep folds that would have made it impossible to divide the model into contiguous puzzle pieces. To create this core, I used MeshLab to create a “bubble shell“.

The bubble shell core.
Original model with bubble shell core.

Next, I took the union of the scaled model and core, then took the boolean difference with the 3×3 puzzle template from Maker’s Muse.

Model after boolean difference with Maker’s Muse 3v3 template applied. Each puzzle piece has chamfered edges to improve movement.

Models generated from 3d scans are often really messy and if they aren’t repaired, mesh operations fail. When I have problems with bad meshes, I often turn to Netfabb to repair the meshes and move on. It turned out that Netfabb’s “standard” repair operations weren’t good enough for this model. I had to use the full version for “extended” repair. I also used Netfabb for all of the boolean operations.

Final model with painted folds. This model would be very hard to solve if it monochrome.

When the modelling was finished, I printed all of the parts on a Prusa i3 Mk3 (about 24 hours of print time for one puzzle). I then sanded and primed the unassembled parts. I assembled the puzzle with springs and M3 screws. Finally, I painted the interior of the folds on each “side” with acrylic paint.

Final puzzle. Printed and painted.
Interior view of model. Pieces are centers, edges, or corners. Centers connect to a 6-side core (not pictured) with screws and springs.


  • It was great to get hands-on to really see how these puzzles work. It’s a very clever design. I really recommend this Maker’s Muse video to see more details on the mechanics.
  • The movement on this puzzle is good (not great). It particularly helps to apply silicone lubricant periodically.
  • This puzzle is a little harder than a 3×3 cube. Since there isn’t symmetry in the center pieces, their orientation matters.
Well, this is embarrassing. Somehow, this is the only photo I have of the puzzle unsolved.

Parametric Coral Tubes, Concrete Wall Sculpture

Final. Framed and mounted above fireplace.
Closeup. This piece looks most interesting from sharp angles.

Build process: Modeling.

Modeled 3 different tube shapes using Grasshopper in Rhino3D.
This will be a wall hanging, so this is the head-on rendering.
An angle view.
Another angle view.

Build process: Silicone molds.

Positives printed on Formlabs SLA printer.
For each part, I 3d printed a casting sleeve and interior structural support.
Hot glue was used to seal the sleeve seam and attach the sleeve to a smooth surface — hot glue seals well and is easy to remove. The sleeve and model positive were coated lightly with Vaseline.
Since the models have some deep undercuts, I cast with a high grade silicone resin (Tap Plastics Platinum Silicone Resin). This is a soft and tear-resistant resin.

Build process: Concrete.

I reused the sleeves and insert to improve stability when casting concrete.
I used Buddy Rhodes counter top grade concrete mix with a generous amount of Owens Corning reinforcement fibers. I typically mixed concrete for 6 molds at one time, making the mixture wet enough to flow. After fully mixed, I moved the mixture to a large plastic Ziploc bag, cut one corner, and piped into molds.

Build process: Mounting and framing.

After pouring about 60 parts, I stained a 24″ x 24″ plywood board. I marked the layout grid with chalk, and attached each part with epoxy.
I made a roughly 5′ x 5′ “frame out of 5.5” walnut boards, using dowel joinery.
You can never have enough clamps.
Photo of back of joined main piece and frame. They are attached with 20 dowels (photo is from a test, some only a couple of dowels are inserted).

A Bluetooth Mouse (for Cats)

Idea: My cat has a “bristle-bot” style toy, but it’s not a favorite. He’ll watch it as it wanders randomly around the floor, but he doesn’t really engage with a toy unless it “hides” — goes behind other objects so he can strategize about where it’s going to show up next.

The style of motion in these robots is kind of neat. There are no wheels. Instead, they operate with vibration.  There’s something insect-like about the movement.

Can I make a bristle-bot toy that I can control with my phone so my cat and I can have fun together? Yes… Well, I made a toy. I didn’t succeed in engaging my cat.

A Bluetooth Mouse for Cats in Lab-mouse White.I experimented with a couple of different designs. The parts list for this version includes:

  • Bluetooth controller (I used Redbear Labs’ BLE Nano)
  • 2 6mm 3v disc-style vibration motors for motion.
  • 2 LEDs for eyeballs and status indication (disconnect: flash, connected: solid).
  • A pair of transistors for switching current to the motors.
  • A small LIPO battery (150 maH).
  • A power switch.

The design also includes a 3d-printed mouse body and a custom PCB to keep everything compact.

Interior view.

The operating principle is that since vibration motors are mounted to the sides of the body, when a motor is engaged, the vibration will cause the legs on one side of the body to flex. If both motors operate at roughly the same frequency, engaging both motors simultaneously will move the mouse forward.

Bottom view. I left the bottom open for convenience while I was iterating on the design. I’ve also found that minimizing the amount of structure improves the amount of vibration transferred to the legs.

I designed parts in Rhino 3d with Grasshopper. I 3d printed parts with a Form Labs Form 2, using the standard Grey resin.

Render of 3d model, using transparency to illustrate 2 distinct parts: platform (with legs) and shell. 
Lights indicate bluetooth device is connected.
Sammy is somewhat interested in the mouse.


  • While the 2 distinct vibration motors offer some control over the direction of the mouse, it’s not particularly precise. It’s hard to steer around objects.
  • In practice, any vibration motors I tried seemed to be somewhat unbalanced (presumably operating at different frequencies), so motion is biased to one side.
  • Battery wiring initially took up a lot of space. I had to trim the leads from the LIPO battery a recrimp the JST connector.  This was a pain to learn how to do. The Engineer PA-09 Micro Connector Crimpers turned out to be the right tool.

Hopper for Cocoa Nibs / Liquor Extraction

Chocolate making is messy business. One of the steps in nib-to-bar chocolate making is to extract the liquor from the nibs. We use a Champion Juicer.

Inevitably, when you add nibs to the chute … a lot of them fly back up the chute and land all over the kitchen.

So I built this hopper and plunger system to help. It has three parts:

  • A collar that fits on top of the chute and enables nibs to be added perpendicular to the chute..
  • A hopper that holds about a cup of nibs that are gravity-fed into the collar and chute.
  • A extended plunger to push nibs down the chute.

To operate: Lower the plunger to cover the collar opening, add nibs, lift the plunger to open the collar opening and gravity-feed some nibs, lower the plunger when the chute is part-way full. No nibs should escape.

Rendering of distinct parts.

I printed the parts on a Form Labs Form 2 SLA printer. Form Labs doesn’t make a food safe resin (though they do make dental-grade resins). In fact, I’m not aware of any food-grade resins or filaments for 3d-printing. This is a topic the Internets have a lot of opinions about. I chose to coat parts in many layers of poly-urethane, which is food-safe when fully cured.

Mecanum Wheels

Mecanum wheels are cool. Each wheel is composed of a series of rollers, pitched at 45 or -45 degrees. When moving forwards and backwards, the rollers do not engage, but when the front and back wheels rotate in opposite directions, the rollers engage to move the vehicle left or right.

These wheels are 3d printed, except for machine screws and bearings.

Modeled in Rhino3d with Grasshopper. Model is parametric, so it’s possible to change number of rollers, overall size, etc, easily.
Wheel assembly: Rollers, bearings, machine screws, roller hubs, and stand offs.
Wheels were printed with a Form 2 SLA printer.
Rollers were printed on Replicator 2 FDM printer with “Semiflex” filament. Semiflex provided reasonably good traction on wood floors.

The vehicle in the video was as basic as I could make it. Electronics are an ESP8266 for control and 2 dual H bridge motor controllers. The ESP8266 has 9 usable I/O pins, just enough to control 4 motors if they share a PWM pin.

The 2nd ESP8266 you might see in the video is running ESPLink and acting like a WIFI serial port for remote code updates.

Some learnings from building:

  • This was my 2nd time using Ninjaflex and Semiflex. It’s a challenge to print, because it’s so soft that it easily flexes inside the filament drive of an FDM printer, instead of being forced down the thermal barrier tube. It requires some babysitting to catch issues. If I plan to use this a lot, I’ll look into modifying my extruder.
  • For the rigid parts, I used Form Labs Gray Resin, which is designed for prototyping. It has some nice properties. It cures easily and sands well. It was a bit brittle and since the bearings were “force fit” into place with pliers, I managed to crack some of the bearing holders during assembly. I fixed some of these by just applying some resin to the crack and curing under light.
  • I *may* have had trouble with some bearing holes due to bad tolerances from my curing process. To date, I’ve just washed my parts by dipping and sloshing in Yellow Magic and IPA, then curing in open air under a light intended for curing acrylic nails. Maybe it’s time to try an ultrasonic bath and underwater curing.

Some learnings about Mecanum wheels:

  • Motion in the video may look smooth, but if you look closely, you can see some bouncing. When driving, you can definitely hear “clacking” as the rollers come in contact with the surface. This suggests that each wheel is often losing contact with the surface, so the traction isn’t great. A larger number of rollers would help.
  • Mecanum wheels are known to operate poorly when the weight distribution of the vehicle isn’t uniform, or under too much weight. I experimented with adding up to 15lbs of weight to the vehicle and it definitely had problems. Particularly, side-to-side motion stalled or became erratic.

Xaar 128 Printhead Driver

The Xaar 128 is a piezoelectric inkjet printhead used in large format vinyl sign-making. It *might* be useful in 3d printing, conductive ink, or masking applications.

Why piezo? TLDR: Most inkjet printheads are “thermal”: They work by superheating a fraction of the ink in a chamber, turning it into gas, which expands to force the remainder of the ink out of a nozzle. Superheating limits the range of materials that can be used in these printheads. Piezoelectric printheads are less common, and since they use a mechanical operation to force fluid out of a nozzle, they don’t have to modify the state of the fluid to operate, and can work with a broader range of materials.

More details on the Rep Rap wiki.

Starter source code on GitHub.


  • While I planned to try some different materials with the Xaar 128, I started out with the Solvent Ink that it’s built for. I was mostly using used printheads that I could buy inexpensively on eBay, since new Xaar 128s are pretty expensive. Nozzle clogs were a big problem. I had to flush the nozzles every time I sat down to work. This wasn’t really compatible with an after-hours hacking schedule.
  • I used flexible flat cable (FFC or FPC) to connect my board to the printhead. I’ve been burnt by overflexing ribbon cable before, so I thought this was a good idea. But I didn’t properly anchor the connection points. After some use, I started getting erratic behavior and stalling from the printhead. After a lot of debugging, I found that the leads on one end of my cable had overflexed and would break contact at certain points in the movement. Lesson: anchor connection ends so that no flexing happens near the exposed leads.
  • I was never able to consistently push anything more viscous than solvent ink through the printheads. Epoxy or photo curing resin is much more viscous (eg. ~1000-2000+ cp vs ~10-20). This means these heads may be useful for something like depositing a low viscosity binder for powder printing, but probably not for depositing a material that can harden into a solid by itself. I’d love to find a printhead that can.

Boxen #1

Macro photo printed as a large format bitmap made up of 3d boxes in PLA Plastic, printed with Makerbot Replicator 2. Size: 6.5 feet X 2 feet.

Each “pixel” is a 3 dimensional box that tapers into a quadrilateral opening. The corners of the quadrilateral are determined by sampling the grayscale intensity of a grid of 9 subpixels within each box.

Example quadrilaterals, based on grayscale sampling

Inspired by “Bloom” from UC Berkeley.

Veronoi #3

Medium: PLA Plastic, printed on Makerbot Replicator 2 in 8 parts.

Modeled in Rhino3d with Grasshopper. Size of the veronoi part is 20″x20″. This was a super-challenging project to do with an FDM 3d printer, due to the large number of overhangs and small cavities. Each part took 10+ hours to print, but perhaps even more time to finish. I used a large amount of support material that was, at first a friend, then… a nightmare to extract and sand down.

Prototype part, before geometry was smoothed, shows volume of support material.
Support material removed. Rough sanded.
8 parts, primed and medium-sanded.
Original model.

Some learnings:

  • If a space is too small to get your fingers into, it’s going to be a bear to sand. I took a few breaks from this project because finishing was so tedious.
  • This project likely would have been much easier with access to a dual head printer with water-soluble filament or an SLA or SLS printer. When I started this in 2013, I didn’t have any access to such equipment and printing something this size with an online service would have been cost-prohibitive.
  • Solvent glue works great with PLA.
  • Makerware’s generated support is pretty good, but I could have saved myself a lot of time by modeling my own support for precarious overhangs and certain bridges. I had to throw away some prints and patch some gaps when Makerware’s support failed.