TrackPoint Mod II: A New Guide

I was able to get a TrackPoint module to work with an Arduino Pro Micro, but I have yet to get it work with the Keyboardio directly. I have been fighting my amateur soldering skills and it’s been pretty frustrating getting wires soldered to the TrackPoint module. It has also been frustrating trying to piece together all the information needed, so I will attempt to put all the info in this post for anyone looking to do this. It seems like a lot of you are interested in this mod, but like me have found it easier said than done.

Things you’ll need:

  • An Arduino Pro Micro (or a knockoff - I bought this 3-pack from Amazon). This is for testing for those who don’t want to risk damaging their $320 keyboard on the first go. Something more “substantial” like an Arduino Leonardo will work, but the Pro Micro is the cheapest, smallest Arduino that supports connecting a HID like a TrackPoint module.
  • Dupont wire. Whatever Dupont wire I had laying around has been an absolute nightmare to work with because it is made up of many smaller, thinner wires. If you can get Dupont wires that contain a single wire, that would be the way to go. I’m not sure if such a thing exists as Dupont wires aren’t meant to be stripped and soldered to.
  • 1x 100K Ohm resistor
  • 1x 2.2uF (or whatever micro-farad capacitor, is my understanding… I’m using a 22uF 25v capacitor… probably just needs to be 5v or higher rated)
  • A TrackPoint Module. The cheapest way to go would be to get a used ThinkPad T410 keyboard on eBay for $20 or so and take it apart. AliExpress probably has cheaper options but shipping is slow at best. Note: Nobody on the planet sells just the TrackPoint module. You must buy a TrackPoint keyboard, whether used from a laptop or new from Lenovo.com (e.g. the USB TrackPoint Keyboard for ~$55).
  • Soldering iron and related tools (solder, flux, etc.)
  • Arduino IDE
  • A micro USB cable to connect the Arduino to a computer for programming

I bought a used T410 Thinkpad keyboard, which came with a “ZD6” TrackPoint module. I was hoping for the slightly newer and cleaner-looking LVC9 module, however I have been unable to determine which Trackpoint keyboards have that particular module. I would assume a Thinkpad made around 2013-2016 as the T410 was produced during the 1st-gen i3/i5/i7 days, so like 2010.

ZD6 is just fine though, it turns out it has an identical pinout to the LVC9. I was hoping it would, as the two are very similar. NOTE: Not all TrackPoint modules share this pinout.

The Trackpoint is a PS/2 device that runs on 5v, so we shan’t not need a logic converter for use with the Arduino in the Keyboardio. If you are using a Teensy instead of an Arduino, you will need a logic converter since Teensy is 3.3v.

After much Googling, I found this: https://martin-prochnow.de/projects/thinkpad_keyboard which is the only other guy on the planet who seems to have accomplished what I am trying to accomplish with the ZD6 Trackpoint module. Props to him for blazing the trail and mapping the pinout.

Step by step:

1. Create the wiring to connect the Arduino and TrackPoint module

  • Some guides say you need two 4.7K Ohm resistors. This is not true if you are using an Arduino.
  • Heat-shrink is nice to have, but probably not necessary if you are connecting directly to the Keyboardio.
  • I like to use red, orange, yellow, green and blue wires. Red is 5v, orange is reset yellow is clock, green is data, and blue is ground. This is the same order as the pins on the TrackPoint module I am using. Note that the below diagram does not have the Reset wire going to the Arduino. I’m not an expert in how “resets” work but I believe it depends on the software you are using to interface with the TrackPoint module. I have the reset going to the Arduino after it hits the capacitor as indicated by the diagram, and the software I am using expects it on the Arduino’s D4 pin.


2. Connect the TrackPoint to the Arduino.
Red - 5v - VCC pin on Arduino
Orange - reset - D4 on Arduino
Yellow - clock - D3 on Arduino
Green - data - D2 on Arduino
Blue - ground - GND on Arduino

3. Install software on Arduino

  • Clone or Download the Github repo here. There are other repos you can use that will probably work. This one uses Stream Mode, which is the native operating mode of the TrackPoint module.
  • Copy Trackpoint.h and TrackPoint.cpp to the TrackPoint_INT folder inside the repo.
  • Open the TrackPoint_INT.ino file with the Arduino IDE
  • Import Mouse.h by adding #include <Mouse.h> underneath #include "TrackPoint.h" at the top of the file.
  • Ensure the Arduino Micro is the selected COM Port (Tools => Port), and Arduino Micro is the selected board (Tools => Board).
  • Smash that Upload button to deploy the code to the Arduino.

It works pretty well, although tends to move the cursor on its own for the first few seconds after it is connected to a computer. I can move the cursor by touching the PCB around the red nub. I think this is just a testament to how sensitive it is. Touching the nub will wake the computer from sleep.

Adjust Sensitivity
Default sensitivity is much higher than my TrackPoint USB keyboard. To get them pretty close (so that I don’t have to change mouse sensitivity in OS when I go between the Keyboardio Trackpoint and other “mice”), I changed the argument on this method call in the TrackPoint_INT file: trackpoint.setSensitivityFactor(0x4b); // 0xC0 (192) is default

Resources:

An incomplete list of all the TrackPoint modules you might stumble into in the wild + pinout info
Wiring diagram (Arduino to TrackPoint)
The official TrackPoint spec (not needed for anything, but it’s neat)
The GitHub Repo for the Arduino software to power the TrackPoint
Stream Mode vs Remote Mode
Pinout for ZD6 TrackPoint module
Wiring diagram (where to put the resistor and capacitor)

4 Likes

Next steps are to leverage the Arduino in the Keyboardio to interface with the TrackPoint module. Again, easier said than done, but here’s what I have so far:

The “circle” in the plastic next to the Expansion Slot pins inside the Keyboardio’s left side is the perfect spot to drill a hole to run wires through. It is just far enough from the Octopus stands to not be in the way, and just close enough to the Expansion Slot headers to run wires that won’t get pinched when the Keyboardio is assembled.

The black plastic is easily sand-able with 180 grit sandpaper, which I recommend doing to remove the protruding plastic created by the drill bit. It is very “soft” plastic and probably has a low melting point. When sanding, obviously you’ll want to protect the finish of the surrounding area with something like painter’s tape.

Alas, standard Dupont connectors will not fit with the stock Keyboardio top case. Someone else in another thread suggested cutting out some of the wood. This would work, but I don’t really have the tools to do this properly, and I am hesitant to take tools to the wood. As far as I know you can’t purchase a replacement if you screw it up (although Jesse might be able to get you one???). Anyway, this is a disappointing “oversight” in the design of the keyboard, and I can only imagine it was done for good reason.

This means that soldering to the pads on the underside of the left side PCB is the only way you’ll be able to connect anything to the expansion slots while using an unmodified top case. So far I have taken out one of the pads for one of the digital pinouts (never pull on a wire soldered to a pad!).

I have attempted to connect the TrackPoint module directly to the Keyboardio, however I seemed to have shorted D4 and D3 when I ripped off the pad and so needed to desolder the TrackPoint wires in part to ensure the Keyboardio still worked. I will probably make another attempt, however it is worth noting that there are no solder pads for 5v or Ground, only Dupont connectors. This means, as far as I can tell, you must solder 5v and Ground to the points where the Expansion Port Dupont connectors are connected to the PCB of the Keyboardio.

Also, I am not 100% sure how to integrate the TrackPoint-controlling software into the Keyboardio’s firmware. As a software engineer I have a good idea, but systems programming/C is not my strong-suit!

For now I will enjoy the fruits of my labor with the external Arduino solution.

5 Likes