3D Printing
The first step in this project was to 3D print the plastic parts. I printed the cube at 1.5 times the original size which made the final dimensions 105mm on each side. I had to print it with supports for the holes and a brim to minimize lifting from the print bed. It took almost 18 hours to print it. After it was done printing I realized there wasn't good way to attach a base to the cube (other than glue) so I used OpenSCAD to add recessed corner posts with screw holes and reprinted it.
I used FreeCAD to design an insert that fits inside the cube. The LED strips sit in the channels and the electronics go in the square opening on the bottom.
Diffuser panels
With the 3D printing done the next step was to make some diffuser panels to go on the inside of the cube so you don't see the individual LEDs. I considered 3D printing the diffusers out of natural filament but that would have taken several hours. I had some scrap plexiglass in the garage so I cut out pieces to fit the top and four sides. I sanded both sides of the plexi with 80 grit sandpaper to make them opaque. I tested the diffusers with the LED flash light on my iPhone and they seemed to work pretty well.
Assembling and wiring the insert
The first step in assembling the insert was to cut and solder the LED strips. Adafruit Neopixel LED strips can be cut with scissors. There are cut lines printed on the strip between each LED. I designed the insert to fit three LEDs on each side and five on top. To minimize the number of jump wires I would need to solder I cut three strips and bent them around the edges.
I used the tip of my soldering iron to melt holes for the wiring to pass through to the center of the insert. With the strips set in place I soldered jumper wires onto the end of the LED strips, passing the wires through the holes so the wires were on the inside of the insert and not getting in the way of the LEDs. Then I used hot glue to attach the LED strips to the insert. The Neopixels are addressed by numbers starting with zero for the first LED on the strip so they need to be wired back up as a continuous strip. The strips are also directional so you need to pay attention to the arrows on the strips, wiring them so the arrows all face the same direction. I put a female header on the end of the of the strip wiring so I could plug it into the circuit board.
Breadboarding the control circuit
I hooked up the circuit on a breadboard to test it out before soldering. Controlling the LEDs only requires one digital pin. The BLE breakout board communicates over SPI.
Once I had everything wired up I loaded the Adafruit_NeoPixel strandtest example code to make sure all my LEDs were working correctly.
Soldering the control board
The two main components of the control board are the Pro Trinket microcontroller and the Bluefruit BLE breakout board. I decided to use headers so the microcontroller and BLE chip can be easily replaced if needed. I started with a half-size Adafruit Perma-Proto broad. To make the control circuit as compact as possible I placed the Pro Trinket on one side and the BLE board on the other. To do this I needed to cut the traces for a few holes. I used an X-ACTO to cut and scrape the traces. I used my multimeter to verify there was no continuity.
Cutting the traces on the Perma-Proto board |
|
|
I finished up the wiring between the microcontroller and BLE board and added some male headers for connecting the LEDs and power input. After that I used a Dremel to cut down the proto-board as small as possible.
Here is the finished control circuit.
Power switch and power input
Assembling all the parts
The insert was secured to the cube with countersunk head 4-40 screws. I added some stick on rubber feet and stuffed the control board in the square opening.
One mistake I made was using too much hot glue to attach the LED wiring inside the square hole of the insert. The extra glue caused the control board to protrude a couple millimeters. Not a huge deal but I would have liked the bottom to be completely flat. I had planned to put a cover on the bottom so I just designed it to account for the protrusion. I fired up FreeCAD again and whipped something up.
The cover was attached with pan head 4-40 screws.
Writing the code
For the Arduino code I started with Adafruit's nRF8001 echoDemo example. It basically does serial communication between the Arduino and an iPhone app.
Adafruit also provides a demo iPhone app called Bluefruit LE Connect. The app lets you interact with the BLE breakout board without having to do any iOS development.
After playing around with the color picker in the iOS app I saw it was sending RGB values formatted like this: !C180255
The exclamation point indicates a command, the next character indicates what kind of command, followed by red/green/blue values. This seemed like a good format for all of the commands I planned to send to the cube. I started planning out all the commands on my whiteboard.
One thing I hadn't worked with before on Arduino boards was EEPROM memory. I understood basically how it worked but hadn't actually used it in a project yet. Turn out to be very straight forward. On the Atmega328P chip there are 1024 possible EEPROM memory locations and you can store one byte of info in each location.
Here are the major features of my Arduino code on the cube:
- Set the whole cube to a single color
- Set the color of each side individually
- Activate animations (Pulse, Rainbow, and Cycle)
- Set a new BLE name on the cube and save it to EEPROM
- Save the current colors and animation settings to EEPROM
- Read settings from EEPROM on start up
- Set base values in EEPROM for new boards
- Flash green to confirm commands
I won't go into great detail about the code itself. You can read through it here if you would like. I tried to comment it well. I'm sure it can be improved quite a bit so feel free to send suggestions or pull requests.
Demo
Here is a (long) video showing most of the functions of the cube
Download links
As promised here are links to download everything if you want to make one of these yourself. The Fritzing diagram lists all the parts needed.
Arduino Code: https://github.com/matt448/MinecraftNightLight
Adafruit BLE Library: https://github.com/adafruit/Adafruit_nRF8001
3D Models: http://www.thingiverse.com/thing:1023004
pretty damn cool!
ReplyDeleteThanks!
DeleteHello!
ReplyDeleteI would like to make a budget version of your minecraft nightlight. There should only be a switch or two for on and off, and maybe different modes. I don't need smartphone control. Could you please help me? Thanks a lot!
Greets
You could probably just get a cheap LED strip off amazon or ebay, and use that.
DeleteYou can find them for under 25 bucks.
This comment has been removed by a blog administrator.
DeleteHi Matt-
ReplyDeleteI'm pretty rusty coding and uploading to Trinket-type devices, but have run a test upload of "Blink", modified it and reloaded it successfully. When I try to Verify the BLE_driver code, it indicates it can't find the two *.h hex files that are "included" at the outset. These would be adafruit_neopixel.h and Adafruit_BLE_UART.h; where do they live? Thanks! Chris
You need to download and install those libraries in your Arduino IDE. You can get them here:
Deletehttps://github.com/adafruit/Adafruit_NeoPixel
https://github.com/adafruit/Adafruit_nRF8001
or install them through the Arduino IDE library manager.
Hi Matt,
ReplyDeleteGreat project. Thanks for putting this together.
I'm going to buy parts for this project and was looking at purchasing the 5V/2A power supply (https://www.adafruit.com/products/276) instead of getting a 12V power supply and stepping it down to 5V/3A. Do you think that will be sufficient? I'm not sure if the circuitry needs >2A to operate.
Thanks,
Dave
Dave,
Delete5v/2A power supply should plenty. The Neopixels draw a max of 60 milliamps each when displaying white at full brightness. My design used 17 Neopixels which would be just about 1 amp at full brightness. The Arduino board doesn't draw much current at all. Certainly way, way less than an amp. Probably more like 100 milliamps.
Thank you for replying. Looking forward to making this.
DeleteHi, I know this blog is from a while ago but I wanted to attempt the project with my son. I don't have much skill with these things, but want to learn and your instructions are very good. If you don't mind I just had 2 questions. I've sourced all of the parts and am going to use a 12v 2a power supply. Would that use the same 1000uf 16v capacitor or would it change the specs? And basically the same thing with the on/off switch. I didn't see specifics for it in your make so would just a basic 12v on/off switch work ok?
ReplyDeleteThanks,
Dan
Just about any on/off switch can handle the power requirements for this project. I searched Amazon just now and even the cheapest toggle switch I found can handle 125v/6amps.
DeleteThe capacitor is only needed if you are going to use the same individually addressable LED's I did in my build. Those LED's will only run at 5 volts and require a 12v to 5v step down converter. If you are going to 12v LED strips then you don't need the capacitor.
This was posted in 2015, and I'm just finding it now - sad...
ReplyDeleteCan you control the LEDs and power them with a pi zero w maybe? It can supply +5 V and might make the programming somewhat easier
I love it. Thank you!
ReplyDelete