Cubecube - an open-source hardware project - is a tangible, tactile interface for CAD (computer-aided design.) As open source design platforms continue to emerge, there is an opportunity to explore new possibilities in how we create. The Cubecube project aims to investigate the question: If there were a platform for using your hands to build three-dimensional computer models, what might it look like?

Essentially, I wanted to create a system that married one of my childhood passions - building tiny things with my hands - legos, constructs, etc - and my more recent obsession with creative coding and digital fabrication. So, this is a system that allows you to generate CAD geometry by stacking lego-like blocks!

Cubecube is open source. Source code for firmware and software, along with hardware designs and schematics, are available for free download on the internet. The current prototype is built completely around open-source creative platforms: its hardware is designed in Fritzing and connects with an Arduino Nano; its firmware is written in Arduino; its software is written in Processing. Full build instructions have been published on Instructables.com, which include step-by-step instructions with photos, a bill of materials, necessary files, and useful links to anyone interested in participating in this project.

Step 1: Concept and Design.

The system behind Cubecube is simple. Its building blocks each contain a tiny resistor, and as they are stacked in parallel over a voltage divider, a change in voltage can be read by a microcontroller. Four analog multiplexers break the Nano’s inputs out into 64 discrete channels. Each channel, arranged into an 8x8 grid, reads a changing voltage determined by the number of cubes in the stack. The current prototype supports up to 640 cubes.

The Cubecube firmware and software, written by Kavinath Laud, was built in Arduino and Processing. The Cubecube Processing app utilizes Marius Watz’s Modelbuilder libraries to facilitate export of STL (stereo lithograrphy) format files. This makes it easy to interface directly with any 3-D printer system, and allows a user to extend Cubecube’s functionality with third party CAD environments.

The back-end of Cubecube is versatile. While designed as a CAD interface, it can be modified for any number of hardware-interface projects or experiments. Because it is designed with accessibility in mind, Cubecube can easily be hacked, iterated, appropriated or otherwise repurposed. The open source framework it was built around gives anyone the tools to make Cubecube their own.

Cubecube makes creating simple 3-D computer models as simple as building with blocks. The simplicity of its front-end allows for anyone who can grasp and stack objects the ability to engage with digital fabrication methodologies, and the accessibility of its back-end provides a starting point for further experimentation in the realm of tactile CAD interfaces. Cubecube offers a different way of thinking about computer-aided design, and provides a strange but familiar platform for creating.

<p>This is brilliant. I can't think of a better way to teach 3D modeling.</p>
<p>Functionally, I wonder if you could have color-coded cubes that correspond to user-definable parts, i.e. PVC pipes; If each block had input/output on all six sides that could be really interesting (not that it isn't).</p>
<p>Yes! Assignable cubes would be too cool. And definitely, six-sided connections would be a huge improvement. Unfortunately this is tricky - maybe impossible - to accomplish using the voltage divider approach. The cubes may need to have more sophisticated electronics to communicate that kind of data. Any ideas? :)</p>
<p>Well, your system would have to mechanically grow a bunch to accomodate the higher complexity electronics, but the first thing that comes to mind is a daisy-chained communications system (as opposed to a standard parallel system like SPI or I2C). This way, a device is addressed (to determine stack height) via its position in the daisy chain. Each voxel/cubelet/whatever could then be fully customizable with respect to its virtual representation.</p><p>Might be a simpler way to do this, but this is the first thing I thought of.</p>
<p>@Samurai my thoughts exactly. Any insight on what sort of chip might do this? I've heard of old computer networks working like this...</p>
I made a cursory glance at google when I was writing that but didnt find anything that specific for cheap (for instance, daisy chain communication is common in battery pack management ICs, but are large, expensive, and would have too much unused functionality).<br>The obvious answer here is to choose a small, cheap microcontroller with something like two of the same peripheral (like two separate spi ports): one would face the previous block and one would face the next block. Then you write a little bit of management code to concatenate or strip messages traveling from one peripheral to the next. I think this functionality could be had for less than a dollar w.r.t. the microcontroller.
<p>I wonder if I can get that sort of functionality out of an ATTINY? With a soft serial library for comm. I'll have to play around with this over the summer!</p>
<p>Possibly. The tricky part is having 2 identical comm peripherals that can be configured physically (e.g. by jumpers when you plug into a cube/have a cube plugged into you) and are on separate pins. For that reason soft serial is your best bet for minimizing cost per cube.</p>
<p>Maybe you can get this sort of distinguishing by using different values of resistor for each color. The trick could be the use of prime numbers roots, to make unique combinations. </p>
<p>Ah, If only stacking resistors in parallel yielded a linear progression! Even still, there would be the issue of sensing the order of &quot;different&quot; block types in a stack... though Kavi and I are currently working on a way of tracking that in software. Really good thought though, I might have to play with this.</p>
<p>The easy solution is to add a simple switch in each block with a projection in the bottom of the next block up to break it. Then, in each block, one contact connects to the resistor, the other side of which is connected to the contact receptacle for the next block up, and the switch. The other side of the switch is connected to the return contact for the block below and the receptacle for the block above. <br><br>Plug the first block in: the switch is closed, so current flows into the resistor, through the switch to the return contact, one resistor, in series.</p><p>Plug in the second block: the projection breaks the switch in the block below. Current flows into the resistor in the bottom block, through the connection to the receptacle to the block above (and not through the switch, which is open) where it continues to flow through the resistor. That switch is closed, so the current continues to the return contact, through the return contact in the block below, and on to the return terminal of the measuring loop: two resistors in series.</p><p>If you mistrust the mechanical switch/projection, substitute a magnet for the projection and use a very small reed switch (NC, opens in Magnetic field) in the bottom of each block.</p><p>This allows a couple of resistor schemes, and doesn't rely on prime resistor values: </p><p>1) stick to the E tables. Chose a tolerance that your measuring system can differentiate without question. (Consider E6 for a simple example: these are 20% resistors, 100ohm, 120ohm, 130, 150, 160 etc. check the tables and info at <a href="http://logwell.com/tech/components/resistor_values.html" rel="nofollow">http://logwell.com/tech/components/resistor_values...</a>). E tables are designed to provide a standard value within the tolerance range on either side of any standard value, covering the entire range. So skip every other value, and you have a &quot;guard band&quot; between possible values. Now, assign one type/color/size/value whatever, to each value.</p><p>Since you can constantly read the stacks faster than anyone can add blocks, you can tell which block is added next: this requires that the user not pre-stack blocks.</p><p>2) Choose resistance values based on their tolerance, and your ability to turn the decimal digits within the tolerance into binary numbers. For 1% resistors, you can count on fifty values which fit within seven bits. Organize them based on leading digit into 7 classes, with increasing numbers of sub-class. For instance, if you have only one interconnect (pipe, wire, etc) assign that 1. Use 2 (which will only have one, because of the need to skip values for the 1% tolerance) assign another singular value, maybe ground? Power to 4 (plus and minus), semiconductor type to 8 (BJT, JFET, diode, 3-terminal regulator), capacitor to 16, resistor to 32, connector type to 64 (decreasing number of choices because you can't count to 127 and you're still throwing away every other resistance value). Probably a weak example, but with well-chosen values, you could make a radio!</p><p>Anyway, once you have the ability to stack resistors and ensure a return path without forcing an additional capping piece to keep track of, the rest is pretty much your own choice of encoding.</p>
<p>Clarification of last paragraph:</p><p>Once you have the ability to maintain a series connection of a continuously-increasing stack of resistors...</p>
<p>Very Cool Project! If you could incorporate other shapes, that would extend the functionality and creativity. Try using an open source CAD programme like QCAD instead of Processing, the way you have presented this Instructable is very nice. Throw this on KickStarter, its totally worth it! I would love to pay and play with your prototype soon :) </p>
<p>Absolutely brilliant I love the way it works! Keep up the good work! :)</p>
<p>Awesome project, I love it.</p>
<p>one of the most coolest innovative stuff I have ever seen... heads up. and BTW try it on kick starter.. along side with a 3d printer... it'll be sweet.</p>
<p>Awesome work Bryan! How about a Lincoln Log edition? </p>
<p>Dude!</p><p>You need to hook up with <em><a href="http://en.wikipedia.org/wiki/Minecraft" rel="nofollow">Minecraft</a></em> publisher <a href="http://en.wikipedia.org/wiki/Mojang" rel="nofollow">Mojang</a> straightaway! I see some serious potential to implement your design into a physical based building platform to enhance Minecraft gameplay. Think <em><a href="http://en.wikipedia.org/wiki/Skylanders" rel="nofollow">Skylanders</a> for Minecraft. Wow, my mind has been blown!</em></p><p><em>Nice job.</em></p><p><em><br></em></p>
<p>My nephew is obsessed with Minecraft... I am hoping to do some user testing with him soon!</p>
<p>I may just make one and do some Minecraft mods with some friends to work with this. Great project I love it!!! Defiantly voted for you. Good luck on the contest.</p>
<p>good job. i wish i had your skills.</p>
<p>Oh my God. This is the future. I'm not even kidding.</p>
<p>Imagine integrating this into legos, with molded in resistors that could work with one of the lego cad programs out there.</p>
<p>This is very clever and original. Well done!</p>
<p>Wow- what an incredibly cool project!</p>
Exactly! If you did this for mine craft you would need pieces that act as different mine craft blocks, you could even make them look like the blocks themselves
<p>Love your idea. 'Cubecube: Minecraft edition' has a nice ring to it!</p>
Awesome! Is it possible to do this with legos? And could you modify pieces so the cad software knows not to include them so you can have gaps in the 3D models?
<p>Yeah, that's a great idea. Like, &quot;black&quot; pieces that when set, the software treats it as a hollow but will respect the space.</p>
<p>Agreed! Great idea. I am hoping, in the future, to add a feature that allows one to toggle through different block &quot;types&quot; - including your suggestion of the 'hollow' one. I included an extra button switch and LED on the board for stuff, like this, that can be developed down the line...</p>
<p>Very Nice!</p>
<p>very clever, hat raised.</p>

About This Instructable




Bio: I love making stuff! Especially when it involves hacking electronics, DIY software and hardware, and digital fabrication. For more info about me check out my ... More »
More by Bryan Cera:Cubecube: A Tangible CAD Interface. Making 'Glove One' - a 3D-printed, wearable cell phone. 
Add instructable to: