Leap Motion Teardown
You Got Guts, Kid...
Finally, something interesting! Beneath the plastic is another rubber sheet, with holes for the three LEDs, two sensor elements, and one IC that was apparently a bit too thick to fit otherwise.
In the top-down view, you can see some interesting things. First off, the rubber sheet is clearly design to baffle the light, stopping light bouncing around inside the chassis from reaching the detectors. Secondly, the LEDs on the sides are not only baffled against bleeding over to the detectors, they're also partially shielded to change the area the light is projected into. As nearly as I can tell, there's no synchronization among the LEDs; it would appear that the three LEDs are placed mostly to provide a solid, wide-angle infrared flood of the area of interest, rather than to provide any kind of magical illumination pattern like the Kinect uses. The baffling seems to be in place to prevent a "hotspot" where two LEDs overlap.
The IC peeking through the rubber isn't anything really exciting--just a 32Mbit serial NOR flash in an 8-pin SOIC package. It's surprising to see it in such a large package, but I'm sure they had good reasons for that. NOR flash is more common in applications like this one, where lots of program erase cycles aren't expected; the write leveling and bad block avoidance which typically accompanies NAND flash would simply add cost.
Peeling away the rubber baffle (which is glued, lightly, to the PCB underneath) reveals the top of a two-sided PCB. The top side is mostly bookkeeping: power supplies, the LED drivers, the LEDs themselves. There are three points of interest, however.
In the upper left corner, you can see a three-point serial port- RX, TX and GND. I didn't dig into it too far, but I was able to narrow it down to a 3.3V signal. It didn't dump any data in the first few seconds after power up, so I can't tell you what the data rate is.
In the upper right corner, there's a power supply circuit. This caught my eye because the inductor in the circuit is globbed over with a healthy dose of epoxy, which suggests that at some point in their development cycle, they discovered that it tends to come off the board and took a step to remedy that. Kudos on thorough testing and mitigation!
The third point of interest is the bare copper in the corners. I'm a little surprised to see that, as the screws on those points are black oxidized and they screw into a plastic holder, but it wouldn't surprise me if that's a throwback to an earlier version, or a "better-safe-than-sorry" sort of thing.
After I removed those screws, the top board lifted out easily, revealing another board and a surprising amount of empty space.
The back side of the top PCB has fewer, but larger, components: two large tantalum capacitors to guard against power supply brown-out during surge currents, a large surface-mount MOSFET (probably part of an inrush current limiting circuit, or supplying power to the LEDs), a fine-pitch dual-row connector to the second PCB, and the brains of the operation.
The core functionality of the Leap Motion is provided by a Cypress PSoC part, the CYUSB3014, specifically. If you've never looked into the PSoC parts before, I highly recommend doing so--they're pretty rad. PSoC (for Programmable System on a Chip) are different to standard MCUs because they provide analog and digital blocks which can be reconfigured to suit the user's needs. For instance, one application may need a DMA controller while another needs multiple capture/compare timers, but both can be serviced by the same part simply by altering the firmware to change the disposition of the system's blocks.
Whoops, I flubbed that, big time. The part is actually just a general purpose USB 3.0 device controller with built-in USB 3.0 PHY. The implication there is that all of the work is done on the PC side, and the Leap Motion is just shuffling data from the detectors to the PC as fast as it can manage. That said, I stand by my comments about the PSoC parts above. They are really cool.
Thanks for pointing out my mistake, IRC users Krain and Robint91!