Five Man Conspirator David Wolpoff married his long-time girlfriend on May 18, 2007, in a very non-traditional ceremony. Rather than exchanging words and rings, the couple exchanged rings and “vows.” These vows were pieces of artwork, dedicated to the non-traditional expression of traditional wedding vows.
--
Jen is an artist, and created three works of art: “To Love” “To Honor” and “To Cherish”
I am not an artist-- I can't draw a straight line with a pencil and a ruler, much less draw a circle freehand. Whatever I lack in artistic skill, however, I can at least attempt to compensate for with finesse with a soldering iron, and the ability to make an LED blink.
Love is 200 White LEDs

The concept for my wedding vows was to evoke a sense of longing and of support. To be corny, I wanted to give a sense of not having to wander alone. I decided that it didn't make sense to create a single piece, but instead to create a set of pieces that combine as a whole, and that can interact with, yearn for, and support each other. They needed to express the things that I feel, and to be generally understandable by others. They also needed to blink.
In terms of engineering, the design is fairly simply- a ten by ten array of LEDs, a microphone and a buzzer- all interfaced to an ARM micro controller. I decided that they should be able to interact with each other, but that I'd like it if they could interact with an audience as well. Each unit has a display, the grid of LEDs, with which it can express its emotional state to the audience. Each unit also has a microphone and a buzzer, allowing it to create and detect sound, and allowing the devices to communicate with one another.
Lonely Gizmos
The completed “piece” is a pair of gizmos, attached to a piece of mirror-backed acrylic and framed. Upon powerup, the each gizmo plays a welcome song, and each displays a traditional set of vows (To have and to hold, to love and to comfort, to honor and keep, to love and protect, as long as we shall live). When they've completed this task, they become “interactive.” Each unit will begin with an arbitrary “happiness” level. As time passes, they become lonely and distraught, their image changes to a frown and they begin to whine to the world. If another unit is within earshot, it will play a cheer-up tune, making the sad gizmo a little bit happier. They also sing at random times. Each time the gizmos hear the song of another, they get happier, and eventually they will fall in love with each other.
Development
It took me so long to figure out what I wanted to do for my vows, that I ended up against a wall in terms of actually implementing them, so I didn't have a chance to revise the circuit board. It took me an afternoon to spec a complete bill of materials (BOM), and another afternoon to complete schematic entry. I'm happy to provide schematics, BOMs, etc to interested parties. I did everything using gEDA and PCB, and I've heard complaints about not being able to effectively auto-place components... so let me reveal a trick. I'm lazy, so I didn't want to place the 100 LEDs by hand in PCB, but I needed them to line up precisely-- so I piped my PCB file through 28 lnes of perl (cat vows.pcb | ./ledplace.pl > vows_new.pcb)
#!/usr/bin/perl
# ledplace.pl
#
$xstart = 100000;
$ystart = 100000;
$xwid = 20000;
$ywid = 20000;
$rowlen = 10;
while(
{
if(/0603D/)
{
@a=split(/ /);
$num = $a[2];
$num =~ s/\"//g;
$num =~ s/D//g;
$num = $num-1;
$x = (int($num/$rowlen))*$xwid+$xstart;
$y = ($num % $rowlen)*$ywid+$ystart;
@a[4] = $x;
@a[5] = $y;
print join(" ",@a);
}
else
{
print;
}
}
And the LEDs were exactly where I wanted them. This is a great advantage for text-based PCB files.
In total, the boards are 3.75” to a side, with the LED matrix about 2” square in the upper left area of the board. Each board has an LPC203 microcontroller, an electret microphone, a magnetic buzzer, regulators, serial port etc. The LED matrix is a 10x10 array of white LEDs in 0603 packaging. The array is driven by discrete sot-23 mosfets.
Total code for the project is about 4000 lines, inclusive of whatever got dragged in unused, and excluding libraries, etc. Programming and debugging were both accomplished using only a serial cable.
Here's what to expect when you go from a PCB to a pcb:
The top side pcb versus PCB
and the bottom side pcb versus PCB

Here's a single board finished up:

Cuts and Jumpers
Naturally, I made a few “mistakes on the boards. Notably, I left of a pull-up on two pins that needed it. If you look closely at the upper right, you'll spot my fixes. I also mis-named a ground connection in my schematic, giving myself a set of parts that weren't grounded, but that's also easy to fix.
The “messy” fix in the pictures is a “hearing add” that I decided to add after the fact. It isn't strictly necessary, but it makes the coding a lot simpler, so I put it in.
The final, assembled piece looks like this:

or like this, smiling:

and here are your requisite YouTube references: