This project and this web page are far from done. For now, this is just a spot to dump some pictures and explanatory text with no particular organization. Enjoy!
This is a story of feature creep spiraling wildly out of control, but in a good way. This project started off when my old strobe controller broke. It was just a little box that I could plug into a microphone and a strobe light, and it would trigger a flash when it heard a noise. It had a couple little knobs to adjust sensitivity and delay, but that was really about all there was to it. Though simple, it did its job well enough. It allowed me to take some wonderful pictures of balloons popping, glass breaking, and water splashing. When it broke, I took it apart to see what was wrong, and I was rather surprised to see the kind of old-fashioned engineering that went into it. It was a complex and mostly analog circuit built around a bunch of 555 timers, one of which my testing revealed had been zapped.
It occurred to me that I could rip out half the components in the board, stick a microcontroller in their place, and program it to be even better than before in an afternoon. So I did just that, and it really did just take an afternoon. Then I started thinking it would be nice to be able to use different kinds of sensors with it. And to have more outputs. And to be able to do intelligent things with those extra outputs. And to be able to program it on the fly to do those interesting things. And so on.
Eventually, I ended up designing and building a whole new strobe controller from the ground up. It has a USB interface to program it with, five outputs, two inputs with digitally controlled amplifiers, and even a rechargable Li-ion battery. I used components I either had on hand or could buy locally as I went along, building it up piece by piece to see where it took me. I designed a very simple little programming language for it, wrote a compiler to run on the PC side, and wrote a virtual machine to run on the device side.
It worked beautifully. My software interacted seamlessly with the hardware, and the hardware let me do tricks no other device could. Already I was an order of magnitude beyond where I started.
I even started experimenting with the new sensor and output options the device supported. I made an exquisitely sensitive contact microphone, found an electric water valve I could use to dispense invidual droplets, and started making adapters to connect the device to my camera and flashes.
But then I started seeing limitations. There would still be certain kinds of sensors I could never connect to it, certain elaborate scenarios it wouldn't support. I started looking into more powerful microcontrollers. I noticed there were already similar products on the market. And I realized that I could make mine better than all of them, with some time and good engineering. And not just incrementally better, but hugely more powerful than anything else you can buy. So I started over again, this time designing from the ground up for custom-made circuit boards and much more carefully chosen components. I was determined to squeeze out every last feature I could fit.
So I learned to use Eagle to design my new device, spent weeks trying to think out every detail of the circuit and each component that goes into it, and spent more weeks obsessing over making a beautiful board layout for it.
At this point, though, starting to see what could actually become a sellable product, the software was simply no longer up to the new standard I was setting. I had to start that over, as well. First, I needed to rethink the programming language I designed, and implement a better compiler for it. Rather than limping by with a simple hand-written compiler, I decided it was time to learn to use a proper metacompiler. I settled on Coco/R for its clean syntax, excelent documentation, and surprisingly friendly compiler. That's where I am now; working out the compiler for the newest version of my device's programming language.
Now some technical details, for the curious. I promise when this project is done, I'll have a much more thorough writeup. My latest device uses a MSP430F2274 microcontroller. I like MSP430s a lot; I highly reccommend their very inexpensive ez430 development kits. For USB connectivity, I'm using an FTDI FT232R USB to serial converter.