1. Home
  2. Docs
  3. Jetson Cameras
  4. Multiple cameras on the Jetson Nano
  5. Camarray – Arducam 1MP Stereoscopic Camera Bundle Kit

Camarray – Arducam 1MP Stereoscopic Camera Bundle Kit


​This Arducam stereo camera bundle kit consists of two synched OV9281 global shutter cameras and an Arducam Camarray stereo camera HAT. As a stereo bundle system, it enables simultaneously working dual cameras with a variable baseline for better prototyping and evaluation with a single MIPI CSI camera slot: The two image sensors are on separated camera boards, and you easily move them around for different perspectives while the Camarray HAT handles the rest of the work. This is helpful for proof-of-concept stages when you may want more flexibilities than what a fixed stereo camera module can offer. You will be able to find the optimal baseline for your application with this bundle, and we welcome you to send us product customization requests after that.

What is Camarray

Camarray is a series of embedded stereo cameras and multiple camera solutions from Arducam. Upgraded from Arducam Sync Stereo Camera HAT, the Camarry can disguise up to 4 synched camera modules as a single camera slot connection to embedded systems like the Raspberry Pi, Jetson nano, and Xavier NX. With Arducam camarray, your camera connectivities are no longer limited to the camera connectors on the motherboard or the carrier board. Along with Arducam-provided camera drivers, more flexibility can be added to your multi-camera applications.


1.The Camarray HAT does not support digital pan in half resolution combine and programmable pan speed control.
2.The Camarray HAT is not a crop and a half (halving the horizontal resolution of each camera and halving the field of view) but a compressed half (halving the horizontal resolution of each camera but leaving the field of view unchanged), so it does not need to support scan mode.

Common Specs

Image Sensor

Sensor ModelOV9281
Shutter TypeGlobal Shutter
Active Pixels1280*2×800
Image Sensor FormatType 1/4″
Pixel Size3μm×3μm
Color Filter ArrayNone(Monochrome)
9281block diagam
OV9281 Block Diagram

Lens Assembly

Focus TypeManual Focus
Focusing Range30cm to infinity (when focused to infinity)
Effective Focal Length(EFL)2.8 mm
Field of View(FoV)70° Horizontal
Lens MountM12 Lens
IR SensitivityNo IR filter (sensitive to IR light)
2311stero camera lens 3d


HAT Size65×56 mm
Camera Board Size40×40 mm
UC 512.Rev .C DIM 01

HAT Mechanical Drawing

Mechanical Drawing ov9281
OV9281 Camera Board Mechanical Drawing
Pin No.Pin NameTypeDescription
13V3Power3.3V power supply
2FSINInputFrame Sync Input
3STBOutputLED Strobe Output
53V3Power3.3V power supply
6SDAI/OSCCB serial interface data I/O
7SCLInputSCCB serial interface clock input

Connector & Cable

Camera HAT Connector InterfaceMIPI CSI-2 22-pin 2-lane
Camera Module Connector InterfaceMIPI CSI-2 22-pin 2-lane
Ribbon Cable Length150mm (22-pin), 300mm(15-22pin), 73mm(15-22pin)
Pin #NameDescription
2CAM_D0_NMIPI Data Lane 0 Negative
3CAM_D0_PMIPI Data Lane 0 Positive
5CAM_D1_NMIPI Data Lane 1 Negative
6CAM_D1_PMIPI Data Lane 1 Positive
8CAM_CK_NMIPI Clock Lane Negative
9CAM_CK_PMIPI Clock Lane Positive
11CAM_D2_NMIPI Data Lane 2 Negative
12CAM_D2_PMIPI Data Lane 2 Positive
14CAM_D3_NMIPI Data Lane 3 Negative
15CAM_D3_PMIPI Data Lane 3 Positive
17CAM_IO0Power Enable
18CAM_IO1LED Indicator
22CAM_3V33.3V Power Output

Driver Performance (With Official V4L2 Driver)

Video FormatGERY(8-bit)/Y10P(10-bit)
Output Interface2-lane MIPI serial output
Output Formats8/10-bit BW RAW
Frame Rates[email protected]*4 × 800(on RPi)
[email protected]*4 × 800(on Jetson)

Quick Start Guide


Same operation on Xavier NX. The only difference is the driver package.

Hardware Setup

b0266 02long
b0265r 07 1

Check the Driver

This step is to check if you have other drivers installed. If you are sure that you don’t have other drivers installed, you can skip this step and go to install Arducam V4L2.

1.Driver type

There is three drivers for Jetson:​​

  • Official IMX219 driver
  • Arducam IMX477 driver
  • Arducam V4L2 driver


These three drivers are in conflict with each other and only one of the three options is available.​

1) The Arducam IMX477 driver and Arducam V4L2 driver will automatically overwrite the other drivers and you don’t need to uninstall the other drivers.

2) If you want to use the official IMX219 driver, please type the following command to uninstall Arducam IMX477 driver or Arducam V4L2 driver.

sudo dpkg -r arducam-nvidia-l4t-kernel

3) Installing the Arducam IMX477 driver is the same process as installing the Arducam V4L2 driver, only the driver package (.deb) is different.

The product is driven by the Arducam V4L2.

2.Check your driver

Execute the following command and see if it responds. If there is no response, the corresponding driver is not installed.​​​

#Check if you have installed Official IMX219 driver

dmesg | grep imx219
Check your driver1
For example, no response, you don’t install the official IMX219 driver.

#Check if you have installed Arducam IMX477 driver

dmesg | grep imx477
Check your driver2
For example, no response, you don’t install the Arducam IMX477 driver.

#Check if you have installed Arducam V4L2 driver

dmesg | grep arducam
Check your driver3
For example, it has a response, you installed Arducam V4L2 driver. Failed means you haven’t connected Arducam IMX477 camera or the connection is wrong.

Install Arducam V4L2 Driver

Please go to this page for detailed instruction.

First Use

1.Install V4L2 python module

for Python3.x:

wget https://bootstrap.pypa.io/get-pip.py  
Install V4L2 python module1

After you type the following command and press【Enter】, it will take several minutes to finish downloading.

sudo python3 get-pip.py  
Install V4L2 python module2
Install V4L2 python module3
 sudo pip3 install v4l2 
Install V4L2 python module4


The V4L2 of Python3.x has a known bug that requires a manual fix, and the following error occurs when you import the v4l2 module into Python3.x:

Install V4L2 python module5

You can refer to this link to fix this bug:


2.Download the demo code

git clone https://github.com/ArduCAM/MIPI_Camera.git  
Download the demo code1
Download the demo code2

3.Check whether the camera is detected

ls /dev/video0
Check whether the camera is detected1

4.Check the video format supported

v4l2-ctl --list-formats-ext
Check the video format supported nano b0266

5.Display images in real time

If accessing Jetson via remote software (e.g., MobaXterm), the following command (executed only once) is required to display the image.

export DISPLAY=:0.0

Enter program directory: 

cd Arducam/

OV9281 currently supports the following commands:


python3 arducam_displayer.py -f GREY --width 2560 --height 800 -d 0


python3 arducam_displayer.py -f Y16 --width 2560 --height 800 -d 0

​GREY for RAW8 and Y16 for RAW10.

​-w and -h indicate the width and height of the input image.

–fps means to display the current frames. If you don’t want to display frames, you can remove this command parameter.

For example, execute the following command:

python3 arducam_displayer.py -f GREY --width 2560 --height 800 -d 0
Display images in real time b0266

The command line will refresh the display of frames in real time.

9181 jn1

Press Ctrl+C to exit image display.


Display resolution settings may affect the frames displayed.

Dropped frame?

Select Arducam/arducam_displayer.py, right-click on “open with Text Editor“.

dropped frame1

The circled value below represents the number of column in the display resolution. Try making the value lower if the frame is dropped.

dropped frame2

6.Receive data without displaying the image


v4l2-ctl --set-fmt-video=width=2560,height=800,pixelformat='GREY' --stream-mmap --stream-count=-1 -d /dev/video0


v4l2-ctl --set-fmt-video=width=2560,height=800,pixelformat='Y16 ' --stream-mmap --stream-count=-1 -d /dev/video0
Receive data without displaying the image b0266 nano

7.Adjust exposure

Open two terminals, the first one is for executing the displaying images command, the second one is for executing the adjusting exposure command.

#Adjust exposure:

v4l2-ctl -c exposure=1000

#Check exposure parameters (minimum, maximum, default)

v4l2-ctl -l
Adjust exposure b0267 nano 1

For example, execute the below command in the second terminal:

v4l2-ctl -c exposure=4000
Adjust exposure b0263 nano 1

Turning up the exposure time results in a brighter image and a lower frame rate.

8. Adjust gain

Open two terminals, the first one is for executing the displaying images command, the second one is for executing the adjusting gain command.

#Adjust gain:

v4l2-ctl -c gain=12

#Check exposure parameters (minimum, maximum, default)

v4l2-ctl -l
Adjust gain b0267 nano 1

For example, execute the below command in the second terminal:

v4l2-ctl -c gain=12
Adjust gain b0263 nano1

Turning up the gain results in a brighter image and no change in frame rate.

9.Change frame rate

Type the following command, change the value of “X” to change frame rate.

v4l2-ctl -c frame_rate=X

For example, you want to change the frame rate to 30. First, open two terminals, type the following command in the first terminal:

python3 arducam_displayer.py -f GREY --width 2560 --height 800 -d 0 --fps
Change frame rate b0266 1 nano
The last line shows the current frame rate in real time, and the RAW8 configuration defaults to 58fps.

Type the following command in the second terminal to change frame rate:

v4l2-ctl -c frame_rate=30
Change frame rate b0266 2 nano
The frame rate changes to 30fps.

Type the following command in the second terminal to view the frame rate range of the current display mode:

v4l2-ctl -l
Change frame rate b0266 3 nano
You can change the frame rate from 5fps to 80fps. If the set frame rate exceeds the maximum value, it will work according to the maximum value. The same goes for the minimum value.

Dropped frames may exist due to the platform performance.

You can test the actual input frames by only receiving data without displaying the image.

The frame rate values here are not real-time and are calculated iteratively with historical values, changing slowly.

IMPORTANT NOTE b0266 nano 1

Display the Image via VLC Media Player


The VLC can only play images exported in RAW8 format.

Install VLC media player:

sudo apt-get install vlc

Open VLC media player:

VLC media player

1.Display the image

Press Ctrl+C


Video device name】→ select “/dev/video0“→ click 【Play】.


2.Adjust exposuregain, and frame rate

Press Ctrl+E, drag the sliders at “Exposure“, “Gain” and “Frame_rate” to make adjustments under the “v4l2 control” tab.

Adjust exposure gain and frame rate b0264 nano

Display the Image via Mplayer

1.Install mplayer

sudo apt-get install mplayer

2.Display images

mplayer tv:// -tv driver=v4l2:device=/dev/video0

Do not enter this command remotely, otherwise it will be stuck.

nano mplayer b0267

Or enter the following command to zoom the image. 

mplayer tv:// -tv driver=v4l2:device=/dev/video0 -zoom -x 1280 -y 400

“-x” “- y” denotes the width and height of the scaled image, and it is recommended to modify them in equal proportion.

mplayer dual pic

What’s Next

Here are the things you can do after this quick start:

  • Check the Application Note for applications like using Arducam userland MIPI camera drivers.
  • Join the discussion in our forum.

Application Note

Use with Arducam USB3.0 32b Camera Shield


Please strictly follow the installation and operation order below, otherwise errors will occur!

1.Download File here.

2.Connect the camera module to the HAT then connect HAT to the USB Camera Shield in the case of a total power failure.

3.Power the HAT through micro USB port,then power the USB Camera Shield.

4.Run USBTest

USB test

5.Scan and select the camera device number

scan and select device0

6.Select CfgFile


7.Click 【load】- Click【open】

8.Power down the HAT then power the HAT.


b0266 usb camera shield

Using on OpenCV

Make sure you have checked the driver and installed the driver.

Download the file here.

import numpy as np
import cv2
import time
def fourcc(a, b, c, d):
    return ord(a) | (ord(b) << 8) | (ord(c) << 16) | (ord(d) << 24)

def pixelformat(string):
    if len(string) != 3 and len(string) != 4:
        msg = "{} is not a pixel format".format(string)
        raise argparse.ArgumentTypeError(msg)
    if len(string) == 3:
        return fourcc(string[0], string[1], string[2], ' ')
        return fourcc(string[0], string[1], string[2], string[3])
cap = cv2.VideoCapture(0,cv2.CAP_V4L2)
cap.set(cv2.CAP_PROP_FOURCC, pixelformat("GREY"))
now = time.time()
    if time.time() - now > 1:
        now = time.time()
        frame_num = frame_num+1
    # Capture frame-by-frame
    ret, frame = cap.read()
    # Display the resulting frame
    if cv2.waitKey(1) & 0xFF == ord('q'):
# When everything done, release the capture

Then type the following command:

sudo python ov9281_dulcam_opencv_raw8.py

Was this article helpful to you? Yes No