Site icon JetsonHacks

PWM Servo Driver Board – NVIDIA Jetson TK1

Analog servos interface using Pulse Width Modulation (PWM). Connecting a PWM servo driver board to the Jetson TK1 over I2C makes interfacing with servos easy. Looky here:
YouTube Poster


In an earlier article, RobotGeek Pan and Tilt Kit, we attached two servos to a Jetson TK1 via an Arduino. The micro controller Arduino is well suited to controlling analog servos, and is easy to interface with from the Jetson. However, one of the issues is that this approach requires two different code bases on different types of machines. Though the Arduino is straightforward to program, the cognitive overhead of running two different processor types and programming models can confuse issues. In other words, it can be a pain in the ass to add an Arduino to the mix just to talk to servos.

So why not just use the PWM GPIO pins on the Jetson? The answer has to do with hardware. PWM requires some pretty precise clock work and refresh, something a SoC like the Tegra K1 doesn’t do very naturally especially when running a non-real time OS like Ubuntu. What to do, what to do …

It turns out that Adafruit makes a breakout board around a PCA9685 chip. Using I2C (only two command pins) the breakout board can control 16 free-running PWM outputs! You can also chain multiple PCA9685 boards together to control up to 992(!) PWM outputs all together. The PCA9685 has a built in clock, so the Jetson does not have to continously send signals to the device. Adafruit adds several other niceties which makes this a great alternative to other solutions.

In addition, the breakout board can also send PWM pulses to LEDs so that you can dim them. The board has built in resistors for the LEDs so you don’t have to worry about that either.


PCA9685 Breakout Board – Adafruit 16-Channel 12-bit PWM/Servo Driver – I2C interface – PCA9685


The following parts were used in the video for the demonstration to give you a feel on how to hook things up. Your design will determine if any of these are necessary or not.


The PCA9685 is connected to the I2C Gen2 signals on the Jetson J3A1 connector as follows:

GND J3A1-14 -> PCA9685 (GND)
VCC J3A1-16 -> PCA9685 (VCC – 3.3V)
SCL J3A1-18 -> PCA9685 (SCL)
SDA J3A1-20 -> PCA9685 (SDA)

On the PCA9685 breakout board that is a signal labelled V+ which may be used to power the servos. As an alternative, the power may be supplied through the power terminal block. Servos can be power greedy, so you should drive them from a separate power source rather than from the Jetson.

In the example, two servos are connected to the PCA9685 board. On the pan/tilt mechanism, the lower servo is connected to channel 0 and the upper servo is on channel 1. Here are some pics:

Software Setup and Installation

Once the board is wired up, turn the Jetson TK1 on.
In order to be able inspect the PCA9685, you may find it useful to install the i2c tools:

$ sudo apt-get install libi2c-dev i2c-tools

After installation, in a Terminal execute:

$ sudo i2cdetect -y -r 1

You should see an entry of 0x40, which is the default address of the PCA9685. If you have soldered the address pins on the PCA9685 (as is the case if you are using multiple boards chained together) you should see the appropriate address.

JHPWMDriver Install

There is a PCA9685 driver available in the JHPWMDriver repository on the JetsonHacks Github account. To install:

$ git clone
$ cd JHPWMDriver
$ cd example

The example is specifically for the pan and tilt mechanisms servos shown in the video, but can be used as a guide for creating your own example code. In the source file ‘servoExample.cpp’, uncomment the lines:

// int servoMin = 120 ;
// int servoMax = 720 ;

and change the values to those appropriate for your servo. Good starting points are 150/600 for initial exploration. Because servos are analog, these vary from model to model, and possibly device to device.
Once you are satisfied:

$ make

will build the example. To run the example:

$ sudo ./servoExample

The ‘sudo’ is required to gain permission for the I2C bus from user space.
At this point, all sorts of magic happens! Well, to manage expectations, the servos move around a bit with the demo code.

Equipment and Supplies

New to electronics? This is a pretty easy project, looky here: Electronics Tutorials for some introductory material on how to start becoming a master.


Adding a servo or 900 to the Jetson is straightforward using this approach. The nice thing is that you can keep your code base running on one machine, and not have to worry about intervening protocols or communication channels amongst multiple machines. This is useful for a myriad of projects.

Exit mobile version
Skip to toolbar