Haptic Tabletop Puck - development resource center

The Haptic Tabletop Puck (HTP) is a small device invented to explore and develop applications that use haptic feedback on interactive tabletop surfaces (for now, Microsoft Surface). The idea is simple and inexpensive: by attaching a plastic rod to a servo-motor that controls its height, and by sensing pressure on top of the rod, we can provide programmable levels of height and haptic response depending on the location of the device on the table. Since the tabletop provides tracking of fiducial markers, the HTP only needs to have a marker on its bottom.

For more details, you can check the paper published in the ITS (Tabletop 09) conference and the accompanying video.

Since the development of our two first generations of the htp, we have decided to open our designs to anyone that wants to build it and experiment with it. We hope that the resources in this page are useful to those of you that are interested in experimenting with haptic feedback on tabletops. You are welcome to try our designs or try new approaches. If you do, we would also love to hear from you.

The files and instructions provided in this page are provided AS IS; in fact, most of the designs and software included in this page are still at the prototype level, which means that you might need to figure out some elements yourself. In the future, we plan to streamline the contents and provide accurate descriptions of the instructions; in the meanwhile, feel free to send us an e-mail if you need some advice: or


Basic elements

The current version of HTP works on a Microsoft Surface(TM) interactive tabletop (first generation). Our prototype takes advantage from the multi-object fiducial marker tracking and identification of the Surface SDK; however, there is no reason why HTPs cannot be built to work on top of different interactive surface technologies, as long as the absolute position of the HTP on the display image can be detected. For a setup with several HTPs, it is necessary that the absolute position of each one of the devices and their identity are recognized.

Besides the interactive surface, and the computer running it, you need some way to actuate the servos from the computer and to sense the pressure on top of the rod. We use the phidgets system. Any of the InterfaceKit boards will do for the sensing of the pressure. To control the servos you can use any of the phidget servo usb adapters, although we use an advanced servo control board that allows us to power up to 8 servos from the same usb port.

HTP sets

We have generated a number of different HTP designs with different sizes and different characteristics. Here we make available three of the designs for you to download, 3DPrint, and build. The next subsection describes elements common to all designs. The subsections that follow list all the components and files of each of the designs separately.

We provide two files for every piece of the model. Files with the SLDPRT extension are solidworks models that can only be opened with the solidworks software. The STL files are the ones usually required by the 3D printer to generate a copy of the model. Note that, since the precision and resolution of 3D printers is not perfect, you might need to sand off small parts of the model before the servos and other pieces fit perfectly together.

The files are all compiled in this zip file. Please, check the sections below to know which files to print for which HTP models.


  • Bottom cover. The casings of the HTP as created by the common 3D printer are usually too harsh on the surface of the table. We recommend covering the bottom side with some kind of fabric or felt. It is preferable to use black, non-reflective material because otherwise the bottom of the HTP is detected as undesired blobs (other than the byteTag, see next item in the list), which can interfere with the rest of the interface of the table.
  • Byte tag. Tracking the puck will require that you stick a Surface ByteTag on the bottom side of the device so that it is visible by the cameras underneath the surface. A number of these tags are provided with the Surface itself, but you can also print your own from the surface SDK.
  • Cable. Current versions of the HTP are tethered. Although we are already designing and developing a wireless version, the designs available below require a cable connecting the servos and the sensors to their corresponding boards. Different designs require different number of conductors for the cables. You also have to consider the flexibility of the cable for comfortable use. We have successfully used round conductor flat cables, split to the number of conductor required (the kind of cable that you see inside computers, connecting buses), or round multi-conductor cables of under 4mm thickness.
  • Pressure sensor. In order to close the haptic loop, HTP's have a pressure sensor on top of the rod. We have used the 0.2" Interlink Electronics Circular Force Sensing Resistor (FSR).
  • Micro-servo. All the designs below use a Hitec HS-65 Metal Gear servo to move the rod up and down. To fit it in the casings, you need to clip out the plastic extensions that come with the servo for attachment. You also need to clip 3 out of the four arms of the rotating head. It is possible to use non-metal gear alternatives of the servos, but we recommend metal, since forces are often strong enough to break the servo.

Small HTP

This is the smallest HTP that we have been able to build so far.

  • Casing. The main box: G4-Body.SLDPRT, and G4-Body.STL
  • Lid. To close the main box: G4-Cap.SLDPRT, G4-Cap.STL
  • Rod. G4-Rod.SLDPRT, G4-Rod.STL

In this HTP the rotating head attaches directly to the rod. The rotating head piece must be perforated to have a longitudinal groove that lets the rod base move horizontally with respect to the rotating head. A screw holds the rotating head in between the two sides of the rod base.

Standard HTP

This is our current standard model. The main difference with the small HTP is how the servo is attached to the rod. Whereas in the small HTP this connection is direct, the standard uses an extra plastic piece that connects a metal ball screwed to the rotating head to another ball screwed to the bottom end of the rod. These extra pieces are usually included with the servos.

  • Casing. The main box: G2-Body3.SLDPRT, G2-Body3.STL
  • Lid. To close the main box: G2-Cap4.SLDPRT, G2-Cap4.STL
  • Rod. G4-Rod-24-4.SLDPRT, G4-Rod-24-4.STL

HTP with Brake

This model is larger, heavier and chunkier, but it includes a brake. The brake is just a piece of rubber that is actuated by another servo and pushes against the surface through an opening at the bottom of the HTP. This model requires an extra servo (Hitec HS 55) and a piece of rubber material that has to be glued to the "block" piece. Also, the brake servo requires a longer arm to be able to reach the bottom.

  • Casing. The main box: G2-Body7.SLDPRT, G2-Body7.STL
  • Lid. To close the main box: G2-Cap4.SLDPRT, G2-Cap4.STL
  • Lid 2. To close the brake side of the box: G2-Cap5.SLDPRT, G2-Cap5.STL
  • Rod. G4-Rod-24-4.SLDPRT , G4-Rod-24-4.STL
  • Block. G2-Block2.SLDPRT , G2-Block2.STL

Demo software

This file contains the current version of our demo software. Please, be aware that we provide this software just as courtesy to facilitate the use the HTPs yourselves; in it you can find many examples of how we programmed the different toy-applications. However, the code is not clean or extensively commented. In the future, we are considering creating a clean API, but this will have to wait for us. Please, contact us if you are interested in this kind of project!