Fab Academy 2017

How to make (almost) anything


I am in my second year of a PhD program in Computing and Informatics at the University of North Carolina Charlotte. I studied Computer Science and Music in college. In my spare time I play the pipe organ, enjoy visiting science museums, and play Ultimate Frisbee.

My research area is Human-Computer Interaction (HCI), where we study what it is like for humans to use computer systems, design new computer systems with humans' cognitive abilities, needs, and flaws in mind, and prototype what the next generation of computers might look like.

I am particularly interested in novel interaction with digital information-- interaction that goes beyond traditional keyboard, mouse, and screen, to incorporate things like physical objects, other humans, and in-air gestures and takes advantage of humans' natural understanding of the physical and social world. I am also interested in interaction for play and creativity and systems that people use to explore, express themselves, and tinker with the world around them.

I am also helping start a Makerspace/ Fab Lab on my university's campus. My HCI mindset influences me to look at the space as a whole and all the people in it as a large complex interactive system. I'm interested in who finds their way to the space, what their background is, and what their pathways through the space are: What are the points of entry? What do they explore and tinker with? How does their mindset and pathway influence their learning experiences? Through participating in Fab Academy, I hope to further explore playful interaction in general as well as use my own pathway of exploring fabrication to better understand how the space can serve the community.


Final Project


For my project, I made a set of blocks. Each block is made of a different material and snap together via magnets. The user arranges the blocks in a configuration they find interesting and then presses a button on the computer at which point the computer generates and displays a poem. The content of the poem comes from conversations with people about the blocks, song lyrics the blocks reminded us of, and anything else that came to mind.

Week 17: Applications and Implications

What will it do? It will allow people to connect shapes in different ways and loosely map the configuration of blocks to a kaleidoscope-like graphic visualization on the computer.

Who's done what beforehand? A couple people have made some interesting connectors that allow for electrical connections bewteen separate physical objects: http://fabacademy.org/archives/2014/students/schwimmer.dana/Itsabox.html http://fabacademy.org/archives/2014/students/oami.takuma/applications_and_implications.html http://fabacademy.org/archives/2015/as/students/hobern.craig/final/

What materials and components will be required? Circuit boards: attiny, female and male headers, resistors, capacitors, ftdi cable. Cubes: I really liked the composites week, so I think I might make them out of resin combined with different unexpected materials (grass, yarn, wood chips etc).

Where will they come from? All materials will come from the fab lab/ garbage

How much will it cost?

  • electronics: ~15 for components and pcbs for about 8 boards
  • Copper tape from sparkfun: $3.00
  • Piece of wood: $8
  • Piece of acrylic: $3
  • What parts and systems will be made? A physical system consisting of connectable 3d shapes and a software system that generates graphics.

    This is the final bill of materials (the only things not on the fab list are the copper tape and the magnets):

    What processes will be used? CNC milling, resin + composites, electronics design, embedded programming, networks, application programming, 2d design, 3d design

    what tasks need to be completed? Designing the electronics, designing the cubes, fabricating the cubes, designing and implementing the software.

    What questions need to be answered? How can each cube know which other cubes it are connected to?

    What is the schedule? I plan on doing a sprial iterative process. I will start with the pieces of the network to see if I have a feasible architecture. I will separately start designing the connection between blocks.

    How will it be evaluated? By how engaging/ playful/ compelling/ interesting it is for another human to use it.

    Week 18: Invention, Intellectual Property, and Income

    I feel the contribution of this work is more on the human side than on the technical innovation side. I can see this work being disseminated in the form of a research conference publication to an HCI conference, in particular perhaps TEI (Tangible, Embedded, Embodied Interaction). What I think is interesting about this system is that the interaction is with these different materials and that experience in itself is authentic and direct without the help of any computer intervention. The computer is involved in that it helps the user connect with other users who connected with these cubes before by sharing the things they made them think about. The computer doesn't really enable the cubes to do anything, but continues to help the user focus on what the cubes are. The TEI community studies humans' relationships to physical objects, so I think there would be some perspective on this system that would be of interest to them.

    I looked into the different types of licenses, specificially what are the differences between the MIT license and the CC license. I found some discussion forums such as this one (link) discussing the differences. It seems they are all pretty similar, but that the MIT and BSD licenses are written specifically for people's coding projects and deal with some of the isssues of resuing code. I wrote code for my project, but it was not the most novel. The more novel aspect is the overall idea and concept I came up with, so I choose to go with the Creative Commons license. I went here and filled out the specifics of what I wanted and then put the icon at the bottom of my page.

    Project Development Updates

    May 31, June 1 update


    I need a way for each board to know that board it is directly connected to. I am using my work from the networking and communications week as the basis for this. What I have working is a two-board wired serial bus network connected to the computer via ftdi cable. A python terminal allows for keyboard entry. Each board echos back to the computer if it gets a message with its unique id. So essentially, it is a network where the computer knows all the components that are connected to it and likewise each component also knows all the other components that are in the network. But no one knows the order of the components.

    I looked into a few different ways for the boards to communicate to each other the order. .... details.. I proposed a solution to Terence and he thought it was plausable. He suggested I look into what others have a little more and then ask the class. I decided to try a small proof of concept with my idea to see what I would run into.

    My idea for communication to make the components know the component that is right next to it is to add a 5th connection between each pair of boards that would be used for the board to tell the board next to it what its id is. It could use the Tx line for this, but that line broadcasts the message to all boards, so they don't know where it is coming from. This extra connection would be just between each pair of boards so no other board would get the message. I figured I would use PB0 on board A (the one connected to the computer) and connect it to PB1 on Board B. The ISP header is already connected to those pins, so after using the ISP to load the program, I just need to add a wire like this (MOSI on board A to MISO on board B) to connection PB0 on board A to PB1 on board B:

    For proof of concept, I wrote modified the program from the Networking assignment week to do the following;

    For board A: Listen to the computer. When you get a message from the computer that says "A: who are you connected to", listen on PB0. If there is something connected, you will receive a message that contains that board's ID. Relay that message to the computer. If there is nothing connected, wait a few seconds and then tell the computer there is nothing there.

    For board B: Don't listen to anything, just constantly send "I'm Board B" out of pin PB1. (I know Board B will have to do more than this, its just to prove it can work.)

    Essentially A listens to the computer most of the time and then listens to PB0 for its neighbor when the computer tells it to. B is just always screams its name to its neighbor and doesn't care about anything else. This is a diagram of the communication (time starts at the top and goes down):

    I implemented this without too much confusion. I initialied the new pins by studying how the other pins were initialized. When A gets a message from the computer, it listens on PB0 and sends that message back to the computer. This works just fine when board B is connected to A. If nothing is connected to A, it waits forever and doesn't take any other input from the computer because it is listening to PB0. I tried to implement a way for it to wait a bit and then give up if there is nothing. The place it is waiting is in the get_char function- there is a loop that keeps calling "pin_test(*pins,pin)" until there is something there. I put a counter in this loop and told it to "return" out of the function if it reaches a certain value (something around 20000). This works when there is nothing connected to A- it will listen for a second and then tell the computer that there is nothing there. But when B is connected, it doesn't always work. Sometimes it does and gets the correct value from B. But sometimes it gives up because it thinks it has waited too long, and sometimes it gets some other arbitrary value from board B. I played around with the give-up threshold, but never got any consistency out of it. I don't know, it must be something about the timing of the sending of the character from board B and when board A starts to wait. I put the code back that makes board A wait forever to get a character and it still works when board B is plugged in quite consistently. I need to rethink the structure of the communication to fix this. I need to find a way to avoid boards getting stuck waiting for a message that is never going to come because there is nothing connected to it.

    I came up with this as an improved schematic for how communication will happen in the network:

    The difference is that when A gets a message from the computer to figure out who is connected to it, instead of listening on PB0, it sends a message on PB1 (to its neighbor) identifying itself. Then the neighbor sends a message to the computer. There should be no instance when a board is listening for something that isn't there and if all else fails, the computer can send through A a message that will eventually reach any board that has gotten stuck listening to something that is not the computer. This will also scale to work if I decide each board can have two things that are connected to it- each board being able to listen on PB0 and write to its two neighbors via PB1 and PB2. Need to implement it to be sure.

    June 2 3 update

    What does the connection between blocks look like? There are (at least 3) parts to this: alignment, orientation, and electrical connection. I'll work first on the alignment and orientation.

    Alignment and orientation

    I want the blocks to be able to connect without a really obvious connector piece. I decided on magnets for alignment/ holding things together and have a few ideas for conductive materials that will create an electrical connection.

    I am working on a way to put the magnets so that not only do they guide two blocks to exactly where they should fit together, but they also only fit together in one orientation. The magnets I have are neodymium spheres, which makes it hard to control the poles since they will spin around to the direction they want to go. I might have to get some flat magnets so I can control the poles. But any way, I started some experiments with the sphere magnets and their placement. I thought if I arranged them in an isoceles triangle, then there would be exactly one orientation in which they are most strongly connected. It wouldn't prevent the other orientations, but at least the physical feedback from it would be most satisfying.

    I used fusion to model some squares to be cut from cardboard. I measured the magnets and figured that two layers would be enough material to make pockets for them. This is what the pieces of the first try looked like:

    I glued the layers together and taped the pockets for the magnets shut with paper. (I didn't want to tape directly over the pockets because the magnets need to be able to change their rotate to connect. The paper allows for this)

    It worked alright, but there were two orientations that felt the same: the expected orientation where all the magnets lined up and also the orientation 180 degrees from that. Because all the magnets were the same distance from the corners and were lined up on right angles, the second orientation worked. I made another one with the magnets slightly misaligned and this works better:

    This is a video of what it looks like to connect on each side:

    So there is only one orientation where both the outline of the squares and the magnets line up. There are not strong constraints though and it is possible the pieces could misalign and an incorrect electrical connection between the cubes could be made, so I need at least some physical constraint to prevent this. I want it to be minimal though. I thought about one bump and one dent. To test, I made a hole with a knife and made a hot glue bump. This would work since if the bump is not in the dent (as would be the case for any incorrect orientation), no electrical connections on the surface of the pieces would be made since the bump would prevent the pieces from touching. (I of course don't have any electrical connections on the piece yet, but I am imagining something on the surface that would connect when it touches). This is the bump and the dent for orientation and what it looks like when the piece is in the wrong orientation:

    Electrical connection

    I want there to be an electrical connection between two blocks when they touch. This needs to happen in 5 places (power, ground, Rx, Tx, and pair-wise communication (this is the new connection between boards that I added, see section on the electronics and network components)). I want only the points of contact to be showing and the rest of the electronics inside of the cube. The points of contact will need to be slightly beyond flush with the surface of the cube in order to ensure a connection. It would be ideal if each connection point could squish down just a little bit in case one is higher than the others. This would ensure that one point is not preventing the others from contacting.

    Conductive paint

    I first tried conductive paint. This seemed like the best option to get something that would squish a little bit since I could just paint something squishy. We have some Bare Touch conductive paint from Sparkfun. I tried a bunch of tests: Small squares of craft foam (for the squish), small squares of wood, a square of foam with a wire sticking part way through (I did this because I would eventually have to also stick a wire to whatever one I decide on), a small square of laser cut wood with a laser cut hole through it and a wire sticking in the hole (the paint goes into the hole), a piece of felt. This is the mess of all those:

    After they dried, I tested all of them individually with the multimeter by placing the probes on different places on the surface. They all had connection, but high resistance. Even the blob of paint that dried on the stick I was using had resistance. I can't introduce that much resistance at each connection, will have to find another solution.

    PCB board

    I thought I could perhaps mill 5 circlar pads on a small piece of FR-1 board. The challenge is how to connect the pad to the electronics behind it. I could solder a wire onto the surface of the trace, but that would have variable height and complicate the connection to be made. I could maybe make it work if each copper pad was separate and could be compressed slightly when a connection is made if it was taller than the others. I milled 5 .25inch circles with tiny holes in them for the wire. I then soldered a wire through the hole on the surface of the pad and cut the extra wire off:

    I tested the connection from the soldered blob to the other end of the wire and there was no connection most of the time. I made another one in case there was something wrong with the first one and also soldered a few blobs onto a scrap piece of copper. No connection on any of them. Hm! This is surprising- I guess the surface of the solder is not conductive really, it is what is on the inside that is. This makes sense I guess since the heat transfer is so important when soldering a joint, the heat does something to ensure that an electrical connection is made. I never really thought about the surface of a solder blob as not being a good place for an electrical connection. Well, I guess solder on a copper circle cut from pcb board is not going to work to make a connection.

    Copper tape

    We have some copper tape that is very conductive. I tested two pieces of tape touching eachother with the multimeter and there was no resistance. This could make a good connection between cubes. The challenge is how to connect the wires since I want to keep the surface flat. This means I can't just tape the copper tape to the surface of the cube and call it a day.

    I thought about using the copper tape to cover something and inlay it into holes in the surface of the cube. The width of the tape is .2 inches, so I laser cut some .2 inch cubes and made some holes in cardboard of varying size close to .2 inches to see where it would fit when the tape is on. I covered a few cubes in tape and soldered a wire to the back. When I hold two together and test with the multimeter, the electrical connection is good. This is promising...

    Wood cubes, some of which have been covered in two layers of copper tape:

    Soldering wires to the back of each cube (wire is bent in an L-shape):

    Copper cube fits into hole in cardboard (line to cut the hole was .2 in, actual size of hole is .21 in due to kerf. Actual size of wood cube is .18. Actual size of wood cube with copper is about .205, varying a bit):

    The copper cubes are just beyond flush with the surface of the cardboard, which is what I was hoping for. I laser cut another layer with just holes for the wires to go through (and pockets for the magnets) and glued the layers together:

    I put all the pieces together (just have 2 copper connections for now). When I align the pieces to snap together, the copper cubes are sticking out so far that they prevent the cardboard pieces from being flat:

    This partially happens because there are only 3 magnets, so there will always be one corner that is getting pulled together less. (But I think this would still happen even if there were 4 magnets, one on each corner, because the magnets wouldn't balance out and let the thing hover in between-- one magnet would win and connect that corner more than the others).

    When I hold the pieces evenly, this is how much room is between them. It is quite a bit more than the "just beyond flush" that I was hoping for.

    A few ideas of how to fix this:

    • Add a 4th magnet in the other corner
    • Make the cube smaller (laser engrave the surface off? sand to a certain height?)
    • Put the magnets in the middle and the connections on the outside? Or add a magnet in the middle of the pads? Spreading the copper out might make it less likely to be a lever.
    • Minimize the amount/ irregularity of solder needed to connect the wire to the bottom of the copper cubes-- Instead of soldering the wire in an l-shaped, make a hole in the wood square before covering it in copper, then stick the wire in the hole and solder it in at a right angle.
    • Make bigger holes for the wire/ make another thin layer for the cube to sit into.

    The electrical connections are good though! So I think I'll go the copper cube route and figure out how to fix the big gap they are creating.

    June 4 5 6 7 update

    I made new laser cut cubes for the copper tape. I made two changes: a small hole in the center of each square for the wire to poke through a little bit and the squares are also laser engraved to remove the surface and make them thinner. I played around with the settings on the laser to figure the ideal speed and power to shave off just a little bit of the surface: 40s 50p was best. It resulted in a .099 inch thick basswood square that is .119 thick with the copper tape. Once I solder the wire on, that should be just the right size to be a little bit beyond flush with the surface of the cardboard.

    I made a few of these and tested them out in the cardboard pieces- good electric connections on all. I made the rest and electric connections are good. This is what the pieces look like- they are very close to touching, which is what I was afer:

    I started thinking about how the wires sticking out would make their way to the board. I could just bend them, but that is not elegant. Instead, I designed in Eagle a board with holes that I would solder the wires onto:

    This looks nice, but when I test the electrical connections, one of them no longer makes a good connection. I think this is because when I was testing the connections and the wires were sticking out, the copper blocks could move in and out a little, which helped ensure that all electrical connections would be made. Now that the copper blocks are forced to remain in place because of the soldering, it makes it less flexible when the connection is made. I'll either have to do separate copper pads for each wire (and make it not so tight) or just bend the wires.

    Network update: I implemented the network as I described above. It works! I only had a few bugs along the way- largely I made the mistake of sending the same message from the board to the computer that I was using to send from the computer to the board that would trigger it to send that message.. so there were some infinite loops that would render the whole thing unresponsive that I wasn't sure why it was happening for a while. The other mistake I kept making was forgetting to change the hardcoded board id number when I was loading code onto each of the boards. These were just human errors with the workflow though.

    I'm now updating the eagle file to reflect the new connection that I have been using the isp pins for and add another connection that will be for the second board that is connected.

    To program board B, I need to disconnect the output pin from board A. (Or even just disconnect everything except for power and ground.)

    I have made a new board with the new connection line between boards. I also added a second set of pins so each board talks to two other boards, not just one. This means each block will be able to be connected to two other blocks.

    I assembled an entire cube to see how everything fits together. Instead of using the milled board with the circle traces for the inside of the cube, I used a bit of hot glue on each connection. It's not elegant, but it allows for a little bit of give if one of the copper squares is sticking out too far. It was really hard to solder all the wires in the cube though- very weird angles to be soldering at. Need to think of a better way. But the connections work. I loaded the program onto the cube and it works as well. I need to test now with a few cubes.


    I made the acrylic cube next. I changed the size a little to be 2 inches in each direction and used fusion 360 to make the panels that would interlock based on the thickness of the acrylic. Because acrylic doesn't burn away as much when it is laser engraved, I couldn't get the magnets as close to the outside surface of the cube. So they are a little weaker, but they still work. I laser cut small casings for the magnets and superglued them on from the inside.

    The other modification I made was to the electronics. I needed to make a smaller board to fit in the 2 inch cube. I thought that since I had connections going to all the pins on the attiny that the isp would be going to, I could just forgo the isp header and use the connections on the sides of the cube when I was programming. I made a board like this, but then realized how hard it is to do that since it means the connections will be all over the place. So I made another board. To make everything fit, I used double-sided pcb. I also used through holes for the connections instead of the giant pads I made for the last one. This was much more elegant and the board works.

    This is the new smaller electronics board, node version:

    The new smaller electronics board that is the bridge is similar, except there is place on one side for the FTDI cable to fit:

    This shows the pieces that hold the magnets in and the new electronics board.

    In the meantime, I have been experimenting with the grass cube with resin (see composites week for documentation). It has come time to add the electronics to that one. I have been building the cube one wall at a time, but I don't want to close it off before I put the electronics in or I won't be able to solder. I have 3 walls built, so now seems like a good time. I used a dremel to make dents for the magnets and a drill to drill holes for the wires that connect to the copper contacts.

    This is the grass cube with 3 walls before the electronics are in:

    This is the grass cube with the electronics. I then added another wall, shown here:

    It is hard to reach the isp pins in the grass cube, but it is not impossible. The grass cube works, I switched over a bit to programming. See Applications Programming week for details.


    This is not the most reliable system. It works sometimes, but is more likely to work if a human is holding the cubes together or uses some double stick tape. Stronger magnets would help or just making sure that the magnets are as close to the outer surface of the cube as possible. The cardboard cube was the best at the beginning, but it wore out as the cardboard compressed too much and was one of the worst at the end. There was one side of the acrylic that was really good, but one that was pretty unreliable. I think this is just from inconsistency in my soldering on the back of the copper cube. The grass cube worked the best, surprisingly. There was no give to the copper pieces at all and they weren't even in straight. But I think the fact that they were at angles helped make sure all the points had contact. This randomness though wouldn't work if all cubes were like that. Really the best connections I had were when I had fresh cardboard and was testing just cardboard on cardboard. I could add some physical constraints to hold the cubes in place a bit better, but this reduces some of the elegance. I could also use magnets of different polarity to both align and orient.

    I never completely closed off the grass cube. There is one side that is still open. I could close the cube completely if I was sure what the program would be, but I still might need to make changes. I could make a custom fit cover for the last side/s, but that is future work. For now, I just hide the unfinished part.

    Network: Next time I would use both tx and rx channels. had to hard code a lot of if-then statements to encode/ decode messages rather than sending the direct thing becuase otherwise some block might interpret it as a command rather than just knowing that the message is being sent to the computer as a message.

    It was hard to test things without building a whole cube. I could have made some intermediate device to test individual boards and the communication between them without having to embed them in cubes.

    I tried to employ some of the principles we talked about in class such as self-alignment. There were a few pieces that came together to make self-alignment work in my system and each piece had small errors in it, which when put together resulted in larger errors since they build on top of each other.

    Final Project Files

    Outer piece for laser cut cubes
    Inner piece for laser cut cubes
    Mold for resin casting
    node c code
    node make file
    bridge c code
    bridge make file
    python terminal for poem
    brd file for node
    sch file for node

    Creative Commons License
    This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.