At last a Playstation camera that does not require soldering custom cables – comes with USB 3.0!
Short version, I’ll add more details later:
Generally once you attach the camera to the USB you should see it in lsusb:
And you should see it being recognized in dmesg:
[140510.278954] usb 6-1: new SuperSpeed USB device number 2 using xhci_hcd [140510.292048] usb 6-1: New USB device found, idVendor=05a9, idProduct=0580, bcdDevice= 1.00 [140510.292058] usb 6-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [140510.292062] usb 6-1: Product: USB Boot [140510.292064] usb 6-1: Manufacturer: OmniVision Technologies, Inc.
Check first if you are in the plugdev group as the user and can interface USB devices:
groups | grep plugdev
If not – add yourself to it
todo
You will need two repositories, one with custom firmware file for UVC
mkdir ps5 && cd ps5 git clone https://github.com/Hackinside/PS5_camera_files git clone https://github.com/raleighlittles/PS5-Camera-Firmware-Loader
(as root) Load the udev file
cd ps5/PS5-Camera-Firmware-Loader cp 100-playstation-camera.rules /etc/udev/rules.d/
it contains a single line:
SUBSYSTEM=="usb", ATTRS{idVendor}=="05a9", ATTRS{idProduct}=="0580", GROUP="plugdev", MODE="0660"
(as root) Reload the udev – be warned, this WILL reload everything, be careful, or just restart the machine if you feel nostalgic of Windows 95 era:
udevadm control --reload ; udevadm trigger
Make the loader:
cd ps5/PS5-Camera-Firmware-Loader cmake CMakeLists.txt make ./ps5_camera_firmware_loader ../PS5_camera_files/firmware.bin
I made a short script to load it and placed it in ps5 directory:
echo "./PS5-Camera-Firmware-Loader/ps5_camera_firmware_loader PS5_camera_files/firmware.bin " > ps5/start.sh chmod +x ps5/start.sh
I always get a small error, but everything works either way:
[ 0.495743] [0000782d] libusb: debug [libusb_free_transfer] transfer 0x2170a68 ERROR: libusb reported error during control transfer, error# = -4 Finished uploading firmware!
dmesg should now read:
[140844.373051] usb 6-1: USB disconnect, device number 2 [140844.958867] usb 6-1: new SuperSpeed USB device number 3 using xhci_hcd [140844.977794] usb 6-1: New USB device found, idVendor=05a9, idProduct=058c, bcdDevice= 1.00 [140844.977803] usb 6-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [140844.977807] usb 6-1: Product: USB Camera-OV580 [140844.977810] usb 6-1: Manufacturer: Omnivision Technologies, Inc. [140844.985814] usb 6-1: Found UVC 1.00 device USB Camera-OV580 (05a9:058c)
You can now interface the camera using simple V4L2 commands and opencv. I’ve got a laptop, so the webcam occupies first /dev/video0, and the ps5 camera loads as /dev/video2:
bash-5.1$ v4l2-ctl -d /dev/video2 --list-formats-ext ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: 'YUYV' (YUYV 4:2:2) Size: Discrete 896x256 Interval: Discrete 0.008s (120.000 fps) Size: Discrete 1920x1080 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.125s (8.000 fps) Size: Discrete 960x520 Interval: Discrete 0.017s (60.000 fps) Size: Discrete 448x256 Interval: Discrete 0.008s (120.000 fps) Size: Discrete 1280x800 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.125s (8.000 fps) Size: Discrete 640x376 Interval: Discrete 0.008s (120.000 fps) Size: Discrete 320x184 Interval: Discrete 0.004s (240.004 fps) Size: Discrete 5148x1088 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.125s (8.000 fps) Size: Discrete 3840x1080 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.125s (8.000 fps) Size: Discrete 1920x520 Interval: Discrete 0.017s (60.000 fps) Size: Discrete 2560x800 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.125s (8.000 fps) Size: Discrete 1280x376 Interval: Discrete 0.008s (120.000 fps) Size: Discrete 640x184 Interval: Discrete 0.004s (240.004 fps)
You can also check what controls can you modify (abridged):
bash-5.1$ v4l2-ctl -d /dev/video2 --all Driver Info: Driver name : uvcvideo Card type : USB Camera-OV580: USB Camera-OV Bus info : usb-0000:07:00.4-2 ... ... ... brightness 0x00980900 (int) : min=0 max=8 step=1 default=4 value=4 contrast 0x00980901 (int) : min=0 max=8 step=1 default=4 value=4 saturation 0x00980902 (int) : min=0 max=8 step=1 default=4 value=3 hue 0x00980903 (int) : min=0 max=11 step=1 default=0 value=0 white_balance_temperature_auto 0x0098090c (bool) : default=1 value=1 gain 0x00980913 (int) : min=0 max=8 step=1 default=4 value=4 power_line_frequency 0x00980918 (menu) : min=0 max=2 default=1 value=0 0: Disabled 1: 50 Hz 2: 60 Hz white_balance_temperature 0x0098091a (int) : min=2800 max=6500 step=100 default=4600 value=4600 flags=inactive sharpness 0x0098091b (int) : min=0 max=8 step=1 default=4 value=4 exposure_auto 0x009a0901 (menu) : min=0 max=3 default=2 value=2 0: Auto Mode 2: Shutter Priority Mode exposure_absolute 0x009a0902 (int) : min=1 max=5000 step=1 default=1000 value=1000 flags=inactive
WARNING: testing this camera in OBS sometimes requires a restart of OBS (or two) for it to launch properly, but opencv works perfect every times
Time for python!
Install opencv and try the camera:
import cv2 cap = cv2.VideoCapture(2,cv2.CAP_V4L2) # Check if the webcam is opened correctly if not cap.isOpened(): raise IOError("Cannot open webcam") cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280); cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 376); cap.set(cv2.CAP_PROP_FPS, 120); print("Checking mode:", cap.get(cv2.CAP_PROP_FRAME_WIDTH), cap.get(cv2.CAP_PROP_FRAME_HEIGHT), cap.get(cv2.CAP_PROP_FPS) ) import subprocess subprocess.check_call("v4l2-ctl -d /dev/video2 -c exposure_absolute=300",shell=True) subprocess.check_call("v4l2-ctl -d /dev/video2 -c saturation=3",shell=True) while True: ret, frame = cap.read() cv2.imshow('Input', frame) c = cv2.waitKey(1) if c == 27: break cap.release() cv2.destroyAllWindows()
As you can see – I set the exposure (because the ps5 by default can be very dark on linux, a small bug) and saturation for colors.
Of course better view is:
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 2*1280); cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 800); cap.set(cv2.CAP_PROP_FPS, 60);
(as root) For docker containers – for now I just am allowing everybody to use it, but groups modification should be a better option:
chmod +x /dev/video2