Best stack for PS5 DualSense → PCA9685 servo control on Jetson Orin Nano Super?

What I’m building:

A 6-wheeled rover (RB-0 by planktonrobo) running on a Jetson Orin Nano Developer Kit “Super” (JetPack 6.2.1, Python 3.10). It has 12 active servo channels on an Adafruit PCA9685: 6 continuous rotation servos for drive wheels and 6 positional servos for steering. Control input is a PS5 DualSense over Bluetooth.

What’s confirmed working in isolation:

  • I2C communication with the PCA9685 via busio.I2C(board.SCL, board.SDA) (pins 3/5 on the 40-pin header)
  • Individual servo control using adafruit-circuitpython-pca9685 + adafruit-circuitpython-motor — both servo types respond correctly when tested one at a time
  • DualSense is paired over Bluetooth and visible to the OS at /dev/input/event9
  • Raw axis reads via evdev work correctly — confirmed left stick Y maps to ABS_Y (0=full forward, 127=center, 255=full backward)

What hasn’t worked:

  • pygame — unreliable on this platform. pygame.event.pump() doesn’t consistently refresh joystick axis values, causing stale reads. Likely an SDL/headless issue on Jetson.
  • approxeng.input — installed v2.6.4 but it only has definitions for DualShock 3 and 4. DualSense is not recognized (ControllerNotFoundError even with controller connected).
  • Combined servo + controller script — when we bring everything together, continuous servos start spinning the moment the PCA9685 initializes (before any controller input), and a positional servo on one channel behaves like a continuous servo despite testing correctly in isolation.

Specific questions:

  1. What input library do people actually use for PS5 DualSense on Jetson? Is there a working approxeng.input DualSense definition, or is evdev direct the right approach?
  2. Is there a known issue with initializing multiple PCA9685 servo channels together on Jetson/Blinka that causes channels to interfere with each other?
  3. Has anyone successfully run a PCA9685 + game controller setup on the Orin Nano Super specifically? The “Super” variant has caused issues with other libraries (e.g. Jetson.GPIO doesn’t recognize it without patching).

Any working example or recommended stack would be hugely appreciated.

Hi,
Please check if any kernel config has to be enabled for DualSense. If yes, please check developer guide to customize kernel:
Kernel Customization — NVIDIA Jetson Linux Developer Guide

Thank you for the suggestion. The hid-playstation module is not present in the Jetson kernel (5.15.148-tegra) and would require a full kernel rebuild to add. However, the DualSense is already functional through the generic HID driver. it appears at /dev/input/event9 and js0, and we can read axis values from it correctly via evdev. The hid-playstation module is not needed for our use case (just reading stick axes). The kernel is not the issue. The actual problem is with PCA9685 servo initialization behavior, continuous servos spin the moment PCA9685 is initialized in Python, before any controller input is read. And they also wont stop after the y stick is left neutral. Any recommendations on how to achieve the proper behavior? Different stacks maybe?

Hi,
If it is controlled through GPIO pin, this patch may be required:

Making sure you're not a bot!
[GPIO] Fix bit 10(SFIO) been set by gpiod

Yo may apply the patch and see if it helps.