scottstuff.net

Adding an AMB FME-W Automatic Tool-Changing Spindle to my CNC

Once I decided that I was going to upgrade my CNC, the first upgrade that I commited to was replacing the DeWalt DWP611 that came with my Shapeoko. The DeWalt is really just a small trim router. It’s well made but it has a very limited RPM range–16,000 to 26,000 RPM. A lot of milling activities need lower RPMs than that.

While researching possible options, I kind of fell in love with the idea of a tool-changing spindle. Expensive professional CNC machines generally have the ability to swap tools on the fly, so you can use a big square endmill for clearing out material rapidly, then shift to a ballnose for curves, progressively smaller bits for detail work, drill bits for drilling repeated holes, or whatever makes sense for the project at hand.

After researching automatic tool changing (ATC) spindles, it looked like I had 3 options:

  1. Buy a pricy, not-very-well-documented Chinese water-cooled ATC spindle. Most of the ones that I saw wanted 3 or 4 different air lines at different pressures to control the tool changer, plus a few different electric connections.
  2. Buy one of a couple different add-on tool changers on the market that bolt onto an existing spindle. There have been a few that have come and went over time; none have ever seem to have developed much of a following, and there’s some indication that they don’t actually work very well. It’s tough to get extreme mechanical accuracy this way.
  3. Buy the new (only shipping for a couple months) AMB FME-W spindle from Germany. AMB bought out Kress, who has made CNC spindles for years, and produced a model with a built-in tool changer and electronic speed control. For less money than the Chinese spindles, and probably better results than the add-on tool changers. Unlike earlier Kress spindles, it uses ER-16 collets, which means that it’ll take tools up to 38” or 10mm.

I decided to get the AMB spindle. And then all of the fun began. No one in the US sold them back in December. And none of the European dealers were willing to sell into the US. Eventually, I got in touch with Larry at Midwest Circuit Technology. He sells other AMB models, and AMB eventually coughed up a price that I was willing to pay. Three or four weeks later, I had it in my grubby little hands, along with a few extra tool holders.

AMB FME-W spindle

During the wait, I got started on the electronics needed to drive it. I was planning on connecting this to my Shapeoko initially and then upgrading the Shapeoko to something larger after a few months. The CNC controller that Shapeokos use has the ability to control variable-speed router spindles, but it doesn’t have any notion of automatic tool changers. In fact, it doesn’t really know much about anything beyond the bare minimum needed to do its job. The CPU underneath everything is an ATmega328p (basically an Arduino Uno, roughly similar to a Commodore 64), and it’s completely full. Grbl (the software used) uses pretty much every bit of RAM, every wire of I/O, and every bit of storage on the chip. If I wanted to add support for tool changers, then I’d need to do it outside of Grbl.

Here’s what I had to work with:

  1. The spindle needs 220V AC power to spin, 24VDC power for its electronics, and a 0-10VDC signal to control its speed.
  2. Tool ejection is controlled via 2 6mm pneumatic hoses at around 100 PSI. One hose unlocks the tool and the other one ejects it. To change tools, move to a tool storage slot, unlock the tool, hit eject a couple times, then lift up and off of the old tool. Move down onto the new tool, and re-lock onto it.
  3. According to the original spindle datasheet, the spindle interpreted 0V on its speed control line as a request to spin at 5000 RPM. That meant that there was no way to turn it off via the 0-10V line, which meant that I needed to put a relay of some sort onto the 220V AC line to turn it off. It turns out that the original datasheet isn’t correct–at 0V the spindle doesn’t spin at all, but I’m still happy that I have a relay for power. It makes it much harder for it to turn on accidentally.
  4. The only unused outputs from the Grbl controller are spindle speed, spindle direction, and coolant. There are no unused inputs into Grbl at all. So, if I want to send a signal to the tool changer to unlock and eject a tool, then I need to do it via some combination of spindle speed, spindle direction, and coolant activiation signals.
  5. I didn’t want it to be possible to eject a tool while the spindle was running. The tool holders weight a pound or so; sending one spinning across the room like a 25,000 RPM top is a nightmare.
  6. Debugging all of this blind seems painful, so I decided that I wanted to add an LCD display so that I could see the current RPM and messages about tool change status.
  7. I wanted to be able to add a compressor and a vacuum, both controlled via the same power switch as the CNC, so I didn’t have to dig around under the table looking for power switches.
  8. I didn’t want a ton of power cords running from the wall into my control box. Ideally, a single connection would be best.

I needed to put together a bunch of electronics to let me drive the new spindle, change tools, and generally use the CNC safely. In general, I tried to optimize for debugability first, then reliability, with cost somewhere further down the list. I didn’t want to end up with something that needed constant debugging but was too frustrating to work on and fix.

I’d never built anything like this before; I don’t have a ton of electronics experience, but most of this isn’t electronics, exactly–it’s more of a matter of reading datasheets, thinking through the consequences of what they say, and then creatively solving problems. It’s closer to plumbing or system administration.

Fairly quickly I decided to try to mount everything that I possibly could on DIN rails and to connect all of the wires using screw terminals instead of PC-style click-on wire connectors. That meant that I spent more time running wires, but very little time building complicated wiring harnesses, and changing my mind generally just meant that I had to unscrew a single wire and reroute it.

After considering it briefly, I decided that I really didn’t want a short inside my electrical box starting a fire, especially since I have a number of line-voltage devices in there, so I added circuit breakers for everything. I also have fuses on most of the DC lines. Nearly everything inside runs on 24 VDC power.

Everything about this screams “you need a microcontroller with lots of I/O pins to tie everything together,” so I ended up with an Arduino Mega sitting in the middle of everything on a nifty screw-terminal DIN-mount bracket. The signals from Grbl go into it, and it talks to the relays and pneumatic solenoids that actually control all of the extra parts. I ended up buying a Rugged MEGA from Rugged Circuits rather than using a stock Mega, because it’s happy being powered by 24 VDC (everything on this board is powered by 24 VDC), and because it has a number of extra safety and reliability features that make it much harder for me to kill it by accident with a misplaced wire.

I ended up going a bit overboard with the electronics for this all and overflowed my Shapeoko-sized box. This isn’t as complicated as it looks, really, it’s mostly power routing and measurement.

Electronics

Cnc Upgrades

After owning a Shapeoko 3 for several years but barely using it, I suddenly found myself swimming in milling projects. I’d finally spent enough time in Fusion 360 to be comfortable drawing up what I wanted to build, and my spate of Christmas projects had given me enough experience to finally be comfortable using the CNC. So, it was time to move on to bigger projects.

Except… not quite yet.

I managed to crack one of the plastic wheels on my Shapeoko almost immediately upon using it this year. It wasn’t completely unusable, but it wasn’t as rigid as it was supposed to be, and it was impossible to get replacements quickly enough. If you look at the picture of the inside of the jewelry box that I built, you can see that there was a lot of vibration while cutting the side walls. Also, the Shapeoko doesn’t have a lot of vertical clearance at the best of times, and once you stack a thick piece of wood on top of some MDF, and then try to use a long endmill, good luck actually being able to mill it without hitting the top of the Z axis’s range.

After a bit of research, I decided to kill two birds with one stone, and ordered an upgraded replacement Z axis for my Shapeoko. I bought a Beaver HDZ, which is dramatically heavier-duty than the stock Shapeoko part. It uses a ballscrew for motion instead of a slightly-stretchy belt, it comes with heavy-duty wheels, and it has about 2x the Z-axis travel.

This may have been a mistake.

The problem is that the HDZ is so much nicer than the rest of the Shapeoko. It’s a giant brick made of out anodized aluminum, rather than a bit of power-coated overgrown sheet metal. Luke, the guy behind Beaver CNC, did a great job of answering a couple of my questions, and the new Z axis was in my hands and installed on the CNC within a couple days, even though it shipped from the UK.

Now that the Z axis was fixed and the wobble was gone, the next couple problems came into view. First, I didn’t really like the stock Dewalt DWP-611 router that the Shapeoko used. It had an RPM range of 16,000-26,000 RPM, and a lot of things that I wanted to do needed RPMs of under 10,000 RPM. Getting good results out of CNCs, especially with metal, require having good control over RPM, and that isn’t easily possible with the Dewalt. Ideally, I’d be able to control the router’s speed entirely via software, and even turn it on and off at the beginning and end of jobs. It’s possible to get the Dewalt to do that, but it’s not really cost effective. So I started looking at alternative spindles.

Next, I really wanted the ability to mill bigger projects. The acrylic map mounting boards that I’d made were right at the limit of what the Shapeoko could practically cut on all 3 axes, and a number of things that I want to build are Much Larger. They sell size upgrades to the Shapeoko now; the Shapeoko XXL doubles the size and can cut ~30” square pieces of wood, but that’s still a bit small for making some of the things that I want to make. Also, it still uses the stretchy belts, and I really like the ball screw on the Beaver Z axis. So I started looking at alternatives to the Shapeoko after Christmas.

Right as I started looking for Shapeoko alternatives, Luke (of the new Beaver Z axis) announced that he was going to be selling CNC kits that could be used to build ballscrew replacements for Shapeokos, and he’d be supporting sizes up to 1500x1500mm.

So, instead of actually making anything with my CNC over the past couple months, I’ve been rebuilding everything from the ground up. New electronics, new software, new spindle, new frame, new motors. The only things left at this point are the Beaver Z axis and the limit switches.

And it’s been a blast. I’ve learned a ton, and I’ve accomplished a few things that I didn’t really think I’d be able to accomplish when I set out to do them.

At this point, I’m on the cusp of having a working 1500x1000mm CNC with an automatic tool changer that’s at least 7x as fast as the Shapeoko. I’ve written software in 3 languages, designed electronics, debugged mechanical problems, and fabricated parts from scratch to tie parts together that were never meant to work with each other.

Over the next few posts, I’ll walk through each of the parts of the new CNC and explain what I’ve done, hopefully in a way that people will find useful.

Jewelry Box

Continuing on in the “making gifts with computer-driven tools” series, next was a quick box for my mother’s birthday. I drew up a small CNCed jewelry box in Fusion 360.

I milled it out of 2 small pieces of Sapele. I deliberately left milling marks inside; in this case I liked the texture it gave to things. Also, I was rushing to make a shipping cutoff.

Inside

The box closes with magnets; they’re hot-glued into place.

Outside

Acrylic Topo Maps

As mentioned before, I decided to hand-make as many Christmas gifts as possible this year. I’ve been collecting cool tools, but haven’t really done enough to use them or exercise my creativity.

One of the things that I decided to make was a set of acrylic laser-etched topographical maps. I couldn’t find any easy examples online, but I know that I’ve seen similar things before–basically, you use a laser cutter to remove material from the back of a block of acrylic, leaving a 3D model of terrain carved into the block.

To start with, I wasn’t actually sure that I could do it, or get it to work. Digital elevation data is available online, but it’s never it the right format, and I wasn’t sure what the end result would look like, so I decided to do a test run. I have a lot of family in the northwest corner of Washington State, so I grabbed the first plausable looking map data that I saw from USGS and set some of it up for printing. The first sample was actually a slice of Vancouver Island:

My first attempt at laser-etched topographical maps. A slice of Vancouver Island

There are a few problems here–the laser cut all the way through one of the hills on the upper left, for example. On the other hand, the coastline and hills look awesome.

Since I had maps of Washington (and southern Canada) well in hand… I decided to print part of Africa next. Getting mapping data for anywhere in the world (at least at low-ish resolution) is easy. Getting political map boundries in a format that you can use to crop the topo map data: hard. Most of my prep time here was spent aligning my mask of Liberia and my topo data of Liberia to make the country boundries land in the right place. Here’s the result:

Map of Liberia

Once I had that in hand, I needed something to mount it on. I bought a small CNC router, but had never really used it to do anything interesting. This seemed like the perfect opprotunity to start.

CNCing out a mounting board

Here’s the finished result, ready to be shipped off.

Assembled map of Liberia

Once that was done, I went back to working on maps of Washington. I ended up doing 3 different views of Western Washington and the San Juan Islands for different people.

Finished maps
Detail of Bellingham, Washington, USA

A few things I learned:

  1. Digital Elevation Map data is easy to load into Photoshop, but it’s a pain to work with. Depending on the source, some of the data I worked with was 16 bit and some was 32 bit. Photoshop can load 32-bit greyscale images, but it loses a lot of tools in 32-bit mode. Even worse, the vast bulk of the image data was crammed into a tiny range of the 32-bit space. The upshot was that the whole image looked black, and most of the good tools for boosting the brightness wouldn’t work. If I recall correctly, the ‘exposure’ tool did work; I pumped everything up a ways and then converted to 16-bit grayscale.
  2. Pay attention to black and white levels. My first couple attempts went well. Then I got cocky, and I had a run of… let’s just call it “global warming” and “ice ages”, where my black levels moved and coastlines either flooded or were left covered in rendering artifacts. Adding an adjustment layer in Photoshop to boost the visibility of shades very near to sea level really helps.
  3. Mirror. You’re printing from the back, so mirror your image left-to-right.
  4. Invert. Generally, DEM data has brightest colors (white) as highest, and lasers engrave darkest colors the deepest. So you’ll need to invert your image to get it to print right.
  5. Like any image, go easy on the processing. I did one test where I cranked unsharp mask way up. It gave me nice, dramatic hills and mountains. And added reefs around every island. Oops.

Illuminated Christmas Star

In a fit of optimism, I pre-ordered a Glowforge laser cutter in 2015, but it didn’t actually arrive until late 2017. I’d have been more excited about it shipping if I hadn’t been out of town for a family funeral when they delivered it. The end of 2017 was a giant mess, and I didn’t really get much use out of the Glowforge during most of 2018.

For Christmas 2018, my wife and I decided that we really wanted to try to make presents for as many people as possible, and to encourage our kids (18 and 15 at the time) to do the same. The first thing I decided to build was a laser-cut led-lit acrylic Christmas tree topper.

Christmas Star

I only made a couple of these, and I wasn’t looking to turn it into an electronics project, just a design and learning-to-work-with-acrylic project, so I ended up buying the LEDs from Amazon. I bought a pair of LED shelf lighting kits that seemed to work well enough with a small amount of dismantling. It would have been cheaper to buy some LED light strip and wire up a power supply, but it also would have been more work, and by the time I added RGB color changing and a remote it probably would have cost 2x what buying the pre-assembled kit cost.

Mind you, I probably could have bought everything for 1/3rd the price off of Aliexpress if I’d been willing to spend a few hours shopping and wait for a few weeks for parts to arrive. Maybe next year.

I ended up using 14“light guide acrylic” from Inventables, but any 14” or 6mm acrylic would probably work just fine.

Cutting it out

If anyone’s interested, here’s my design. I’m not going to claim that it’s a great example of how to use Fusion 360–this is one of the first things that I ever created in it–but it worked well enough.

Here’s a video of the engraving process:

Resurrecting My Blog

Back in the mists of time (oh, say, 2003-2010), I was a semi-prolific blogger. I had a reasonably public presence as an open source programmer and needed a way to announce new releases of software, but also to comment on interesting things that I learned or just to rant or vent.

Over time, the amount of time that I spent on public non-work computer work shrank until there was really no point in updating a blog, and indeed not really even any time to keep it up to date and running. For a while I was directly managing ~16 people in two teams at work, and the last thing I wanted to do when I finally got away from work was to argue with people over the Internet for free.

Eventually I’d finally had one emergency Rails security update too many and turned my blog down. I figured I’d get back to fix it in a month or two.

I don’t even remember what year that was now.

Over the past year, I’ve had an increasing number of things that I want to share on the Internet, for the general use of whoever shows up searching for them. Things that don’t fit well into Facebook, or Google+ (RIP), or onto specific forums. So I decided to see what it’d take to make my blog work again.

I’d dreamed for years of spending a month or so writing code for it in Go; there are a few specific things that I’d love to implement that I haven’t seen done before, which I think could prove to be very interesting and useful to the 3 people left who still run their own blog sites.

So, for now, I’m giving Hugo a shot. It’s a a Go-based content management engine. It doesn’t have a database, it doesn’t do comments, it just reads content out of a directory and then writes out a pile of HTML files that can be served via a normal web server. It includes a couple plugins for adding comments via Disqus and friends, if you’re so inclined. I’m still trying to decide if I’m inclined or not. Surprisingly, getting data out of my old Typo blog and into Hugo was pretty simple. The hard part was recovering the ancient Postgres database the Typo used; once I’d managed to restore it, writing something to dump articles out of it into a format that Hugo could read only took a few minutes, followed by an hour or so to cleanup things like broken plugins and weird filter issues. It looks like links to Flickr images are still broken, but just about everything else should work, including inline code formatting, which turned out to be surprisingly easy.

My favorite hack

Something reminded me recently of project that I worked on around 10 years ago. I was a simple, clean solution to a problem that had remained unsolved for over a year. It was also one of the most horrible hacks that I’ve ever put into production.

At the time, I was working for a startup that was suffering from explosive growth. We’d began rolling out new sales and engineering offices all over the US faster than we could build the infrastructure that we needed to manage the offices. We built each office with two small Linux servers; one acted as a file server (with Samba) and the other did email for the office. The problem that we were facing is that each office was completely separate from the others–we had technical and political issues that made rolling out a VPN very difficult, so there was no easy way for salespeople to share documents between offices other than email. Which they did with great abandon, and it was killing our servers in larger offices.

The Great And Glorious VPN Project had tried to fix the company-wide filesharing problem repeatedly without success. There were too many requirements, too little money, and the technology wasn’t mature enough. I assume that they managed to deploy something eventually, but not for years after I left the place.

So, we needed a solution for distributed file sharing. It needed to be relatively quick, compatible with Linux and Windows computers, encrypted when passing over the Internet at large, able to deal with 100+ ms latencies between servers, and ideally not require a full mesh, because we were adding 1-2 new offices per month and having to reconfigure all of them every time would have killed us.

We played around with distributed filesystems like Coda and AFS. None of them fit our needs. We considered some sort of read-only replication with rsync copying each office’s content to other locations, but it was too messy to explain to people. We considered deploying Novell Netware (into a Linux shop) just for this, but it wouldn’t have helped enough. We would have rolled out Windows servers, but Microsoft didn’t have anything useful at the time. We looked at other commercial solutions, but nothing that we found was more than a partial solution.

Until one day, when I was sitting in a meeting about some other topic and the solution just popped into my head fully formed. It was really, really evil, and it would all Just Work. Either that, or it wouldn’t work at all, and it’d only take a few minutes to determine the answer. I think I excused myself (“I think I just solved the file sharing problem”) and walked out in the middle of the meeting to test it.

Remember, each office had 2 servers: one acting as a file server, running Samba, the other a mail server, running sendmail and an IMAP server. Here’s all it took: I configured Samba on each mail server, and had it join the same workgroup (I don’t think we were using domains yet) as the existing file server. So each Windows computer now saw two Samba file servers instead of one. The Samba file server software actually consists of two different programs: nmbd, which handles naming and network browsing, and smbd, which actually serves files. I fired up nmbd on each mail server, but instead of running smbd, I ran stunnel and had it encrypt any traffic that was headed to smbd and ship it off to a single file server in our headquarters, where it was decrypted and handed off to a real smbd process.

So, any Windows computer would browse the network and see two servers. One named something like “nfs.nyc” and the other named something like “global-nfs”. When they tried to connect to “global-nfs,” their packets were shipped off to a completely different computer in a different city. And everything just worked. It was dead simple. We’d been looking and spending hundreds of thousands of dollars to solve this problem and having to install new hardware in every office; in the end we spent a couple thousand on a single new file server and rolled it all out overnight with a minor software change.

The ugly part is that Samba shares state between nmbd and smbd, and none of that was actually being shared here. You aren’t supposed to run the two processes separately. It gets confused. Except it doesn’t actually hurt anything in this case. None of the problems actually impact anything that we cared about.

While I was at it, I used the same mechanism to standardize printing across the company, but that’s a story for another day.

Pancakes, with a side-order of problem-solving

So, lo and behold, it’s Saturday morning. It’s the day before Mother’s Day, and we’re going to be driving most of the day tomorrow, so it seemed like the perfect time to cook something a bit special for breakfast. After thinking about it a bit, I decided that what I really wanted was German Pancakes.

That posed a bit of a problem. You see, German Pancakes want to be cooked in the oven. And we’re in the middle of remodeling.

Our Kitchen, being remodeled

The oven goes about where the white bucket is sitting. Until the remodel is done, we’re stuck cooking with just an induction pad and a convection microwave. There’s no way the microwave will heat up to 450°, which is what the recipe calls for. What’s a hungry programmer to do? Why, improvise, of course. There’s one more cooking appliance available, although it’s not widely used for baking pancakes:

Our gas grill

Technically, there’s no reason you can’t bake in an outdoor gas grill, but getting the temperature control right is tricky. I let it heat up for 15 minutes, and then tweaked the settings to get it to stay around 450°. Then I put a stainless steel frying pan onto the grill (all of the cast iron is packed up for now) and let it heat up for another 10m, and checked the temperature:

Looks like it’ll hold 450° just fine. The recipe calls for 20-25m of cooking time, but that’s always seemed high to me; our old oven usually took 15-20m. After 17m I checked the pancake, and it looked perfect:

There’s nothing like grilled pancake for breakfast, now is there?

I need iPad blinders

These iPad reviews and App Store links are starting to get hazardous to my (financial) health. I mean, I really don’t need one. I have 2 Nexus One phones in my pocket, a Kindle DX, and I rarely go anywhere without a Macbook Pro. The biggest thing that I’d use a small tablet for would be to-do/calendar management, and I don’t think the iPad is particularly good at that–it’s not really possible to integrate information from multiple silos (Calendar, To-Do, Email, etc) given the iPhone/iPad architecture. My general opinion hasn’t changed much since the last time I wrote about it.

I’m not convinced that it matters though. Much like Stross, I have a low saving throw versus Shiny!

iPad: meh

Back in 2004 or so, I desperately wanted a 8-10” tablet from Apple. Something that would let me browse the web and check my mail while I was away from my desk, without forcing me to lug my laptop around. Something that would let me play with new ideas over lunch. Something that could use to build cool stuff.

Somewhere along the way, I decided that it was never going to happen. There just wasn’t enough of a market for it, and the form-factor requires UI that is drastically different from desktop OS X. They’d have to start from the ground up to build it. It wasn’t going to happen.

So, every 6 months or so, when the Apple Tablet rumor popped back up, I just ignored them–they were obviously bunk–and they went away on their own.

That is, until a few months ago, when the rumors shifted dramatically, and it became clear that Apple really was building a tablet. So yesterday morning, I was watching 3 live streams of the launch to see what magical thing Steve and company were working on. And now the rumors and the hype have cleared, and we’re left holding the iPad. Which is more or less exactly what I was looking for in 2004.

And I’m amazed to discover that I don’t want one. Not now, not in 2010.

It’s not like I’m immune to iProducts. I mean, I was literally in a car, on the way to the Apple store halfway through the iPhone announcement. We had to turn around when he announced that it wasn’t going to ship for 6 months. As a family, we’ve bought 9 iPods and iPhones over the years, including the very first model.

So why doesn’t the iPad work for me?

  1. It doesn’t do anything that I can’t already do. I have a laptop. I have a phone. I have a Kindle. The iPad can’t replace the phone or the laptop, and my Kindle doesn’t need replaced right now. Sure, it’s a better web-browsing platform than the phone, but not really all that much better.
  2. It’s too closed. I switched from an iPhone 3GS to a Nexus One a month and a half ago, and I don’t really want to go back. The iPhone is prettier, and Apple has more useful apps, but the N1 is much more useful for me. It has a dramatically better interface to Gmail and Google Calendar. It multitasks, so IM works right. When the browser is too slow loading a page, I can go check my mail and then flip back to check on the page loading later. Random third-party apps sync in the background on their own. Apps can extend the core OS experience trivially; install a Flickr uploading app, and the ‘Share’ button in the existing camera app suddenly knows how to upload to Flickr. Heck, I even replaced the default home page/app browser with Slidescreen, just because it fits what I want out of my phone better. None of this is possible with the iPhone, and none of it will be possible with the iPad.
  3. I think this is really the killer for me: the iPad is really just a media consumption device. I agree with almost everything Tim Bray has to say on the topic–the iPad is 98% oriented towards consuming existing content. Which is nice, sometimes. I mean, that’s all the Kindle is good for, and I love my Kindle. But it’s not what I want in a portable, always-with-me computer.

So what do I want in tablet-like device, or really any mobile computer, PDA, tablet, or phone? I want it to make my life better in some meaningful way. I want to build things with it. I want to look at how I do things in my life and create tools to make myself more powerful. And I don’t believe I can do that with the iPhone or iPad. They’re too tied to Steve’s View Of The World, and I’m not Steve. Almost everything that I’d like to have a device like this automate for me requires some sort of background processing, syncing with services online, and the iPad can’t do any of that right now. Maybe that’ll change in the future. Maybe iPhone/iPad OS 4.0 will fix that. Maybe the second-generation iPad will be able to do some of that. Maybe they’ll be able to convince me to fork over $100 just to write software for my own device. Maybe.

For now, though, I’m planning on sticking with my Nexus One, and I’ll probably keep an eye open for mid-sized Android tablets with high resolution screens. Android absolutely lacks the polish and shine of Apple’s products, but it’s moving amazingly fast, and it finally seems to be Good Enough for me. It’s reached a sort of critical mass, and it’s developing into a viable ecosystem of its own. At this point, the only thing that I really miss from my iPhone is the Kindle reader app, and I assume that Amazon is working on one for Android. Android’s not perfect, but it’s getting quite good. And while it lacks Apple’s polish and shine, it doesn’t have the same shrink-wrapped, pre-packaged, plastic feeling that so many interactions with Apple have these days.