Skip to content

PS Move (ZCM1 / ZCM2)

Status: hardware-validated.

The PlayStation Move is paired over USB but streams its IMU only over Bluetooth. The PS3-era ZCM1 carries a magnetometer (enabling 9-DOF fusion); the PS4-era ZCM2 does not.

Variant Gyro + accel Magnetometer
ZCM1 (PS3 era) discrete 2-axis + 1-axis gyro + 3-axis accel (MPU-6050-class) 3-axis (AKM)
ZCM2 (PS4 era) MPU-6500-class none

Accel range ±3 g, gyro ±2000 dps, ~175 Hz effective (the report packs two IMU half-frames).

VID:PID Device
054C:03D5 PS Move ZCM1
054C:0C5E PS Move ZCM2
  • USB: used only for pairing and configuration - the IMU does not stream over USB.
  • Bluetooth: standard HID report 0x01 after pairing carries all sensor data.

Two IMU half-frames per report. The on-wire axis order is X-Z-Y (a swap to X-Y-Z is required).

Offset Field
0x00 Report ID 0x01
0x01-0x03 Buttons
0x04 Sequence (low nibble)
0x05-0x06 Trigger (frame 1 / frame 2)
0x0C Battery level
0x0D-0x18 Accel X/Z/Y frame 1, then frame 2 (int16)
0x19-0x24 Gyro X/Z/Y frame 1, then frame 2 (int16)
0x26-0x2A Magnetometer X/Z/Y (ZCM1 only, 12-bit signed)

ZCM1 accel/gyro are offset by 0x8000 (subtract before use); ZCM2 uses plain two’s complement. The magnetometer is 12-bit signed, range −2048…+2047, ZCM1 only.

  • Accel: ±3 g; normalize gravity empirically on first connect.
  • Gyro: ±2000 dps; approximately raw / 16.4 dps.
  • Magnetometer: normalize via a min/max sweep - no fixed LSB/µT.

Raw counts plus an approximate scale are fed to fusion, which settles the bias during warm-up.

Pairing (USB feature report 0x05, 23 bytes)

Section titled “Pairing (USB feature report 0x05, 23 bytes)”
  1. Plug in over USB and enumerate HID.
  2. Write the host MAC into feature report 0x05 (6 bytes, the rest zero).
  3. Unplug USB.
  4. Press the PS button - the controller reconnects over Bluetooth using the stored MAC.
  5. The IMU now streams over Bluetooth report 0x01.

Output report 0x06 (LED + rumble, 9 bytes)

Section titled “Output report 0x06 (LED + rumble, 9 bytes)”

Sets the RGB tracking-sphere color (bytes 2-4) and the single rumble motor (byte 6). It must be resent every ~4 s or a firmware watchdog auto-clears it.

A per-controller cal blob split across two blocks (read the report twice), holding accel samples for six tumble orientations and gyro readings at a known rotation rate. Extracting bias/gain needs a nonlinear fit; for tracking, fusion’s rest-bias estimation is used instead, at the cost of a few extra seconds of settle.

  • ZCM2’s magnetometer flag is forced off and the UI hides the mag toggle.
  • The PS button cycles the sphere color; it is not wired to a reset action.
  • ZCM1’s magnetometer gives it a drift-free heading once calibrated, unlike ZCM2.