Persistence of Vision Christmas Ornament

8,514

134

6

Introduction: Persistence of Vision Christmas Ornament

About: I'm a content creator. I make open source projects and videos for said projects. My goal is to create free and open knowledge for everyone.

As you can tell from my list of instructables, each year I try to come up with a new and interesting Electronic Christmas Ornament. They are usually loud, heavy, and something generally too big for the average tree, with that in mind I had the perfect idea. A loud, fast spinning, bright, persistence of vision LED display the size of an ornament. That way you could make it look like any ornament you want. Or put cool images on it. I had the idea, now I just had to make it.

Step 1: Watch the Video!

Its long, its detailed, it fills in a lot of the stuff I will probably forget here. I figure if you're interested in building one, its a great place to start!

Step 2: Gather the Parts!

Parts:

  • Slip Ring (Digikey or Adafruit)
  • LED Strip (Digikey or Adafruit)
  • DC Motor 10:1 Gear Ratio (Pololu)
  • Magnetic Motor Encoder (Pololu)
  • Circuit Board (Kicad Files)
  • Circuit Board BOM (FindChips or GitHub)
  • Black PLA Material
  • Rubber Oring Kit (Amazon)
  • Aluminum (Optional)
  • Wires
  • M3 and M2 Threaded Insert (McMaster Carr)
  • M3 x 6mm Screws
  • Strong Double Sided Tape

Tools:

  • 3D Printer
  • Reflow Oven
  • Screwdrivers
  • Soldering Iron
  • JST Wire Crimp (Optional)

Step 3: The Design

I've already done this part for you, so you can just download the STL files and go with it.

The idea of this design is to have a hollow ring that is nearly invisible(you'll see why later), and then mount the LED strip to that ring. It will reduce the weight and also cause a cool effect while its spinning. The ring will be coupled with the DC motor via a rubber oring. I suggest getting an oring kit to have a number of different sizes so you can find one that works well for you. I did this design in Fusion 360.

The device at the focal point of this design is a slip ring. The slip ring allows the wires to pass through and continuously spin without them ever getting tangle up. They're pretty interesting devices, and I have wanted to use one in a project for some time.

Step 4: Order the PCBs

While I can provide a link to the PCBs where I ordered them. I strongly encourage you to open and view the KiCad files for yourself, and make your own Gerbers. Do your own checks of the PCB to make sure there are no issues.

Find them on the GitHub.

Step 5: Start the 3D Prints

At this point, I like to start the 3D prints so that they can print while I plan other stuff out. While the parts are printing you can move on to the next step. Or just watch them print, if you're one of those "watch paint dry" type of people. No judgement here!

Step 6: Populate the PCBs

There is some surface mount soldering. As i've mentioned in my other instructables, surface mount soldering is not that big of a deal, and its actually a pretty small leap to get into it. Requires a few more tools like a cheap toaster oven and some tweezers. But in the end it will save you lots of time! Much faster than hand soldering.

Note* - If you don't want to solder a small APA102 on the circuit board, you can bypass it(on the board), but they strip may behave differently.

Step 7: Machine the Pulleys (Optional)

I like to look for reasons to use my lathe and milling machine. Both of these machines are works in progress, but they work fine for these little projects that don't take a lot of precision. I made the two pulleys for the belt drive system thinking it would make it a little smoother. Turns out it probably wasn't necessary (feel free to just 3D print them), however I love the look of my own machined parts, so totally worth it for me.

Step 8: Wire the Slip Ring

Using the slip ring, we will only need 4 of the 6 wires available. Unfortunately you will have to cut two of the wires short or they will be in the way, so they won't be much use if you want to use this in a different project. The wires need to be soldered on the LED strip after it has been installed. And once they have been soldered, you cant really remove a few components.

On the stationary part of the slip ring I crimped on a JST connector. If you don't have this crimping tool you can just solder them directly to a premade wire that has been cut in half. Refer to the schematic for proper wire position. 5V -> Data -> CLK -> GND.

Make sure you put on the appropriate oring before soldering!

Step 9: Stick on the LED Strip

Use double sided tape to stick the LED strip to the ring. Make sure you attach the LEDs to the thin side, the thick side is for balancing the ring.

Step 10: Install Motor, Slip Ring, and Threaded Inserts

If your 3D prints are done, first thing to do is install threaded inserts. These are common to a lot of my projects and super useful to have around so you may find yourself buying them in bulk. You don't need a fancy tool, but I made my own to fit my Hakko soldering iron (video here).

You can also screw in the slip ring and motor. Pretty straight forward.

One of the changes I may make in V2, is to get a motor with a right angle adapter on it. This would save a lot of space.

Step 11: Assembled?

Assembled.

Step 12: Time to Program!

As with most of my projects, the programs aren't very polished. They're usually just stepping stones for you to use to get the device working.

I have a couple of demos, one of them will just display a bunch of images of your choosing. The other you can connect the ESP32 to your network, from there you can access a web page and control which number of the image you want to show on the device.

Strongly encourage watching the video if you have questions about these.

Step 13: Make Your Own Images!

Again this is a step that is best shown on the video.

The ornament firmware is setup to display 60x17 images (one of the LEDs is at the top and doesn't spin so its really 60x16). So in order to make an RGB matrix of an image you must first make a 60x17 image. Then I have a python script that will convert it into something readable in the Arduino Code. Once made you can copy and paste the matrix into your code and give it a unique name.

Step 14: Interact With the Internet!

Now you can write your own firmware(or programs to interact with your firmware) and do different things on your ornament. I setup a live stream and had it display an upvote any time someone upvoted this thread! That was fun. Check out the live stream.

Have fun with your new ornament, but as with most electronics and DIY things, don't leave them on while not attending them, you have been warned.

Step 15: Enjoy Your New Ornament.

Just don't leave it plugged in while you're not home. :)

Step 16: Support Future Projects

Thanks to my Patrons I'm able to make these projects and put out the information for free. If you think I deserve it, please consider becoming a patron.

SeanHodgins on Patreon

It also helps if you can like and share my content. Please subscribe to my Youtube channel and click the notifications so you know exactly when a project is released.

Click here to Subscribe!

Anything Goes Contest

Participated in the
Anything Goes Contest

Be the First to Share

    Recommendations

    • One Board Contest

      One Board Contest
    • Fix It Speed Challenge

      Fix It Speed Challenge
    • Jewelry Challenge

      Jewelry Challenge

    6 Comments

    0
    ririfonfon10
    ririfonfon10

    Tip 1 year ago

    you can simplify your code like this :

    void setImage(int imageNum) {
    for (int i = 0; i < 1020; i++) {
    for (int j = 0; j < 3; j++) {
    if (imageNum) == 1
    imageBuffer[i][j] = swirl2[i][j];
    int sumRGB = swirl2[i][0] + swirl2[i][1] + swirl2[i][2];
    else if (imageNum) == 2
    imageBuffer[i][j] = twitter[i][j];
    int sumRGB = twitter[i][0] + twitter[i][1] + twitter[i][2];
    else if (imageNum) == 3
    imageBuffer[i][j] = sh[i][j];
    int sumRGB = sh[i][0] + sh[i][1] + sh[i][2];
    else if (imageNum) == 4
    imageBuffer[i][j] = youtube[i][j];
    int sumRGB = youtube[i][0] + youtube[i][1] + youtube[i][2];
    else if (imageNum) == 5
    imageBuffer[i][j] = upvote[i][j];
    int sumRGB = upvote[i][0] + upvote[i][1] + upvote[i][2];
    else if (imageNum) == 6
    imageBuffer[i][j] = patrons[i][j];
    int sumRGB = patrons[i][0] + patrons[i][1] + patrons[i][2];
    else if (imageNum) == 7
    imageBuffer[i][j] = redstrip[i][j];
    int sumRGB = redstrip[i][0] + redstrip[i][1] + redstrip[i][2];
    if (sumRGB < 30) {
    imageBuffer[i][j] = 0;
    }
    }
    }
    }

    sorry for my bad english ,
    i m french man

    0
    burzurk
    burzurk

    1 year ago

    VERY clean build.Nice work.

    0
    2403366
    2403366

    1 year ago

    why does it have soooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo many steps

    0
    ivymaker
    ivymaker

    1 year ago

    Even though Christmas went by. THIS IS SO AMAZING!!

    0
    Nikolaos Babetas
    Nikolaos Babetas

    1 year ago

    Great work! I checked your YT channel and I have to say that your videos are awesome! My favourite one is the Ornament 3D Printer! You just got a new sub!