This project is completely open source, from the schematics to the eventual Arduino code. The LED Cubular is made up of 6 PCB boards which come in 3 different designs. The top, the bottom and the sides. The sides and top are simplified to basic components for running the LEDs.
The bottom board will contain an Arduino Uno ATMega328p as well as; an IMU for tracking orientation and battery charging and boosting circuits. The goal is to have a completely clean "Cube" only made up of SMD LEDs. I'm placing pads on the bottom PCB that can be interfaced to with Pogo Pins. I plan to design and 3d print a desktop "docking station" that the cube will sit in nicely and can be used for charging and reprogramming.
Total size will be 42x42x42mm with 384 + 1 internal LEDs
I put together a concept animation to show the clean design I'm aiming for;
I am trying to achieve the following design criteria in no particular order;
2 Layer PCBs; So that all PCBs can be produced together.
Bottom PCB is a self contained "brains" module; So that all major components are contained in 1 PCB, it also means that the bottom pcb can be a standalone display.
Self assemblable (is that a word?); Trying to keep in mind that self assembly is required for prototyping so using larger 0603 or 0805 and no BGA components where possible
Attempt to achieve modularity so that in the future the LED Cubular may be expanded to different shapes and sizes
Only LEDs are shown on the external of the cube; no through hole components.
In order to select a suitable battery, I needed to first estimate the overall power consumption of the LED Cubular. I started by going over the datasheet for the main active components and the Max7219 had a great section about estimating the current draw based on number of LEDs active and other factors. I combined this with my other estimations to give a rough total current draw and added an additional 10% for possible other loses; such as regulator efficiency. You can check out the results here;
As you can see the tested values are for Brightness; Low, Medium, High and then ALL LEDs on and Half LEDs on. This gives us a peak value of ~750mA max draw when all of the LEDS are on (unlikely in normal usage) and at full brightness which I would expect to be rather blinding. I can prevent this situation in code by either maintaining a much lower max brightness or only allowing a max number of LEDs turned on at one time. Either way it gives us a rough estimate of what load a battery might be under.
I found 2 possible battery choices at 400mAH and 300mAH that would physically fit inside the cube. I estimated the liftime of the cube based on the capacity and draw for each battery which shows we should get at least half an hour with all of the LEDs on at a medium-high brightness. Which is well within my hopes and should give far more time under more animated lighting patterns.
As mentioned, I found a 300mAH battery and there are a tonne of 400mAH drone batteries available but all of questionable specifications due to buying from ebay/amazon. The drone batteries would also require changing out the connector on either the board or the battery due to not using a standard JST connector. For now I'm considering this 400mAH Battery with dimensions of 26.5mm x 36.9mm x 5mm. Which you can see below will fit into the cube with a tight squeeze of space;
The major problem I haven't solved is how do I secure the battery down? I was hoping there might be some kind of "cable tie smd mount" that would allow me to cable tie the battery in place. I found these SMT cable clips which can be used to hold down wiring so I thought I could maybe do something like this;
Which would allow me to get 2 cable ties looped around the battery. Does anyone have a better idea?
I like to visualise a a project with the big picture. I threw together the PCB steps files into "OnShape" which is a freebie 3d CAD package that also does assemblies. Viewing the cube as a "whole" allows me to check the physicality of the design and it's highlighted a few problems.
You can check out some 3d views of the LED Cubular in the vid below;
Highlighted Issue 1; Power Switch
In order to shut down the battery powered LED Cubular I wanted to have a small slide switch for on/off. This allows for switching state without having to take the top panel off. However, it means I need a hole in the cube so that I can flick the switch. I don't want to have lots of cut outs on every board so I've decided to add a break-off tab on each of the side panels. That way the one that is placed next to the power switch can be broken off to reveal the switch and the rest can still be relatively solid.
Highlighted Issue 2; Pad Alignment for Charging
One of the further development pieces is to create a "pedestal" for the cube to sit on. This pedestal will provide charging power as well as allow for easy reprogramming of the Arduino within the cube. However, one of my concerns is that it will be difficult to place the cube on the pedestal and get to pads and pins to line up. To help this, I've removed a "keying" corner on the cube. By designing the pedestal with a matching key, it should allow me to ensure that there's a specific orientation of the cube that sits nicely on the pedestal without the risk of misalignment.
Highlighted Issue 3; Connector legs
So final issue I've spotted and was kind of aware of during the design process is that the legs for the connectors on the bottom and top PCBs will be protruding into the area where I want the side panels to be to create a closed cube. Common sense says that in the real world the Side panel PCBs will end up sitting on the legs and that ruins my closed cube ascetic;
You can see in the image that the legs of the connector are right up the board edge which is where the side panels should be flush. In order to overcome this I'll need to plot out small cuts in the side panel design that gives clearance to each of the pin legs on the bottom and top PCB. Totally doable, just takes a bit of thinking ahead.
I put together a short video of my pcb track layout for the 64 front LEDs on the side panel. I'm no video editor but I think it comes across well. As can be seen from the schematic, the LEDs are connected to the Max7219 in a matrix layout.
This daisy chains the LEDs together in columns and rows which initially makes it difficult on a 2 layer design to not end up getting your wires crossed and losing a tonne of space on the bottom layer. I came up with a way of interconnecting the columns and rows (8x8) by passing the 6 mil traces under the LEDs. I could fit 2 lines under each LED while maintaining a 6mil clearance. Something I note that the Bantam Tools CNC mill should be able to achieve. Check out the video to see how I pulled it off;
My vision for this design is to have the final boards produced with a black PCB and to remove the silk screen from the top overlay. I think this should give the cube a really modern and clean look while really allowing the LEDs to shine.
My latest changes to the bottom PCB are purely for visual. I've tried to add clear text where possible to highlight the key input/outputs and for prototyping I've left the Top Overlay on so we can see the individual LED numbers and interface pads.
I've produced the following diagram in an effort to explain the general connection layout and functionality.
Each side panel and top panel have a max7219 for running the LEDs. These are daisy-chained through the bottom board as the data out of each max7219 is passed to the next board. Port 1 on the bottom panel can be used with an ICSP in order to burn the Arduino Bootloader to the ATMega328P as well as being used to drive the first side panel.
The side panels for the LED Cubular are as simplistic as possible. Each one will have 64 LEDs on the front (no silk screen) and on the back is the connectors for the top and bottom and a max7219 which is a dedicated LED driver chip that can handle 64 LEDs in a matrix connection and communicates with the bottom PCB ATMega328P via a protocol similar to SPI. What's particularly nice is that the Max7219 can be daisy-chained together to allow for a single communication bus, requiring only 3 pins from the ATMega328P.
The top panel mirrors the connectors of the bottom but matches the side panels in simplicity. Perhaps in the future this extra space could be used for adding bluetooth functionality or other expanded features? For now, it's a simple mimic with the Max7219 and the 64 LEDs.
For the initial design of the Bottom PCB I restricted myself to a 2 layer PCB. It's quick and dirty and really it should be a 4 layer so that I can offload power and ground to the internal layers. However, for an initial design and prototype I think it'll work. The Bottom PCB is the "Brains" of the project. It has the following features;
Arduino compatible ATMega328P
4 x Panel Connectors for the side panels - 1 of these can be used with an ICSP programmer to burn the Arduino Bootloader to the ATMega328P.
IMU - LSM9DS1TR - for orientation tracking i2c accelerometer, gyroscopes and magnetometer
LiPo JST Battery connector with charging chip and 5v Boost - based on Adafruit 500 Powerboost
Max 7219 LED Driver for 64 LEDs. Communication via an SPI-similar bus.
And on the back side we have the 64 SMD 0805 LEDs and exposed pads for pogo pins to allow for charging and reprogramming.