Hacking electric wheelchair drive

While building some robots for a museum we came up with the idea of using an electric wheelchair as the base for the robot.
Not wanting to replace the electronics we gave it a shot to try to use the existing motor driver and control it from an Arduino. On inspection it turned out to be a very common Penny and Giles Pilot plus drive.

Very little technical information is available about the interface between the joystick- and motor unit of this system. So we started reverse engineering. Here is what we have found so far.

By opening up the joystick and probing connections inside we found that the joystick movement are communicated as serial data @19200BAUD, 8 databits and even parity. Apart from the driving data the joystick unit also emit an additional, and completely different, data stream for controlling various lights and actuators on the chair.

The physical connection is using a propitiatory 6 way connector.

I turns out that the joystick sends drive data packets with checksum roughly every 10mS. Immediately after the data line changes direction and the motor controller returns a packet of data, again with checksum.
Simultaneously but not in sync another data signal is sent to control lights and actuators.

The data format seem to be completely non-standard but relatively simple to encode.

Probably for safety reasons the system does not tolerate any signals being missing or corrupted without shutting down so a fair bit of probing and fiddling went in to eliminating the joystick and replacing it with an arduino.
Here is a rough cut first Arduino sketch that allowed us to drive the wheelchair motors actuators and lights.
Quick shaky video of it running.

We plan to turn out a easy-to-use Arduino library for controlling the PG Pilot Plus soon.


5 thoughts

  1. I have a Pride Mobility 40A GC2 controller with the 4 pin joystick pigtail. I've figured out GND, INH, JStick, 24V pins on the Joystick connector and tried your code removing the actuator messaging but can't get anything from the device. Is there a bootup sequence or required conditions which must be met to turn the controller on and start taking commands? Do you know if the Inhibit line needs to be pulled low initially and then pulled to 5V or can it float at 2.5V?

    I'm also wondering if you figured out any other message conditions like Drive_modes?

  2. I noticed the example Arduino Sketch uses a 20mSec cycle for the motor control data yet it was mentioned that a ~10mSec cycle was expected by the controller. Which is correct or is 20mSec close enough that it still worked?

    I've not yet been successful talking to a PG GC2 controller. I will build a bidirectional cable and see if I can read back, or even see, the controller response packet.

Leave a Reply