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.
Hardware
Section titled “Hardware”| 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).
Identification (VID:PID)
Section titled “Identification (VID:PID)”| VID:PID | Device |
|---|---|
054C:03D5 |
PS Move ZCM1 |
054C:0C5E |
PS Move ZCM2 |
Transport
Section titled “Transport”- USB: used only for pairing and configuration - the IMU does not stream over USB.
- Bluetooth: standard HID report
0x01after pairing carries all sensor data.
Input report 0x01 (ZCM1, ~49 bytes)
Section titled “Input report 0x01 (ZCM1, ~49 bytes)”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.4dps. - 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)”- Plug in over USB and enumerate HID.
- Write the host MAC into feature report
0x05(6 bytes, the rest zero). - Unplug USB.
- Press the PS button - the controller reconnects over Bluetooth using the stored MAC.
- 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.
Calibration data (feature report 0x10)
Section titled “Calibration data (feature report 0x10)”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.
Quirks
Section titled “Quirks”- 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.