Neoboard Lamp - No SD Needed and 3D Printed
by dmtinkdev in Circuits > Arduino
4839 Views, 80 Favorites, 0 Comments
Neoboard Lamp - No SD Needed and 3D Printed
After building a Minecraft lamp for my 7 year old kid, his little brother wanted something similar. He is more into SuperMario than into Minecraft, so his night light will show videogame sprites.
This project is based on The Neoboard project, but parts can be 3d printed and the arduino doesn't need an SD card to read the images (they can be stored inside the flash memory).
Supplies
- 1x arduino board (Uno or Nano are fine)
- 2x filament (black for the main body and transparent for the diffusers). Even if you want a different color for your stand, you'll still need black filament for the led separators part. I've used PLA.
- 1 push-button
- 1 300-500 ohms resistor (for the data input pin of the strip)
- 1x 1000 µF capacitor (to protect the strip from sudden changes in corrent)
- 1 16x16 leds matrix panel
- Typical maker materials (glue, dupont wires, self-solder connectors, M4 screws, etc)
Download the Code and Process Your Images
You can get the code from the GitHub repository.
There are already Platformio profiles for the Arduino Uno and Nano boards inside.
To process the images we'll use Processing (either the GUI or the cli-tool will work). The processing code will read a 16x16 image, and convert all the pixels colors to an uint8 array sorted how typically the led matrix are connected.
In 99% of the cases to correctly process your images you'll only need to:
- Change the value to the inputFilename and outputFilename variables
- Copy the content of the outputFilename file and past it inside /src/sprites.h
Inside the arduino code you'll also need to change
- The values for LEDS_PIN,BUTTON_PIN and TOTAL_SPRITES
- Perhaps the led type in the strip constructor... but shouldn't be common
- And the 'switch' inside the changeSprite() function to show all your images
As you see in the declaration of the arrays, we are using the PROGMEM keyword to store the data in flash instead of SDRAM. This way, we don't need an SDCard to store the images color information.
As you can see in an image above, storing the code and 10 SuperMario images only needs around 11kbytes, so there's plenty of room for more images (and even more if you use a MEGA2650 board).
Print All the Parts
I've designed the parts using Fusion360. You can download them from:https://a360.co/2FUfcNQ
Or if you only want the STL files, they are available in Thingiverse: https://www.thingiverse.com/thing:4603619
The back cover is trivial to print, and the stand only needs supports (but depending on how you place it you'll need more supports or a printer/filament combination able to print large bridges).
For the diffuser originally I thought that using a smooth coated sheet and the Hilbert curve pattern was going to give the best results, but I've tested different combinations of layers, resolution, sheets and patterns and I got the best results using the transparent PLA filament from BQ with these settings:
- sheet: powder-coated sheet
- layers: 3
- resolution: 0.2
- pattern: rectilinear
But, depending on your filament, the manufacturer of the leds in your matrix, the distance from the diffuser to the led and if there's complete separation between your leds your results may vary. Don't ask me why I've become an expert in this micro-niche :)
I've used the PrusaSlicer option to manually change the color during a print to switch between transparent and black filaments, so I have the diffuser and the led separator in one part (no need to glue them).
Connect Everything
Connecting all the parts couldn't been easier: power the board and led matrix with a 5V USB cable, and connect the push-button and the strip input to the designated board ports.
Remember that to avoid damaging the matrix, it's recommended to add a capacitor and a resistor to it's connection.
If everything is done correctly, you'll see a happy penguin in your matrix :)
To check that everything works well:
- The image should have a blue gradient blackground
- The corners have green arrows
- The bottom-left corner arrow has is extended with 2 red pixels