Sunday, September 27, 2015

BLE controlled Minecraft nightlight

A few months ago my daughter asked me to print something for her on my 3D printer. I asked her what she wanted and she said "something Minecraft". We started looking at designs on thingiverse and came across a design for a Mincraft ore block. I thought it might be cool to make a night light out of it using Adafruit Neopixel LED strips and an Adafruit Pro Trinket microcontroller to change the colors. I ended up having a bit of scope creep on this project and it took way longer than I expected but the end result was pretty neat and I learned some new things. Originally I was just going to program the Arduino to cycle through colors but then I came across the Adafruit Bluefruit LE breakout board and realized it would be fairly easy to add BLE control to the project. In the end this was the most involved Arduino coding project I've done so far. At the bottom of this post there are links to download the 3D models and Arduino code if you want to build one yourself.




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
After cutting the traces I soldered on the headers for the Pro Trinket and the BLE breakout.

Pro Trinket plugged into its headers
BLE board plugged into its header

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


On the back of the cube I added a barrel connector for power and a small toggle switch. The toggle switch controls the power to the microcontroller and the LEDs. The power cable is routed through a small hole in the white insert.




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.










10 comments:

  1. Hello!
    I 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

    ReplyDelete
    Replies
    1. You could probably just get a cheap LED strip off amazon or ebay, and use that.
      You can find them for under 25 bucks.

      Delete
    2. This comment has been removed by a blog administrator.

      Delete
  2. Hi Matt-
    I'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

    ReplyDelete
    Replies
    1. You need to download and install those libraries in your Arduino IDE. You can get them here:
      https://github.com/adafruit/Adafruit_NeoPixel
      https://github.com/adafruit/Adafruit_nRF8001

      or install them through the Arduino IDE library manager.

      Delete
  3. Hi Matt,

    Great 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

    ReplyDelete
    Replies
    1. Dave,

      5v/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.

      Delete
    2. Thank you for replying. Looking forward to making this.

      Delete

Please note all comments are moderated by me before they appear on the site. It may take a day or so for me to get to them. Thanks for your feedback.