Fadecandy on the Making Embedded Systems podcast

I recently had the opportunity to speak with Elecia White on the Making Embedded Systems podcast:

Micah Elizabeth Scott (@scanlime) came to talk about Fadecandy, a really neat way to control smart LEDs (NeoPixel, AdaFruit’s term for the WS2812). The conversation ranged from beautiful LED control algorithms and open source embedded projects to triangle tessellations, art, and identity.

You can get the full podcast on embedded.fm, iTunes, or download the MP3.

Sifteo and San Francisco

If you’ve been following me on Twitter you’ve probably noticed I’m not dead yet, despite the extreme silence on this blog lately. Well, possibly I just turned into a really inanely chatty zombie. But either way, I haven’t been cranking out awesome projects like mad. What gives??

First big event: this past July, I moved to San Francisco. Having grown up in the suburbs all my life, I’ve always wanted to live in a big city. So, I decided to pull up roots a bit and make that happen. So far, I feel like it’s one of the best decisions I could have made. If you also happen to live in SF, drop me a line. I’d love to meet, perhaps for an IPA or Trippel at Toronado or a fantastic soy latte at Ritual.

Then, a bit of a career shift. For the past six years, I’ve done a variety of operating systems, graphics, USB, and Bluetooth work at VMware. It’s been awesome, and I had the chance to build some great things there that I still get to use every day when I run VMware Fusion. But it was time for a change. I really wanted to work at a startup, and do something more hardware-focused.

So, very shortly after moving to SF, I got a job with Sifteo, makers of the adorable little gaming cubes that everybody loves. I arrived at the company shortly before their cubes went to market, so I didn’t have much time to influence that product much, but I’ve been having a fantastic time doing future R&D work for them lately. We have some seriously fantastic stuff in store, and I can’t wait until I can share it with everyone.

And finally, as if that were too few New Things, I’m now one week in to a month-long trip to Thailand! I’m loving it so far. I discovered that I totally suck at trip logs, but luckily my travelling companion is a rather awesome amateur photographer, and he’s been keeping a blog at numist.net.

With any luck, after I get back to the states I’ll have some more time for personal projects. Perhaps I’ll even get a chance to finish something I started.

November Update

I guess I don’t have a complete blog entry to write on any one thing.. but there are several unrelated things that I feel like writing down. I recently joined Twitter, but I must suck at using it because none of these things ended up there.


Tragic. Introspective. Complicated. This isn’t really a place where I would feel it appropriate to go into detail, but it would be unjust to omit given that the other things here are significantly less important.


I don’t have a huge amount of flying time on it yet, but I’ve been enjoying the Blade mSR so far. I’ve been flying it mostly in smallish spaces, so I haven’t had the guts to really see how maneuverable it is- but I’m impressed with its stability and responsiveness so far. Also, either I’m a totally awesome pilot, or (more likely) it’s actually pretty easy to fly.


I haven’t had much time to work on the DSi lately. I’ve let Bushing borrow my hardware, and he’s been working on producing a small quantity of additional RAM tracing/injecting setups. This isn’t the kind of thing we can make many of (I estimate it takes about 6 hours to solder one together) but it’d be helpful for the community if more than one of these rigs existed in the world.


What time I have spent on DSi-related stuff has been on Temporal Hex Dump. It’s actually coming along okay- I took a bit of a development detour to improve it’s Mac OS support after I bought a MacBook Pro… but the next step is to add the part of it that is actually a hex dump. So far, it has the timeline navigation widget and a correlated list of memory transactions:

Temporal Hex Dump

Robot Odyssey

So, way back in April, I posted the first screenshots of Robot Odyssey on the Nintendo DS. This was I guess what I’d call a “binary port”. It runs the original Robot Odyssey binaries, via static binary translation, and with many modifications and UI enhancements to adapt the game for the DS console.

I never got around to posting pictures, but I actually did make significantly more progress on this project before getting distracted. I ended up implementing a pretty sophisticated system for patching the game and dynamically manipulating its world state, as well as “forking” additional copies of the running game very quickly for the purposes of having those forked-off copies render additional sprites. What is this good for? Well, I could have the game proper running on the DS’s top screen, while the bottom screen shows status icons for each robot, where the icons accurately depict the state of the robot’s bumpers and thrusters, and even what item the robot is holding at the time. I also had a mostly complete game load/save UI implemented, including a live preview that shows you where you saved while picking a game to load. My next step was going to be a UI for editing circuits inside your robots using the stylus.

Anyway, I know I’m being cruel by describing all these great features and not posting a video or a ROM image. Sorry. I promise I’ll make a video one of these days when I have a bit more time. As for a ROM image, right now the best I have is the source code for a tool which will generate a ROM given the original Robot Odyssey files. You can get the source from https://github.com/scanlime/robot-odyssey-ds.

To compile it, you’ll need devkitARM and Python. You’ll also need to put your original Robot Odyssey files (the DOS version, not Apple!) in the “original” directory in the source tree. You can leave them in a zip file, or strewn about the directory in random places. The translator knows what files it needs, and it will find them by SHA-1 hash.

I give no guarantees as to the current state of the source tree- I haven’t worked on it in a few months, and I think I last left it in a state where loading and saving were partially but not usably done. If you aren’t a developer, the source tree isn’t likely to be useful to you yet.

Homework assignment: If anyone in the audience wants to see this Robot Odyssey DS port turn into a real homebrew ROM image that anyone can download without compiling it themselves, we need to have redistribution approval from the game’s current copyright holders. Problem is, I have no idea who that is. I did email Warren Robinett about this project a while back, but he couldn’t tell me who currently owned the copyright. Following the trail of acquisitions, I think it might be owned by Houghton Mifflin Harcourt. Yeah, the textbook company. I did email them about the Robot Odyssey copyright multiple times, but I never got a reply. So, what now?

One approach is always to release it then look for the return address on the cease & desist letter. But, in all seriousness, I would like to be able to release a legal port of a classic game which the current copyright holder clearly has no commercial interest in. It seems like there should be some way to do this.

Moved off of LiveJournal

My old LiveJournal blog has served me well over the last four years, but I was getting tired of LJ. When I first started this blog, I mostly used it like any other whiny homesick new college graduate would. But nowadays, I use this less like a social networking tool and more like a way to organize my projects and post writeups of things I’m working on or things I find interesting. So the community aspect of LJ wasn’t really useful to me, and I wanted more control over the technical and stylistic aspects of the site. Most of all, I wanted proper permalink URLs 🙂

So, here it is. I installed WordPress, ran its LiveJournal importer, and wrote some Python scripts to automatically fix up a few things. I also tried to go through all of the old posts and tag/categorize them properly, and fix up any broken links. The theme is a slightly modified version of Green Park 2, with some small formatting tweaks and a little bit of custom artwork.

Love it? Hate it? Let me know!

Ants, meet tasty electrical doom!

One of the chores that came up this weekend was to take care of a minor ant infestation. Paul and I had noticed a few scout ants here and there, but there was no clear pattern. That is, until it became clear that they really like my desk.

Fine. The ants haven’t really been paying much attention to the Raid ant baits elsewhere, let’s try a few liquid ant baits on my desk. It’s not like my desk isn’t already covered with toxic chemicals. These baits (active ingredient: sodium tetraborate) have certainly caught their attention.

Upon closer investigation, it seems that the ants were probably originally attracted to the soldering station on my desk. Specifically, the soldering sponge where all sorts of fun substances (tin, lead, flux, bits of burned plastic) end up:

I was later reading the Wikipedia article on Borax:

Borax has a wide variety of uses. It is a component of many detergents, cosmetics, and enamel glazes. It is also used to make buffer solutions in biochemistry, as a fire retardant, as an anti-fungal compound for fibreglass, as an insecticide, as a flux in metallurgy, and as a precursor for other boron compounds.

… … …

Random update, DIY Wirelesss Guitar Hero

Yikes, it’s been nearly a month since I updated this last. A lot has happened since then… but I’ll skip to some more recent things.

David is a Californian, as of last Tuesday! He kept busy buying furniture and waiting in line at the DMV, but I did manage to see him at my birthday dinner last week. He and I cooked dinner last night: Ahi tuna steaks with a southwestern papaya/pineapple/habanero salsa, and a habanero pilaf dish on the side. Mmm.

I’ve been in a tinkery mood lately. I recently replaced my old noisy analog audio routing system (an A/B box and about 30 feet of cable) with a shiny new all-digital solution. I have a USB sound adaptor near the TV. It gets digital audio from the TV, and outputs directly to the speakers. It’s attached to the computer in my nearby cabinet, which does all the mixing in software.

After trying several software solutions for the audio mixing problem, I’ve settled on PulseAudio with a trivial extension module that routes audio from the TV input directly to the speaker output. I can now play TV audio, music from MPD, networked audio from my laptop, or any combination of the above. Latency hasn’t been noticeable, though I haven’t done any measurements yet.

The computer in my closet (mini-navi) has gone through a couple more revisions. In order to support audio mixing and icecast, I upgraded it from an NSLU2 to my old 700 MHz PIII laptop. This gave me the performance I needed, but that old laptop has some really serious Cardbus interrupt routing issues that prevented me from getting USB 2.0 working properly. After all that frustration, I splurged a little and got a mini-itx board with a 1 GHz Via C3. I love the novelty of mounting a motherboard with wood screws.

Before dinner with David last night, we decided to finally buy Guitar Hero. There had always been talk of building a wireless guitar controller

A windy day in San Francisco

Coffee and a muffin in my favorite Sunnyvale cafe. The train car full of baseball fans and their Keystone Light. Metro to Golden Gate Park. A long walk on the beach, south until the San Francisco Zoo. A single slice of pineapple pizza accompanied by fine people-watching. A great diner style cheeseburger with a re-run of Cops. Double cappucino at 9 o’clock. Stolen glances exchanged with a cute stranger after boarding the subway together. Wandering.