Handicam: Optical registration for Handibot?

Handicam software running beside Handibot with attached markerboard and camera.


I use a Handibot for CNC woodwork. If you aren’t familiar, Handibot is a portable CNC router that you place on top of your workpiece to make pre-programmed cuts. It can cut the same designs and perform most of the same tasks as a full sized CNC machine, but compared to full-size CNC machines, it’s compact — small enough to pick up and move around. Since the machine sits on top of a workpiece, the size of project it can tackle is virtually unlimited. The downside of the compact design is that it only cuts 6″x8″ at one time before the operator must physically lift and reposition the machine for the next “tile” of a cut. So for a large project on a 4’x8’ sheet, you may reposition and register the Handibot 96 times.

VCarve displays a large cut with 96 tiles.

Today, when I’m performing multi-part cuts, I use a custom rigid jig to register the position for each cut. These jigs aren’t bad, but they require building a new tool, possibly with access to different machinery, need additional workspace, and physically limit the size of my projects.

For example, my “3 bay jig” limits me to 24″ on the Y axis and requires a 44″ deep work surface. When I use this, I’m not getting all the value I want from a compact CNC machine.

Idea: Optical Registration

I’m going to try an experiment. Can I improve my experience with the Handibot by performing multi-part cuts using computer vision for registration? In short, can I use computer vision to capture a full view of my workpiece (ie: “scan” the workpiece), then identify the target and current position of the machine on the work surface, for each cut, with high precision (+/- 0.01”)? And will precise computer vision-based registration make for a better user experience?

Full disclosure: I chose this project as an opportunity to learn about computer vision and get experience with OpenCV. My goal was not to compare and find an ideal registration method, so I did not consider alternatives. That said, I don’t believe my precision requirements could be met with alternatives including LIDAR, light-based proximity sensors (eg. the popular Sharp proximity sensors), or ultrasonic sensors. If you disagree, and can point me to a good alternative to a camera-based solution, please let me know.

Summarizing Findings

You can use and modify Handicam yourself, and I’ll provide more details on GitHub. For this post, I’m jumping straight to findings.

A clean workpiece.
Masking tape added to workpiece to provide landmarks for image recognition.
Scanning a workpiece using Handicam software. Visible in this image are a custom camera mount and the custom markerboard that’s used to precisely determine camera orientation and physical world dimensions. Also note, the Handibot isn’t yet present.
Registering the Handibot with support from Handicam. Note that the markerboard is now sitting side the Handibot. The Y-Axis of the Handibot must be set about halfway back so the camera’s view of the markerboard and workpiece is not obstructed.
Image of Handicam software. The window on the left shows a whole workpiece with 9 tiles. The window on the right shows the Handibot’s current position relative to the selected tile. The +/- error is calculated by comparing measured offsets over a number of frames.

Good news: We can create an optical registration solution for the Handibot with better than 1/100” precision. Doing so requires some custom parts, including a camera mount and Aruco marker board. It also requires a good camera with control over focus and exposure and reasonably good lighting. The code on GitHub is available as a proof of concept.

Now the bad news: Using Handicam requires manually placing the machine for each tile. Accurately maneuvering the Handibot, which weighs about 50lbs and has an anti-skid rubber bottom, is difficult and cumbersome. So, for example, while Handicam can provide feedback that the Handibot needs to be moved 1/32” on the X-axis, lifting and moving the machine that distance by hand, within a tolerance of 1/100”, takes a lot of frustrating trial and error. In my experience, I could do it, but it took minutes to adjust the position for each tile.

With access to Handicam, I still prefer a rigid jig. A jig gives me reasonable precision and significantly less effort per tile. That said, there are some future work areas that could greatly improve the solution and make it viable:

On demand single-tile CAM, based on the Handibot’s current position: Rather than pre-program a grid of “tiles” for a complete multi-part cut then force the user to accurately position the machine for each tile, generate the cut instructions for any position that the user places the machine, on demand. This way, the user can roughly move the machine to where a cut is needed, without fussing about accurate placement, but still get a precisely aligned cut according to the machine’s measured position on the workpiece.

Autonomous movement for the Handibot: Turn the Handibot into a mobile robot, using wheels, tracks, or belts for accurate repositioning. Since I started work on Handicam, I’ve learned about some new options for CNC routing with autonomous motion. Considering these new options, I think that the Handibot and its tile-based approach for large cuts may still offer some advantages: The weight and anti-skid features that make for tedious manual repositioning between cuts are actually a virtue at cut time, because they ensure the machine stays precisely aligned in spite of large forces on the router that could move the whole machine. Further, the tile-at-a-time approach enables the user to choose to add additional work-holding when needed.

I don’t currently have any concrete plans to pursue these ideas, but if I a tinker more, I’ll try to share. Thanks!

A Cheap Vibration Table for Concrete Tiles

Here’s a simple vibration table for making concrete tiles, made with a Black and Decker Mouse, some screws, nuts, washers, and compression springs, and scrap wood.

The springs I used are 1 3/4″, 1/2″ OD, .054WG, but any reasonable gauge should work. Tighten the screws to create a little compression. Use a pair of nuts on each screw to keep the nut from backing off under vibration.

I mix concrete to a “wet sand” texture and trowel into molds. The table helps create an even distribution with no voids and levels out the open surface of the mold.

Mecanum Wheels

Mecanum wheels are cool. Each wheel is composed of a series of rollers, pitched at 45 or -45 degrees. When moving forwards and backwards, the rollers do not engage, but when the front and back wheels rotate in opposite directions, the rollers engage to move the vehicle left or right.

These wheels are 3d printed, except for machine screws and bearings.

Modeled in Rhino3d with Grasshopper. Model is parametric, so it’s possible to change number of rollers, overall size, etc, easily.
Wheel assembly: Rollers, bearings, machine screws, roller hubs, and stand offs.
Wheels were printed with a Form 2 SLA printer.
Rollers were printed on Replicator 2 FDM printer with “Semiflex” filament. Semiflex provided reasonably good traction on wood floors.

The vehicle in the video was as basic as I could make it. Electronics are an ESP8266 for control and 2 dual H bridge motor controllers. The ESP8266 has 9 usable I/O pins, just enough to control 4 motors if they share a PWM pin.

The 2nd ESP8266 you might see in the video is running ESPLink and acting like a WIFI serial port for remote code updates.

Some learnings from building:

  • This was my 2nd time using Ninjaflex and Semiflex. It’s a challenge to print, because it’s so soft that it easily flexes inside the filament drive of an FDM printer, instead of being forced down the thermal barrier tube. It requires some babysitting to catch issues. If I plan to use this a lot, I’ll look into modifying my extruder.
  • For the rigid parts, I used Form Labs Gray Resin, which is designed for prototyping. It has some nice properties. It cures easily and sands well. It was a bit brittle and since the bearings were “force fit” into place with pliers, I managed to crack some of the bearing holders during assembly. I fixed some of these by just applying some resin to the crack and curing under light.
  • I *may* have had trouble with some bearing holes due to bad tolerances from my curing process. To date, I’ve just washed my parts by dipping and sloshing in Yellow Magic and IPA, then curing in open air under a light intended for curing acrylic nails. Maybe it’s time to try an ultrasonic bath and underwater curing.

Some learnings about Mecanum wheels:

  • Motion in the video may look smooth, but if you look closely, you can see some bouncing. When driving, you can definitely hear “clacking” as the rollers come in contact with the surface. This suggests that each wheel is often losing contact with the surface, so the traction isn’t great. A larger number of rollers would help.
  • Mecanum wheels are known to operate poorly when the weight distribution of the vehicle isn’t uniform, or under too much weight. I experimented with adding up to 15lbs of weight to the vehicle and it definitely had problems. Particularly, side-to-side motion stalled or became erratic.

Window Bench

I wanted to build a storage bench for this area in my attic workspace. There were a couple of challenges: This house is more than a hundred years old, and nothing is square. The window sill is +1/2″ higher left-to-right. There’s a vent in the wall on the left side. The windows are casement-style and open to the inside.

Modeled in Rhino3d. I tried a few different designs and finishes and landed on this one.

To deal with the vent issues, I opted to work ventilation into the front of the bench. These are removable panels, so the design can change in the future. The window lid is sized so that it can open whether the windows are opened or closed. The left section can be closed off if I later decide to isolate the vent.

Finished with piano hinge and safety lid supports.

Vent Screen

Medium: Walnut. I purchased this nice free-standing wardrobe and wanted to place it in dead space in the entry hallway. Unfortunately, this placed it right on top of the cold air return vent for our furnace. I made a skirt to elevate it and match the height of the baseboards, then fabricated this vent screen, based on a photo my wife took of an architectural element in Jaipur.

Inspiration photo by Shubhie.
Shopbot Alpha doing final pocket pass.


  • My first attempt at the vent cover was destroyed when the router bit slipped in the collet, about halfway through the deep pocket cuts for the hex pattern. A nearly identical slip happened on my second try, but I caught it in time to fix it. Most of my Shopbot experience is with softer MDF and plywood. Perhaps I need to plan some pauses to check and tighten the collet when working with hard woods.
  • Home Depot has some surprisingly nice hardwoods. This walnut was a nice match.

Xaar 128 Printhead Driver

The Xaar 128 is a piezoelectric inkjet printhead used in large format vinyl sign-making. It *might* be useful in 3d printing, conductive ink, or masking applications.

Why piezo? TLDR: Most inkjet printheads are “thermal”: They work by superheating a fraction of the ink in a chamber, turning it into gas, which expands to force the remainder of the ink out of a nozzle. Superheating limits the range of materials that can be used in these printheads. Piezoelectric printheads are less common, and since they use a mechanical operation to force fluid out of a nozzle, they don’t have to modify the state of the fluid to operate, and can work with a broader range of materials.

More details on the Rep Rap wiki.

Starter source code on GitHub.


  • While I planned to try some different materials with the Xaar 128, I started out with the Solvent Ink that it’s built for. I was mostly using used printheads that I could buy inexpensively on eBay, since new Xaar 128s are pretty expensive. Nozzle clogs were a big problem. I had to flush the nozzles every time I sat down to work. This wasn’t really compatible with an after-hours hacking schedule.
  • I used flexible flat cable (FFC or FPC) to connect my board to the printhead. I’ve been burnt by overflexing ribbon cable before, so I thought this was a good idea. But I didn’t properly anchor the connection points. After some use, I started getting erratic behavior and stalling from the printhead. After a lot of debugging, I found that the leads on one end of my cable had overflexed and would break contact at certain points in the movement. Lesson: anchor connection ends so that no flexing happens near the exposed leads.
  • I was never able to consistently push anything more viscous than solvent ink through the printheads. Epoxy or photo curing resin is much more viscous (eg. ~1000-2000+ cp vs ~10-20). This means these heads may be useful for something like depositing a low viscosity binder for powder printing, but probably not for depositing a material that can harden into a solid by itself. I’d love to find a printhead that can.

Boxen #1

Macro photo printed as a large format bitmap made up of 3d boxes in PLA Plastic, printed with Makerbot Replicator 2. Size: 6.5 feet X 2 feet.

Each “pixel” is a 3 dimensional box that tapers into a quadrilateral opening. The corners of the quadrilateral are determined by sampling the grayscale intensity of a grid of 9 subpixels within each box.

Example quadrilaterals, based on grayscale sampling

Inspired by “Bloom” from UC Berkeley.

Veronoi #3

Medium: PLA Plastic, printed on Makerbot Replicator 2 in 8 parts.

Modeled in Rhino3d with Grasshopper. Size of the veronoi part is 20″x20″. This was a super-challenging project to do with an FDM 3d printer, due to the large number of overhangs and small cavities. Each part took 10+ hours to print, but perhaps even more time to finish. I used a large amount of support material that was, at first a friend, then… a nightmare to extract and sand down.

Prototype part, before geometry was smoothed, shows volume of support material.
Support material removed. Rough sanded.
8 parts, primed and medium-sanded.
Original model.

Some learnings:

  • If a space is too small to get your fingers into, it’s going to be a bear to sand. I took a few breaks from this project because finishing was so tedious.
  • This project likely would have been much easier with access to a dual head printer with water-soluble filament or an SLA or SLS printer. When I started this in 2013, I didn’t have any access to such equipment and printing something this size with an online service would have been cost-prohibitive.
  • Solvent glue works great with PLA.
  • Makerware’s generated support is pretty good, but I could have saved myself a lot of time by modeling my own support for precarious overhangs and certain bridges. I had to throw away some prints and patch some gaps when Makerware’s support failed.

Nib to Bar Chocolate Making

Adding nibs to juicer.
Separating liquor. Luckily we thought to lay down newspaper. Chocolate making is messy.
Adding liquor, cocoa butter, sugar to melanger.
Melanging 18 hours later.

Really smooth.
Separating about a 3rd of mixture for tempering.

Letting temperature come down slowly. Maybe too slowly. It took all day.
Adding back in to temper remaining chocolate.

Chilled and ready to demold.

Wireless Sensing

I haven’t posted about soil moisture sensors in ages, but I’ve completed a number of iterations and I thought it’d be fun to look over the evolution of the hardware. My goal has been to build a small, low power, inexpensive device, that I can place in indoor and outdoor plants to collect soil moisture, light, and temperature readings. I shared some early information on sensors more than a year ago and will have more to share, but this post will focus on the wireless sensor relay.

This device collects readings from one or more sensors at an interval (15 minutes), then broadcasts the readings to a receiver that uploads data to a store where I can crunch numbers, trigger alerts, and generate graphs.



Hobby-friendly PCB shops typically have a 2-week turn around. I’m new to this and wanted to prototype at my own pace, so I made my first boards on a CNC router. These are “channel isolation” boards, where an an outline is etched around the conductive channels on a copper clad board.


Ultimately, this enabled me to knock out a few boards in a weekend, but it required a lot of experimentation, tweaking, and router bits to get usable results. Producing a single board required a lot of effort to calibrate the CNC for two routing passes (for 2 sided boards) and drilling. A minor leveling or alignment issue would result in a useless board. Once I found a reasonable design, I moved over to a PCB shop, trading long turn-around times for less overall effort and more consistent results.


I experimented with a handful of different radios, but mostly focused on the TI CC2500 and Nordic NRF24L01. Both are available as ~12mm X 20mm modules with a trace antenna. The best price I found for the CC2500 at volume was about $2.00. The NRF24L01 was about twice that. The CC2500 was very inexpensive and has very low idle-time power consumption. But it required a lot of work to configure properly and handle errors. In my experience, it worked very poorly in the presence of noise from other CC2500s. The NRF24L01 worked out of the box, had better range, and was more resilient to interference. Ultimately, I tired of debugging the CC2500 and elected for the pricier NRF24L01.


“Final” Product

My latest iteration is a 1.45″ square board, with screw terminals for any combination of 3 temperature, light, and moisture sensors. It uses the Nordic NRF24L01 2.4ghz radio with trace antenna, which gives it enough range to work anywhere inside or immediately outside my house. It runs on an Atmel AtTiny24 microcontroller. The sensor readings are taken from the AtTiny’s on board ADC (Analog-to-Digital Converter). The whole unit is powered by a 3.3V battery. Sensing and reporting every 15 minutes, the battery should last 2-3 years.