Skip to content
This repository has been archived by the owner on May 3, 2021. It is now read-only.

PSNavi Setup

Guido Sanchez edited this page Feb 19, 2017 · 10 revisions

#Overview The PSNavi is kind of a strange controller. It's technically half of a PS3 controller. It has Thumbstick(L3), trigger(L2), shoulder (L1), DPad, PS, Cross and Circle buttons but does not have rumble or a lightbar. While it's not a commonly used controller for standard console gaming it is a very useful controller for VR because it fits in one hand nicely and can be used to make up for the fact that a PSMove controller doesn't have a thumbstick.

Unfortunately getting the PSNavi to work on Windows is more complicated than with the PSMove or the DualShock4 because the PSNavi doesn't behave like a proper HID (Human Interface Device). I'll go into more details about that in the Why is this so complicated section.

#Connecting over USB NOTE: If you are planning on using the PSNavi over Bluetooth, skip this section and go straight to Connecting over Bluetooth.

In order for PSMoveService to communicate with the PSNavi over USB we need to assign the libusb driver to it. This can be done with Zadig, the same tool we used for the PS3Eye camera setup.

  1. Plug your PSNavi controller(s) into USB
  2. Open Zadig
  3. Go to Options > List All Devices
  4. Select "Navigation Controller" in the device drop down list
  5. Select "libusb-win32" in the driver list
  6. Hit the "Install Driver" button

At this point PSMoveService should be able to see your PSNavi controller. If you launch PSMoveService you should now see this in your console output:

If you launch the PSMoveConfigTool you should see now see an entry for the navi in the controllers list. Because the controller is connected over USB you should also see the "Device Serial" and the "Assigned Host Serial" filled in.

Proceed to Binding a PSNavi to a PSMove.

#Connecting over Bluetooth Connecting over bluetooth is a bit more involved because we have to use the 3rd party controller tool ScpToolkit. The ScpToolkit makes DualShock3 and PSNavi controllers appears to windows as an XBox360 controller. However in order for ScpToolkit to manage controllers over bluetooth you need a second dedicated bluetooth adapter. I recommend getting a second ASUS BT-400 for this purpose.

##Bluetooth Setup video If you prefer a video setup guide, Chris Daley made this handy video for configuring the PSNavi controller over Bluetooth. He goes over the same steps listed below.

##Downloading ScpToolkit You want to download the 1.6.238.16010 version of the ScpToolkit. PSNavi support apparently is broken in the 1.7+ versions.

##Pre-Installation Setup Before installing ScpToolkit make sure to unplug the Bluetooth dongle you normally use for the PSMove controllers.

  1. With your dedicated bluetooth dongle you want to use for the PSNavi controllers plugged in, launch USBDeview.
  2. Find the device name, vendor id and product id of the dedicated bluetooth adapter.
  • For the ASUS BT-400 bluetooth device name is "BCM920702", the vendor id is "0b05" and the product id is "17cb".
  1. save the information for the device as a text file with ctrl+s or take a screenshot. You'll need these in the next step.

Also go ahead and plug all of the PSNavi controllers into USB now. The ScpToolkit will bind all plugged in controllers to Bluetooth during install.

##Run the ScpToolkit Installer Go ahead and launch the ScpToolkit_Setup.exe at this point. After the files for the toolkit install you should be presented with the "ScpToolkit Driver Installer".

  1. Make sure "Install Bluetooth driver" and "Install Dualshock 3 driver" are checked and that "Install DualShock4 driver" is unchecked.
  2. Check the down arrow next to "Choose Bluetooth dongles to install"
  3. Check the entry that corresponds to the bluetooth adapter information you saved from earlier
  • In my case: BCM920702 (VID:0B05, PID:17cb)
  1. Check the down arrow next to "Choose DualShock 3 controllers to install"
  2. Check all navigation controllers you have checked in
  • In my case: Navigation Controller (VID:054C, PID:042F)
  1. Hit the "install" button
  2. You should see a torrent of status pop-ups fly by about devices being found and connected

##Launch the SCPMonitor After the install completes you should see the "SCPMonitor" icon in your task tray:

If you don't, just search your start menu for "ScpToolkit Monitor (Legacy)" and launch it. Once it's launch you should see your bluetooth adapter (listed as "Host Address") and the controllers (listed as "DS3") connected via USB:

Go ahead and unplug the PSNavi controllers from USB now and then press the PS button on each controller. You should see the red LED at the bottom of the PSNavi blink for a few seconds and then go solid. At this point you should see the controller listed as Bluetooth instead of USB in the SCP Monitor tool:

##Verify XBox360 Controller Emulation As mentioned before, ScpToolkit makes the PSNavi controllers appear to applications like you have an XBox360 controller plugged in. We can verify that this is working by opening the controller test utility in the Windows control panel:

Then look for the "Controller (XBOX 360 for Windows)" entries:

Selecting the properties for the controller should give you a button test screen that you can use to verify that the controller emulation is working:

##Enable Gamepad Support in PSMoveService Because the Gamepad API I'm using in PSMoveService doesn't seem to play nicely with the DualShock4 controller connecting and disconnecting (causes crashes in low level Win10 code) I don't have gamepad support enabled by default. This can be turned on by setting "gamepad_api_enabled" to true in %appdata%\PSMoveService\ControllerManagerConfig.json:

Now when you launch PSMoveService the output window should show the controllers listed:

#Binding a PSNavi to a PSMove As mentioned in the overview, a PSNavi controller by itself isn't very useful because it isn't an optically track-able controller. However when attached to a PSMove controller in some way it becomes a very useful add-on. However we have to tell PSMoveService which PSMove controller is attached to which PSNavi controller. This is done in the controller settings for each PSNavi controller. There is a "Parent Controller" drop down that lets you assign the device serial of the PSMove controller you want to act as parent:

#SteamVR Button Mappings Once a PSNavi is assigned to a PSMove controller button pressed on the PSNavi will get sent to the PSMove controller in SteamVR. As far as SteamVR is concerned it will be as if the PSMove controller has all the buttons that the PSNavi has. Just like the PSMove controller, we can assign SteamVR button mappings for the PSNavi buttons in steamvr.vrsettings:

   "psnavi_button" : {
      "l1" : "grip",
      "l2" : "trigger",   
      "l3" : "touchpad",
      "circle" : "application_menu",
      "cross" : "system",
      "trigger" : "trigger"   
   },
   "psnavi_touchpad" : {
      "dpad_down" : "touchpad_down",
      "dpad_left" : "touchpad_left",
      "dpad_right" : "touchpad_right",
      "dpad_up" : "touchpad_up"   
   },  

#Attaching the PSNavi to the PSMove If you want to attach a PSMove controller to a PSNavi Xierion has kindly designed a clip you can 3D print that will hold both controllers.

You can download the STL file for the clip here

If you don't have access to a 3D printer, you can order a clip from Shapeways for as little as $16USD (shipping not included).

See issue #281 for full discussion.

#Why is this so complicated Whew! You made it all the way to the bottom. So at this point you may be asking yourself: Why do I have to do all this setup for the PSNavi? Why do I need to use ScpToolkit to make this work? Great questions! As I mentioned in the overview, the PSNavi is a wierd controller. Many modern controllers will present a standard Human Interface Device (HID) protocol to the operating system. A controller has a standard set of "HID reports" you can query from the controller. This makes it easy to write code to access the controllers over USB and Bluetooth.

Because the PSNavi controller doesn't have a proper interface you have to write lower level code to access it over USB and Bluetooth. On the USB side this is a bit annoying but it's not too bad. You can just use LibUSB to manually send HID reports to the controller. This is actually what I spent a fair bit of time in December working on.

The Bluetooth side however is a nightmare. Bluetooth is actually a suite of protocols. Bluetooth communication to a PSNavi is manged by the "Asynchronous Connection-less" or ACL radio link in conjunction with the "Logical link control and adaptation protocol" or L2CAP. In order to communicate with a bluetooth device directly this way (something the OS usually manages for you with HID interfaces), you have to completely take control of a bluetooth adapter and then deal with the ACL and L2CAP protocol management. This is a TON of new code to be adding to PSMoveService just to support one controller type. And I have yet to find a good lightweight cross platform library for bluetooth.

ScpToolkit already does all of the bluetooth connection management. And on top of that, because it emulates the XBox360 controller you can use the PSNavi controller in other games. From my point of it made a lot more sense to just leverage ScpToolkit instead of trying to made PSMoveService an all in one service. And honestly, if I hadn't done it this way it probably would have been another few months before I got PSNavi support implemented.